使用AT指令连接EMQ服务器 (1) 初窥

本文详细介绍了如何使用AT指令连接到EMQ MQTT服务器,包括MQTT协议的基础知识,如固定报头、可变报头和有效载荷的构造。作者通过模拟TCP客户端,解析了CONNECT报文的各个字段,如协议名、连接标志、保活时间和客户端标识符等,并给出了实际的十六进制数据包示例。最终,通过测试验证了连接的成功,并鼓励读者将学到的知识应用到实际的32或51单片机项目中。
摘要由CSDN通过智能技术生成


前言

最近想直接用AT指令连接emq 但是网上的示例较少 所以出一篇文章


一、简单介绍MQTT协议

简单说就是 把我们要发送的东西按照固定的格式 组成一个字符串然后发送出去 然后mqtt服务器会帮我们进行分析。首先为了理解我们先不用硬件这篇文章也不会涉及硬件 我们使用软件模拟TCP客户端然后通过分析MQTT协议 发送消息
<urrlMQTT中文手册
前面的不用管 我们直接看TCP连接建立后我们要干嘛
1.客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报文 [MQTT-3.1.0-1]
这里因为我们是从客户端连接到服务器 阅读手册
报文尅性
在这里插入图片描述
上图我们得知 从客户端连接到服务器是1
byte1对应0x10就是是(0001 0000) 默认低四位保留 高四位表明了信息
byte2就是剩余长度这个取决于我们最后的长度 最后再算 可以算出所有的再减去2就行了
继续往下读 下面就是可变报头
(介绍)某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。
CONNECT报文的可变报头按下列次序包含四个字段:协议名(Protocol Name),协议级别(Protocol Level),连接标志(Connect Flags)和保持连接(Keep Alive)。
我这边测试我使用的emq协议名是MQIsdp (没进行mqtt的测试稿) 协议级别 3
连接标志 我们用0xc2(0x1100 0010)
在这里插入图片描述
1 2位不用解释 后面会用到用户名和密码
Clean Session:服务器在断开连接后,是不是要保存客户端的信息,我们保存,设为1。
具体的内容在手册中都有的
保活
保持连接(Keep Alive)是一个以秒为单位的时间间隔,表示为一个16位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个PINGREQ报文 [MQTT-3.1.2-23]。
不管保持连接的值是多少,任何时候,只要服务端认为客户端是不活跃或无响应的,可以断开客户端的连接。
这个就很简单了 自己想要的保活时间直接进行进制转换就行比如3000s就是 0x0b 0xb8
最后一步就是进行有效载荷 Payload的分析
CONNECT报文的有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码 [MQTT-3.1.3-1]。
客户端标识符
前两个字符就是客户端标识符的长度 后面就是客户端标识 比如我们用0x00 0x0f 那么我们的客户端标识符就有15的长度 随便设置111111111111111 对应16进制 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
后面跟着用户名和密码
用户名 比如 admin 对应 长度 0x00 0x05 数据 61 64 6D 69 6E
密码 12345678 对应长度 0x00 0x08 31 32 33 34 35 36 37 38
总和起来 我们看一下 (固定报头) 10 (报文长度)xx (协议名称长度)00 06 (协议名称)
4d 51 49 73 64 70 (版本号) 03 (连接标志)c2 (保活时间) 0b b8
(客户端标识符长度)00 0f (客户端标识服)31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
(用户名长度)00 05 (用户名)61 64 6D 69 6E (密码长度)00 08 (密码)31 32 33 34 35 36 37 38
计算出xx=46 进制转换后是2e
10 2e 00 06 4d 51 49 73 64 70 03 c2 0b b8 00 0f 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 00 05 61 64 6D 69 6E 00 08 31 32 33 34 35 36 37 38
好了我们已经成功一大半了 接着去测试一下连接

二、测试

在这里插入图片描述
注意这里我们测试先把hex都勾选上 然后 发送我们的数据 返回 20 02 00 00 这个说明我们已经连接到了emq 去网页端查看
在这里插入图片描述
可以看到 clientid和我们的用户名和我们设置的都一样 那就大功告成了 剩下的就是在去学习一下 怎么去我们的32或者51单片机中使用

总结

主要是对于mqtt的理解的更加深刻了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值