不好意思,隔的时间有点久~~~
上一节讲了MQTT协议的工作原理,简单来说,就跟关注微信公众号是一个道理,你关注了“单片机爱好者”这个公众号,你就能直接收到它的信息。同理,你订阅了这个服务里的某个主题A,那么当A发布消息时,你就能收到A的信息。反之,如果你没订阅,即便服务器发布了这个主题的信息,那么你也收不到。
这一节说一下主题订阅。其实内容是比较简单的,SDK里面已经提供了相关的代码,但演示起来需要几个工具配合一下。
我们需要某个设备来发送8266订阅的某个主题的信息,然后让8266接收到;这还不够,还要发布一个8266没有订阅的主题信息,确定8266收不到,这样才算工作正常。因此,我们需要一个工具来模拟成一个设备,可以向服务器发布主题信息。这里用到的是:MQTT.fx。我稍后会跟代码一起放出来。
首先要登陆ONENET网站,在上一节的产品中,再添加一个设备,如图所示:
device_B是上一节使用的设备,device_A是这一节要一起使用的。
然后是MQTT工具,这个工具需要安装一下,很简单,一路NEXT点下去就行。安装好之后打开,如下所示:
点击上图所示,齿轮的那个位置。打开如下所示:
如上图所示,打开的是某个MQTT连接的参数页面。我们需要建立一个新的参数页面,把device_A的相关参数填进去。然后运行软件,使软件模拟device_A在工作。点击上图中的“ ”号,创建一个新的页面,如下所示:
参数设置如上所示,Profile Name是这个参数页面的名字,我这里把device ID放在后缀,方便识别。下面Profile Type默认选MQTT Broker。再下面是IP和端口号,和上一节一样,不解释。
然后是client_id,这里填入device_A的设备ID:532710540
下面点击:User Credentials,填入产品ID和Master-APIkey,最后点击右下角的 Apply。然后关掉当前页面,在主页面选择刚刚创建的参数页,然后点击连接,如下图所示:
如果没有问题,Connect右侧的黑色圆点,会变成绿色,表明连接成功,同时ONENET网站上,设备device_A显示在线。
最后在上一节的程序基础上,做一些简单的修改。找到user_main.c文件中的mqttConnectedCb函数,注释掉一部分内容,让它只订阅主题"/mqtt/topic/0",如下所示:
函数MQTT_Subscribe表示订阅主题,函数MQTT_Publish表示发布某个主题的消息。咱们这里只订阅一个主题,其它内容不动。
程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这时,device_A和device_B都会在线。这时先看串口助手,输出信息如下所示:
如图所示,ESP8266在接入服务器的时候,打印出了这样的信息:MQTT: queue subscribe, topic"/mqtt/topic/0", id: 1
说明它已经订阅了"/mqtt/topic/0"这个主题。这时,使用MQTT工具,在该主题下发送信息:
如图所示,位置1输入主题名称"/mqtt/topic/0",位置2输入要发送的信息,位置3为发送按钮,按下后,可以看到串口助手打印了如下信息:
如图所示,显示8266收到了软件工具发来的信息。在软件中修改主题名称为“/mqtt/topic/1”,发送消息:new topic!
你会发现,无论如何发送,8266都不会收到。如此,说明ESP8266使用MQTT协议工作正常。
至此,基于MQTT协议的基础通信已经完成了。内容相对来说还是比较简单的,只要有一定基础的人,按照文章操作,基本都没问题。后面,会聊聊TCP连接下的POST操作,说白了就是如何把ESP8266采集到的数据上传到物联网平台。
注意事项,工程代码下载之后,可以直接使用,但是要改成你的设备信息,不要用我的。
MQTT工具链接:
https://pan.baidu.com/s/1VR3MnTCJWGlz1BWvGOqtow
提取码:n7bu
代码链接:
https://pan.baidu.com/s/17AMAG6mRrv4JtFFl2cRtcA
提取码:0yzz