物联网开发之MQTT协议的使用(百度云)+ESP8266测试上传数据和回调信息

一、物联网开发的思考
(一)物联网有什么用?
物联网简称IOT,我们这个社会已经进入到万物互联的时代。一切事物都是普遍联系的,这个哲学的基本概念已经从理论时代进入了现实时代。达到航天科技,小到芯片应用。几乎没有谁不在享受着物联网带给我们的生活便利。很多人可能不以为然,但是确实是这样,比如我们的智能电表,现在大部分小区住户交水费已经实现了足不出户,从原有的人工抄表到刷卡充值模式,到现在的手机直接线上支付,这是最实实在在的物联网应用实例。
(二)物联网开发需要具备什么技能?
虽然物联网属于新兴事物,但不等于物联网就是高不可攀,只能在实验室或者高级科研院所才能接触或者为我所用。只要我们学过计算机编程、对单片机、云存储等有一些基本的了解以后,你就已经具备了开始物联网开发的最基本条件(当然,如果是这方面的小白,建议先学好基本知识)。
二、云平台的选择
前面已经提到了物联网开发需要云存储,而云存储就需要一个云平台。也就是一个能实现数据交互的服务器(个人理解成服务器,可能并不专业,但实际也就是这类东西)。当然,如果你是一个计算机高手或者有经历学习使用如何假设服务的科研工作者,自己建设一个这样的平台也未尝不可,但是比较费精力。
网上的云平台很多,我了解的主要有以下几个:
(一)阿里云:这个平台资格老,技术先建没的说,唯一的缺点就是免费资源少,基本注册以后,使用里面的数据交换等都需要收费了(本人暂时没有用,但是把MQTT协议的交互信息测试调通了,随后附上)。
(二)百度云:总体还不错,至少每月有100万条数据的免费信息可用。100万看起来不少,基本够测试使用,但是真正要长期使用作为商业化目的,就要交一点点费用了。
(三)ONENET:移动物联网平台,这个平台数据侧暂时没有传输限制,但是提供的功能也不是太多,简单易学,初选者可以推荐使用。
(四)其他云,这里就很多了,比如机智云、巴法云等等,有精力的也可以尝试,但是毕竟都是中小企业提供的云资源平台,什么时候变成收费的或者关闭掉就不得而知了。
因此,这里我重点说说亲测的百度云天工的MQTT协议测试。
三、百度智能云(云天工)的亲测
测试之前先说明一下MQTT协议。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。当然,这两句是网上的原话,个人理解,MQTT协议是一种轻量级的TCP/IP协议,能够很好的实现数据的传输、控制。唯一要关注的是它需要订制主题,实现订阅、发布。如果正式编程时,需要我们编写publish(发布/上传)函数信息和recall(订阅/回调)函数信息,进而实现信息通畅。
百度云天工网址:https://cloud.baidu.com 。
首先需要登陆、注册并实名制。这些是必须的,否则无法实现添加物联设备功能。具体这几步就不多说了,没什么特殊的操作,按提示来就行了。
其次,创建“物设备”.
如下图:
在这里插入图片描述
由于百度提供的服务能力很多,找起来不要弄错了。
一个用户(这里指免费用户)在云天工里只可创建唯一一个物模型,不过正常开发测试也足够了,一个物模型能够实现10000台设备连接。
在这里插入图片描述
地域是默认的,我们也不需要选择。项目类型有两种,对于我们需要测试开发的人来说,就选择第二个“数据型”,这种类型我们可以自定义TOPIC(主题),开发起来也自由些。
创建好后是这样的:
在这里插入图片描述
TCP这个网址和端口是我们需要记下来的。网址就是我们MQTT需要访问登陆的网址,1883是方位的端口号,我们使用MQTT协议,TCP模式。
然后我们点击项目名称进入创建用户名阶段:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
秘钥和主题是我们需要记住的,后面测试时还要使用。
创建完成后我们可以尝试测试连接:
在这里插入图片描述
进入测试界面后,身份秘钥就是上面要复制保存的秘钥,其他可以不填
在这里插入图片描述
当点击连接(connect)时,会显示绿色灯,运行中。说明一切正常。
这时,我们下载一个MQTT.FX的测试客户端软件(百度搜索下载即可,免费的).打开后,点击配置按钮(一个小齿轮图标).按照下图模式进行配置即可。
说明:
Broker Address就是我们上面保存的访问地址。
Broker PORT:1883
cLIent ID:是点右面的Generate自动生成的,这个点一下生成一个新的,百度云天工没有使用此功能,如果是阿里云的话,需要这个功能来生成password。
USER NAME:是固定的
PASSWORD:是刚才我们保存的秘钥。
在这里插入图片描述
连接成功后(自动软件右上角有个绿色的灯),我们就可以通过订阅主题进行数据交互了.
四、ESP8266连接测试
先说实现代码

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char *ssid = "ChinaNet-HXJQ"; //wifi账号
const char *password = "********";//wifi密码
const char *mqtt_server = "xxx5sax.mqtt.iot.gz.baidubce.com";                                // 使用的信息中转服务
const char *subTopic = "DEVICE_TEST"; // 订阅信息主题
const char *pubTopic = "DEVICE_TEST";
const char *client_id = "123456"; // 标识当前设备的客户端编号
const char *mqtt_username = "xxx5sax/jm_user";
const char *mqtt_password = "*************";

