发布包即为从客户端到服务端或服务端到客户端的应用消息
3.3.1 发布固定头
3.3.1.1 DUP
位置:字节1,bit3
DUP置0,表明当前为客户端和服务端间第一次尝试发送发布包。DUP置1,表明可能为重发发布包。
所有QoS 0消息,DUP必须置0。
服务端发送给订阅者的发布包,其不再传播接收的发布包中的DUP标记。接收的发布包和发送的发布包相互独立。
接收到的发布包中DUP标记置1, 不保证其已接收过该包。
3.3.31.2 QoS
位置: byte 1, bit 2-1。
该域表明发送的应用消息的级别,具体级别描述如下:
如果服务端给客服端的CONNACK响应中包含最大的QoS级别,且收到的QoS比该级别大,
服务端应该使用DISCONNECT(错误码:0x9B)处理错误。
发布包不可将QoS俩个位都置1,服务端或客户端接收到QoS标记全1的包,应识别为非法包,并使用DISCONNECT(错误码0x81)处理。
3.3.1.3 保持(RETAIN)
客服端或服务端发送的订阅包中RETAIN置1, 服务端必须替换已有的保持新并存储该信息,使得该信息可以发送给匹配的订阅者。
服务端正常处理负荷为0字节的消息,但任何有相同标题名的消息必须移除,且该标题的订阅者不在接收保持消息。
服务端不可存储负荷数据为0字节的保持消息。
服务端给客服端的CONNACK响应中的RETAIN置0,但接收到的发布包中RETAIN标价置1,应用DISCONNECT (错误码 0x9A)处理。
3.3.1.4 剩余长度
可变头加负荷数据长度,编码为可变字节长度。
3.3.2 发布可变头
发布包可变头按顺序包含如下域:
- 标题名称
- 包标识符
- 属性
3.3.2.1. 标题名
标题名称标识负荷数据发布的信息通道。
发布包中的标题名称不可包含通配符。
服务端发给订阅客户端的发布包标题名称必须匹配订阅的标题过滤器。
为减少发布包的大小,发送者可以使用标题别名。标题名称0长度且无标题别名,为协议错误。
3.3.2.2 包标识符
包标识符只存在于等级1或2的发布包中。
3.3.2.3 发布属性(Publish Properties)
3.3.2.3.1 属性长度(Property Length)
发布包属性长度编码格式为可变字节长度。
3.3.2.3.2 负荷格式标识(Payload Fromat indicator)
1(0x01) ,字节,负荷格式标识,后更负荷格式标识值:
- 0 表明负荷无指定格式字节。
- 1 表明负荷为UTF-8编码字符初始化。
服务发送给所有的订阅者的负荷格式标识必须无修改。
3.3.2.3.3 消息过期间隔
2(0x02),字节,消息超时间隔标识,后接4字节整数代表消息过期间隔,单位s.
当消息过期时间到,而服务端未能向前发送消息给订阅者,器必须删除订阅者的消息备份。
无此数据,消息不过期。
3.3.2.3.4 标题别名(Topic Alias)
35(0x23),字节,标题别名标识,后跟2字节整数代表标题别名值。
标题别名即为一个整数值用于替代标题名标识标识。这可减少发布包的大小,当标题名称很长或标题名称在网络连接中频繁使用十分有效。
发送者决定是否使用标题别名且选定 别名值。它将一个非零长度的标题名映射为标题别名。
标题别名映射只存在于网络连接,其只在网络连接的生命周期保持。
标题别名不允许为0。
客户端发送的发布包中的标题别名值不可大于服务端CONNACK包中返回的标题别名最大值。
客户端和服务端的标题别名映射相互独立。客服端发送的发布包标题别名值为1,服务端发送发布包中的标题别名值为1,他们引用不同的标题。
3.3.2.3.5 响应标题(Response Topic)
8(0x8) ,字节,响应标题标识,后跟一个UTF-8编码字符串,用作响应消息的标题。
响应消息标题需为UTF-8编码字符串,且不可包含通配符。
协议中包含响应标题名超过1次,为协议错误。
消息中存在响应标题表明其为请求。
服务端需将响应标题无修改地发给所有的消息订阅者。
3.3.2.3.6 相关数据
9(0x09) ,相关数据表示,后接2进制数。请求消息的发送者利用相关数据识别其对应的响应消息。
协议中只可包含相关数据一次,否则为协议错误。相关数据不存在,请求者不需求相关数据。
3.3.2.3.7 用户属性(User Property)
38(0x26),字节,用户属性标识, 后跟UTF-8字符串对,用户属性允许包含多次对应多个名字。
3.3.2.38 订阅标识(Subscription Indentifier)
11(0x0B), 订阅标识的标识,后接一个可变字节整数代表订阅标识,取值范围:1—268,435,455。
订阅标识值为0识别为协议错误。
发布中包含的多个订阅标识级对应多个订阅。
3.3.2.3.9内容类型(Content Type)
3(0x03), 内容类型标识,后接一个UTF-8编码字符串描述应用消息。
协议总包含多个内容类型为协议错误。内容类型有发送和接收定义。
3.3.3 发布负荷(PUBLISH Payload)
发布负荷包含需发布的应用消息。数据内容和格式是应用指定的。负荷长度可由固定头的可变长度域减去可变头长度计算。发布吧包含0字节负荷是有效的。
3.3.4 发布行为(PUBLISH Actions)
发布包接收必须以QoS决定的响应包。
客服端使用一个发布包来发送应用消息给服务器,分发消息给匹配的订阅客户端。
发布包中包含标题别名,接收处理流程如下:
1) 标题别名值为0或大于最大标题别名值,为协议错误。接收者使用DISCONNECT(错误码:0x94;标题别名非法)响应。
2) 如果接收者已经建立标题别名映射:
a) 当包包含0字节标题名称,接收者使用标题别名对应的标题名称。
b) 当包包含非0长度标题名称,接收着使用此标题名称,并将标题别名映射的标题名称改为接收包的标题名称。
3)当接收者未有标题别名映射
a) 包包含0字节标题名称为协议错误,接收者使用DISCONNECT(错误码:0x82;协议错误)响应。
b) 当包包含非0字节标题名称,接收者使用该标题名称,且给该标题名称设置标题别名。。
阿里云优惠
https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=4avn33q8