材料:
- 51单片机
- ESP8266-01S
- ESP LINK烧写器(USB-TTL也可以)
- 杜邦线若干
MQTT简述:
MQTT是基于发布/订阅范式的消息协议。你发布了一个Topic,只要别人订阅了这个Topic,那么他就能收到信息。同样你要收到别人发布的消息,首先你要订阅别人。。假如说好几个人都订阅了一个Topic,那么这几个人都将收到信息。
MQTT的14种报文:
具体报文格式请参考设备终端接入协议-MQTT,仔阅读你可以从中发现每一个字节所代表的含义。
ESP8266刷AT指令:
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.实例图:
设备连接OneNet:
说明:了解报文的话可直接跳到第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。