WiFiClient espClient;           // 定义wifiClient实例
PubSubClient mqttclient(espClient); // 定义PubSubClient的实例
long lastMsg = 0;               // 记录上一次发送信息的时长

void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  Serial.println();
  Serial.println(String(length));
  for (int i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup()
{
  //pinMode(0, OUTPUT); // 定义板载LED灯为输出方式
  Serial.begin(115200);
  setup_wifi();                        //执行Wifi初始化,下文有具体描述
  mqttclient.setServer(mqtt_server, 1883); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
  mqttclient.setCallback(callback);        //设定回调方式,当ESP8266收到订阅消息时会调用此方法
  delay(1500);
}

void setup_wifi()
{
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect()
{
  while (!mqttclient.connected())
  {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqttclient.connect(client_id, mqtt_username, mqtt_password))
    {
      Serial.println("connected");
    
      if (mqttclient.subscribe(subTopic, 1))
      {
        Serial.println("subscribe success");
      }
      else
      {
        Serial.println("subscribe fail");
      }
    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(mqttclient.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
//int pubi=10;
void loop()
{
  if (!mqttclient.connected())
  {
    reconnect();
  }
  mqttclient.loop();
  
  /*digitalWrite(0, HIGH);
  delay(1000);
  digitalWrite(0, LOW);
  delay(1000);*/
  long now = millis();
    if (now - lastMsg > 2000) {
      lastMsg = now;
      //char* ch=(char*)pubi;
      //Serial.println(ch);
     mqttclient.publish(pubTopic,"test_UP");
     //pubi++;
     }
}

整体代码都比较简单,重点是回调函数和publish函数。
实现的结果如下:
这个是使用Arduin IDE测试的串口显示数据
在这里插入图片描述
再看看这个,下面是百度云天工界面监控到的数据信息.
在这里插入图片描述
五、几点感受
(一)百度云数据经典的连接,哪一步不对,可以直接查看下填写是否有误,很容易找出问题所在
(二)阿里云的MQTT连接与这个基本都是一样的,唯一的区别就是密码生成方式有点特殊(可能为了保密需要),这个谁有需要可以单独联系我。
(三)关于测试使用ESP8266连接云天工,有兴趣的可以一起交流下。
(四)这里没有做数据可视化界面,后面可以考虑做一个试试。

发布了11 篇原创文章 · 获赞 16 · 访问量 2066

猜你喜欢

转载自blog.csdn.net/qxrobot/article/details/103944636