STM32物联网实战教程(四)—MQTT协议Connect控制报文

Author:果果小师弟 电子信息专业在读研究生
有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!
CSDN@果果小师弟,CSDN首发,果果原创
个人主页的地址为:👉智果芯个人站👈

1.CONNECT控制报文主要由三部分组成:固定报头、可变报头、有效载荷。

2.假设我们得到了固定报头是“liuyao”、可变报头是“zhuxiaoya”、有效载荷是“iloveyou”。我们要把这些字母转换成对应的16进制。然后再把它们串联起起来就得到。

1.固定报头

  固定报头包含两个字节,第一个字节是固定的:0x10,第二个字节是是剩余长度字段,剩余长度等于可变报头的长度(10字节)加上有效载荷的长度。

1.1最终固定报头

  综上我们可得固定报头为:10 ??(??我们在后面的实验会提到,先不着急)

2.可变报头

2.1协议名

2.2协议级别

2.3连接标志

2.4保持连接

2.5总结

2.6最终可变报头

  综上我们可得有效报头为: 00 04 4D 51 54 54 04 C2 00 64

3.有效载荷

  有效载荷由三部分组成:客服端标识符、用户名、密码组成。

3.1原始数据

我们在阿里云物联网平台上创建一个设备后,会得下面这三个数据,这三个数据非常重要。

{ 
	"ProductKey": "a10zwkUxQUS",
	"DeviceName": "LY-1",
	"DeviceSecret": "d8b9915513b05d4de32fbed04566edd8" 
}

阿里云服务器地址(华东2) : *.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883

客户端ID : *|securemode=3,signmethod=hmacsha1|       
用户名 :    *&#                                  
密码 :      clientId*deviceName*productKey#
我们知道 *代表设备名称,#代表ProductKey
3.2加工后的数据
服务器地址:a10zwkUxQUS.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883
客户端ID : LY-1|securemode=3,signmethod=hmacsha1| 
用户名 :LY-1&a10zwkUxQUS
密码:clientIdLY-1deviceNameLY-1productKeya10zwkUxQUS
经过哈希加密:7a03368e740ff9efb8318c6ba2a0260f2a596f87

哈希加密在线计算网站:http://encode.chahuo.com/
 之后要将客服端ID、用户名、经过哈希加密后的密码转换成16进制

客户端ID    :LY-1|securemode=3,signmethod=hmacsha1| 
用户名      :LY-1&a10zwkUxQUS
经过哈希加密 :7a03368e740ff9efb8318c6ba2a0260f2a596f87
3.3转换成16进制
客户端ID:LY-1|securemode=3,signmethod=hmacsha1| 转换为(16进制)4C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73
69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C      一共38个字节就是0x26
最终结果:把00 26加到最前面
00 26 4C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C
73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C

用户名:LY-1&a10zwkUxQUS转换为(16进制)4C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53                   一共16个字节就是0x10
最终结果:把00 10加到最前面
00 10 4C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53 

经过哈希加密:7a03368e740ff9efb8318c6ba2a0260f2a596f87 转换为(16进制)
37 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31
38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37       一共40个字节就是0x28
最终结果:把00 28加到最前面
00 28 37 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 
31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37

最终可得:

  • 客户端:
    00 26 4C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C
    73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C

  • 用户名:
    00 10 4C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53

  • 密码:
    00 28 37 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33
    31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37

  • 组合到一起:
    00 26 4C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 10 4C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53 00 28 37 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37

3.4最终有效载荷

  这样我们就得到了有效载荷:
00 26 4C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 10 4C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53 00 28 37 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37

4.Connect控制报文

固定报头+可变报头+有效载荷

  • 10 ?? 00 04 4D 51 54 54 04 C2 00 64 00 26 4C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 10 4C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53 00 28 37 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37

  现在要解决的就是"??",也就是我们最开始说的剩余长度。
  这个问号??就是表示在问号后面有几个字符,有几个字符??就代表多少,然后把这个数字转换成16进制填入??就可以了。我们通过数数可以知道??后面有110个数,10进制的110转换成16进制就是0x6E。所以最终得到的CONNECT 控制报文为:

  • 10 6E 00 04 4D 51 54 54 04 C2 00 64 00 26 4C 59 2D 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 10 4C 59 2D 31 26 61 31 30 7A 77 6B 55 78 51 55 53 00 28 37 61 30 33 33 36 38 65 37 34 30 66 66 39 65 66 62 38 33 31 38 63 36 62 61 32 61 30 32 36 30 66 32 61 35 39 36 66 38 37

通过网络调试助手发送connect报文
1.协议类型选择 TCP Client
2.本机地址:本机地址会在软件选择TCP Client后默认出现,不用手动选择
3.远程主机地址:这个就是我们创建设备后阿里云的远程地址

服务器地址:a10zwkUxQUS.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883 

4.在发送数据之前要先勾选按16进制发送,之后会在网络调试助手的接受端出现:20 02 00 00 说明发送正常接收正常,如果点击发送按钮之后网络调试助手马上就断开或者接收不到出具的话,就说明你发送的数据有问题,请仔细回去好好把报文数据整理一遍,否则不能发送成功。

这里为啥是收到的是20 02 00 00 ,我们可以去看看数据手册中3.2小节的connect确认连接请求。


这样我们的客户端就与阿里云的服务端连接起来了,我们现在可以去看看阿里云官网就会发现此时的LY-1设备处于在线状态。哈哈,是不是很奇妙啊!

5.断开链接

我们可以看到数据手册的3.14小节,断开连接的报文是 E0 00

然后我们在连接状态下向服务器发从断开可连接的报文 E0 00,这是服务器就会与客户端断开,由于断开后收不到服务器发来的数据。所以网络调试助手不会接收到任何新消息。

这是我们再到阿里云官网(刷新一下网页)就会发现此时的LY-1设备处于离线状态。哈哈,是不是很奇妙啊!

  我们用网络调试助手的目的就我们现在还没有单片机和esp8266,但是我们又必须要学习mqtt协议,只有通过网络调试助手来代替单片机来实现,等我们网络调试助手都调通了之后我们再把他一直到我们的STM32单片机中就可以了。

UDP-----为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法
TCP Client  客户端------单片机(网络调试助手代替单片机)
TCP Server  服务端------阿里云

5.服务质量QQS

参考:https://www.cnblogs.com/hayasi/p/7806078.html



好书不厌百回读,熟读自知其中意。将学习成为习惯,用知识改变命运,用博客见证成长,用行动证明努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
听说 👉点赞👈的人运气不会太差,每一天都会元气满满呦!_❤️❤️❤️
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了👉 关注 👈我哦!

更多精彩内容请前往 果果小师弟的微信公众号


如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留个言。或者你有更好的想法,欢迎一起交流学习~~~

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

果果小师弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值