MQTT是基于发布/订阅范式的消息协议。你发布了一个Topic,只要别人订阅了这个Topic,那么他就能收到信息。同样你要收到别人发布的消息,首先你要订阅别人。(就好比抖音你关注了某个人,当这个人发布视频的时候,系统就会通知你)。假如说好几个人都订阅了一个Topic,那么这几个人都将收到信息。
MQTT的14种报文:
具体报文格式请参考设备终端接入协议-MQTT,仔阅读你可以从中发现每一个字节所代表的含义。
AT指令集下载,选择ESP8266 Non-os SDK AT指令集合。
将ESP8266插入ESP LINK烧写器,并将烧写器插在电脑上。
初始波特率为115200,选择115200打开串口。
勾选发送新行,HEX发送不勾选。
发送AT
,返回OK,表明指令运行正常。
ESP8266有三种工作模式:
SoftAP模式(相当于热点或者路由器,用手机可以连接) Station模式(客户端模式,用来连接服务端的模式) Station+SoftAP模式(以上两种共存)设置为 Station+SoftAP模式并保存到Flash中(下次上电不用在设置),发送AT+CWMODE_DEF=3
,返回ok。
连接WIFI,并保存到Flash中,发送AT+CWJAP_DEF="TP-LINK_1696","123456789"
,返回WIFI CONNECTED
WIFI GOT IP
OK,此时,已经连接上你家的路由器。
连接远程服务器并保存到Flash,发送AT+SAVETRANSLINK=1,"183.230.40.39",6002,"TCP"
,返回ok,此时已经连接上OneNet的MQTT服务器,并且开启开机透传模式。
完成以上步骤只要ESP8266上电就会连接上该路由器和OneNet的MQTT服务器。
10.实例图:
说明:了解报文的话可直接跳到第21条。
发送 CONNECT报文进行连接,选择选择HEX发送,我的设备报文如下,每个产品ID,Master-Apikey,设备ID不同所以报文不同。
10 3B 00 04 4D 51 54 54 04 C2 00 78 00 09 35 33 36 35 32 33 34 30 37 00 06 32 36 32 36 38 35 00 1C 48 45 34 4C 43 73 49 73 59 78 46 37 57 6B 44 50 54 54 54 34 75 61 37 69 73 66 77 3D
第1个字节10
,二进制形式为00010000
高4位代表MQTT Packet Type,也就是值为1的报文,查上面的报文表你会发现这是CONNECT报文,
第2个字节3B
表示 remainedLength也就是后面的信息还有多长,3B
转化成十进制为59,不信你可以数一数,3B
之后确实是59个字节。
第3-4字节代表所使用的协议名字的长度,00 04
也就是占用4个字节。
那么后面的四个字节4D 51 54 54
就是协议的名字了,查一下ASCII码表,你会发现0x4D对应的字母就是M,四个字节对应的单词就是MQTT,也就是我们所使用的协议。
第9个字节04
代表该协议的版本号是4.
第10个自己字节C2
代表userFlag=1 passwordFlag=1 willFlag=0 willRetainFlag=0 willQosFlag=0 clenSessionFlag=1 clenSessionFlag=0
详情请查看上面的连接文档。
第11-12字节00 78
装化成十进制就是120,意思就是 keepAlive=120,也就是每隔120s保活一次。不然你的设备会掉线。
第13-14字节00 09
代表你后面的设备ID占用9个字节。
那么接下来的9个字节就是我的设备ID了,这里就不翻译出来了。
第24-25字节00 06
代表后面你的产品ID占用6个字节。
显然这后面6个字节就是产品ID。
在后面两个字节00 1C
代表Master-Apikey长度,也就是28个字节。
后面的28个字节就是Master-Apikey,我做了更改(哈哈)。总共61个字节。
发送这个报文,之后你就会看到OneNet平台上相应的设备已经在线。
订阅一个名字为Topic1的TOPIC,发送82 0B 00 02 00 06 54 6F 70 69 63 31 00
可以自行进行解释。
发布一个名字为Topic2,内容为1的TOPIC,发送30 09 00 06 54 6F 70 69 63 32 31
可以自行解释。
保活,发送C0 00
,意思就是客户端发送PING(连接保活)命令。
此时,你可以用模拟器发布或订阅测试一下,串口会收到相应的信息。或者使用平台下发命令。
报文这么难搞,太费劲,可以去这里下载Mqtt-device,可以自动生成相应的报文。实例图:
此时,逻辑上已经完工了,51单片机和esp8266使用串口进行通信,51在编写程序的时候只需要把报文写死就可以了,需要动态更改的报文可以按照报文格式拼接成一个报文。这样就能发布消息了;加个中断程序可以实现从ESP8266中读取消息。这样就能实现双向通信了。除此之外,要有一个定时器,到一定时间需要保活一下(keepalive),不然设备就掉线了。
会使用SDK开发的推荐使用官方的MQTT_SDK。
下次写博客提供51程序,一样可以使用上个博客提供的Android应用控制51,需要做发布和订阅更改。
注:当前波特率为115200,当使用单片机的时候波特率要和单片机一致。可以用AT指令调节ESP8266的波特率。例如:AT+UART=9600,8,1,0,0
,将波特率改为9600。