(二)AT 指令开发MQTT TCP-MQTT的转化-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9039|回复: 3

(二)AT 指令开发MQTT TCP--MQTT的转化

[复制链接]
发表于 2018-11-27 19:17 | 显示全部楼层 |阅读模式
本帖最后由 jiangzhiwei 于 2019-10-16 23:07 编辑

  在上一篇对mqtt简单的认识了之后,这一篇我讲解一下TCP-MQTT的转化过程

首先 感谢以下 几篇文章    大家可以参考:我也算是从这几个之中搬运的了~~
https://blog.csdn.net/libaineu2004/article/details/78773610


https://www.cnblogs.com/hbzzm/p/5813070.html


https://www.cnblogs.com/yangfengwu/p/9124299.html
(注: 近期学业繁忙
本帖暂时停止维护,如有问题恕不能回复,望谅解)


好了,接下来我来综合一下我所知道的~

上一篇我们讲到  MQTT是基于TCP之上开发的,所以在了解MQTT之前  先了解TCP协议~~

接下来讲解一下建立过程

在TCP连接建立之后,我们8266也就是作为一个TCP客户端,去连接了MQTT服务端,需要及时的发送第一条数据段,如下
10 35 00 06 4d 51 49 73 64 70 03 c2 01 2c 00 0f 38 36 31 36 39 34 30 33 30 31 34 32 34 37 33 00  0c 6c 69 62 61 69 6e 65 75 32 30 30 34 00 08 31  32 33 34 35 36 37 38

(以16进制发送)

0x10 -----------代表固定开头    就像起始位一样,他就是这么定义的

(这里0x10就是数据段的第一个数10     0x是16进制,后面一样,这个就不多解释了)
0x35 ----------------代表数据的长度 ,转化为10进制是53,就是说在你后面总共有53个字节的数据,不包括他自己,也就是说包括加上开头,从头到尾一共是53+2=55个字节的数据~~~这里只要算他之后的长度行了
(不知道16进制怎么转10进制的的进这个网址自己转化  http://tool.oschina.net/hexconvert/


0x00 0x06 --------这是一组数据 这两个合起来看就是一个数字6,代表协议的名称 MQIsdp
6个字符的数据长度

0x4d 0x51  0x49  0x73  0x64  0x70  -------在之后的6个数据,里这六位就代表'M','Q','I','s','d','p'
注意,是字符  ‘M’的ASCI码的16进制就是0x4d,后面的一样~



0x03   -----------------等于10进制的3    代表的是版本号是3 版本



0xc2 -----------------------连接标志位  反正记得在输完前面的之后  这里加个这个就行,就当做是固定的协议吧,他还有其他的标志位 如0xc6   这个我还没查到代表的啥~~所以、、就不多说了就先用0xc2吧。
0x01  0x2c----------------这两个也是一组数据,代表的是保活时间(KeepAlive)

不妨用转换来转换一下这两个,
[ZCZ)J@QLPS6Z$OO0TU%KR7.png

看到是等于300,也就是说300s里需要发送心跳包去确认连接是否存在,否则会断开连接。这个是自己设定的,你可以设60    ,那输入的就是0x00 0x3c,记住一定要是2个数据段!!这代表的就是60。

0x00  0x0f -------------也是一组的看(2个数据)10进制的15,代表的是你作为客户端的ID长度,


ID是自己设置的,自己设置多少,这里就写id的长度。这里是15个长度。


.38 36 31 36 39 34 30 33 30 31 34 32 34 37 33   后面的这个15个数据就代表的你的ID名称

’8‘ '6' '1' '6'  '9'  '4'  '0'  '3'   '0'   '1'   '4'   '2'   '4'  '7'    '3'   十六进制数


0x00  0x0c  -----------十进制12    代表服务器用户名长度,同上面一样,自行设置


6c 69 62 61 69 6e 65 75 32 30 30 34  ---这里12位就是对应的用户名啦
'l'    'i'  'b'  'a' 'i'  'n' 'e'   'u'   '2'   '0' '0'   '4'   





0x00   0x08 --------十进制 8    代表服务器密码长度  同上   自行设置


31 32 33 34 35 36 37 38   --------这里8位数就是密码了    到这里就结束了~

'1'  '2'  '3' '4'  '5' '6' '7' '8'


-------------------------------------------------------------------------------------------------------------
以上就是MQTT的协议的连接了


当你用TCP客户端发送以上数据后,就会收到  服务端的回应
20 02 00 00     这就说明你成功连接上了!!!





接下来就是订阅主题消息和发布主题消息   
其实理解了连接,订阅和发布就很好理解了,
///////////////////////////////////////////////////////////////
订阅主题为"r"的消息   Qos==0;
开头0x82     
消息长度0x06   
消息识别 0x00  0x01(1)  
主题长度  0x00  0x01
主题名'r'  0x72      
Qos  0x00
连起来就是  82 06 00 01 00 01 72 00
///////////////////////////////////////////////////////////////////////////////////
取消订阅主题"r"
数据头 0xa2
数据长度 0x05
消息识别 0x00 0x02  (2)
主题长度 0x01 0x01 (1)
主题“r” 0x72

连起来就是 a2 05 00 02 00 01 72




///////////////////////////////////////////////////////////////////////////////////
发布主题为"r"的消息   Qos==0   内容是“Hello word!”;
开头0x30
(0x30=0010 0000(二进制)
    0011-------消息类型(3)发布消息
     ....0..  ------DUP标志
      .......00.  --------Qos的等级 0
       ...........0    ----------retain :不设置
    这里我们只要知道带颜色的这两个就行了。其他的不深究了~~

     )

消息长度0x0f
主题长度  0x00  0x01
主题名'r'  0x72      
消息内容 "(这里就是Hello word! 的每个字符的16进制数了)"

连起来  就是  
30 0f 00 01 72 68 65 6c 6c 6f 20 77 6f 6c 64 21
///////////////////////////////////////////////////////////////////////////////////






客户端关闭
e0 00


心跳包(每隔一段时间就需要发送的保活心跳包)
c0 00



理解了上面的,我们就可以用AT指令去开发MQTT了
所以用AT指令去开发,MQTT,需要做的,就是先建立TCP客户端连接,在保证能与服务端通信的情况下,按照上面的格式,去发送数据,就可以实现MQTT通信了。




下一篇我会贴具体的代码。~~另外有问题可以联系我~
第三篇
https://www.arduino.cn/thread-83047-1-1.html




 楼主| 发表于 2018-11-27 19:22 | 显示全部楼层
不知道为啥连接放不上去,只能用文本形式了,,~~
发表于 2019-1-29 16:26 | 显示全部楼层
楼主对协议理解的很透彻!牛!
发表于 2020-3-15 16:59 | 显示全部楼层
赞 看了收获特别大
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 08:41 , Processed in 0.167445 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表