51单片机通过MQTT协议连接OneNet实现发布/订阅(上)

Nafisa ·
更新时间:2024-11-15
· 858 次阅读

材料: 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。


作者:小魏先生



onenet 51单片机 mqtt 单片机

需要 登录 后方可回复, 如果你还没有账号请 注册新账号