在连接包中

MQTT CONNECT控制数据包始终包含有效负载。它是建立连接后客户端必须发送给服务器的第一个数据包。
它只能由客户端发送一次,如果发送了第二个连接包,服务器(代理)必须将其作为协议冲突处理并断开客户端连接。
有效载荷可能包含几个不同的字段:

唯一客户端标识符(clientid)–始终存在

  • topic
  • message
  • 用户名
  • 密码(也需要用户名!)

clientid是必需的,其他字段是可选的。可选字段的存在由标头中的标志确定。

限制

以下是合规broker应支持的限额:

clientid:23个UTF-8编码字节

用户名编码后最大655535字节(UTF-8编码)

密码:0到65535字节的二进制数据

消息限制大小:268435455字节

满足MQTT v3.1.1规范的任何代理都需要支持客户机id的以下字符:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

broker可以选择支持其他字符和更长的客户机ID。

23个字就够了。记住,这些不是位,而是字符。例如,如果使用base58编码,则得到58^23个组合~3,62E+40~ 362112794667800000000000000000000000000个组合。如果你没有,那就更糟了。

broker可以选择支持长度为零字节的clientid。在这种情况下,代理必须为客户机分配一个唯一的clientid。并非所broker都支持这一点(根据规范“可选”)。

用户名必须是UTF-8编码字符串。密码可以是二进制数据。
消息也可以是二进制数据。

客户端ID应该是唯一的

在MQTT中,客户机通常应该有不同的clientid,即使它们有不同的用户名。

如果两个客户机共享客户机id,它们将以连接断开连接尝试的ping-pong结束,因为代理通常不允许具有相同clientid的两个客户机进行连接。

参考

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.pdf

有关通用UTF-8编码字符串的限制,请参见第1.5.3节,该字符串适用于用户名

Tags: mqtt

Related Posts:

Leave a Comment