MQTT报文组装实现1
MQttNet有些功能不支持,只是基本的操作,
比如 匹配规则 不支持
WireShark抓包工具

可能有三种内容的拼装2、3、4

三、通信载荷

User Name和Password如果是0的话,后面传了就会出错
MQTT通讯过程中,所有出现不支持的报文,标记不对应,功能不支持的,就直接断开连接
都分为两块:长度+内容n
长度说明,后面还有多少个字节的长度属于当前信息
应用

客户端服务器,基于TCP必然有个连接的过程
不止三次握手
还需要连接报文,建立连接
【案例】连接服务器
一、请求
1、固定报头
消息类型前4个字节
0001,后面4位保留,0就可以
剩余字节,为了短平快的推送,尽量不要太长 ,只有1个字节,0-255长度,大部分都满足
不建议一次性拼接太长
2、可变报头
协议长度4,
协议:MQTT
需要携带用户名和密码
Will Retain:不保存接受的消息
Qos:0至多一次
Will Flag:0
Clean Session:保留session
保留:0
Keep Alive:100s
3、载荷:
ClientId 连接id
高级用法
Will Flag如果是1的话
说明服务端上一次连接断开之后还保存了一些信息,
二、响应
就是2
0010
剩余两个字节
1个跟Clean Session有关,不需要关
2个Return Code
如果是0代表已经连接成功
也可以添加自定义
每个字节都是8个位,代码实现理论更清晰

订阅:
8:订阅请求
9:订阅请求确认
请求之后不一定马上就要订阅,订阅不确定什么时间,超过KeepAlive时间,
保证不被踢掉,就回心跳确认
12:心跳请求:1100+0000
13:心跳确认:1101+0000
只有固定报头
订阅固定报头,后四位0010,协议规定
可变报文package identifier,无实际用途
QoS2的过程中体现package identifier ,保存消息的id,
topic01长度
载荷后两位QoS只是约定,具体还是看发送的消息,发布的最高值处理
同时订阅多个主题 ,有几个加几个
时间久了,有很多需要重新订阅,一次性订阅,
分多次,分组
长度指定,超过255,0x80
响应
package identifier
多对多

复杂过程
多种情况
QoS0,只管发布
Qos1
请求Pubush
DUP重试次数
主题Topic01字节长度,7个字节
PId
Message内容】
剩余字节长度
反馈Puback
PId返回确认才会完成,删掉存储的Pid
通过Pid去匹配,不需要额外存储什么东西
如果没有匹配到,一定时间内需要重新发送
把固定报头3位设置为1
Qos2
多了个确认过程
PubRec 变化报文类型 0100,再发送一次Pid
Pubrel 报文类型0100,倒数第二位1,不一样的地方,
Pubcomp完成,0100,pid
围绕Pid处理,2个字节,带宽小

基本上所有的请求都会需要固定报头
可变报头,可有可无,内容变化很大
主题:
Topic01
服务端有一个记录列表,对应客户端列表
多对多的关系
没体现树状结构
不仅仅支持字符串,还支持分层/
a/b/c/d
a/b/c/d/e
a/b/c/d/f
a/b/c/d/g
分组,产线,车间,厂区,
某个车间下的所有设备发送,不用都录入,可用通配符
1、#:代表当前节点往后的所有节点,包括子节点,a/b/c/#,上面所有节点都可以支持
2、+:代表当前节点下的所有节点 a/b/c/+,只会匹配 a/b/c/d
3、$ :$SYS,系统自己处理的,实际应用一般不会自己处理
规则:
1、至少一个字符
2、区分大小写
3、可以包含空格,前后中间都可以
4、/区分前后
5、不能包含空字符 0X20
6、不能超过65535

MQTTNET不支持主题通配符,服务端和客户端都不支持

win10应用商店下载的MQTTBox也不支持+#

EMQ的,服务器是商用的,也支持5.0,支持的完善
MQTTX支持通配符,

也支持汉字

服务器主题中间#不行
车间1#/产线1/设备1#
车间1/产线1/设备1#
服务器是Apollo,阿波罗的也支持通配符主题
TCP、TIS、WS、WSS、协议都支持
默认密码admin

不关心通配符的话,MQTTNet入门级也够了
浙公网安备 33010602011771号