MQTT v3.1.1中证书的最大长度(用户名、密码、clientid)。
CONNECT数据包
MQTT CONNECT控制数据包总是包含一个有效载荷。它是第一个数据包,在连接建立后,客户端必须将其发送给服务器。
它只能由客户发送一次,如果发送第二个CONNECT数据包,服务器(经纪人)必须将其作为违反协议处理,并断开客户的连接。
有效载荷可能包含几个不同的字段。
- 唯一的客户标识符(clientid)--始终存在
- 将主题
- 将信息
- 用户名称
- 密码(要求用户名也要存在!)。
clientid是必须的,其他字段是可选的。可选字段的存在是由头中的标志决定的。
屏幕截图。OASIS开放式MQTT v3.1.1规范
边界
以下是合规经纪商应支持的限额。
- clientid: 23个UTF-8编码的字节
- 用户名称最大。编码后655535字节(UTF-8编码)。
- 密码:0至65535字节的二进制数据
- 消息限制大小:268435455字节
以下是客户ID的字符 需要 任何符合MQTT v3.1.1规范的经纪商都可以支持。
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
经纪人可以选择性地支持其他字符和更长的客户ID。
23个字符已经足够了。记住,这些不是比特,而是字符。如果你使用 基地58 编码,例如,你会得到58^23个组合~3,62E+40~362112779466785000000000000000000个组合。如果你不这样做 - 那么甚至更多。
经纪人也可以支持零字节长度的客户ID。在这种情况下,经纪商必须给客户分配一个唯一的客户ID。并非所有的经纪商都支持这一点(按规范为 "MAY")。
用户名必须是一个UTF-8编码的字符串。密码可以是二进制数据。
该信息也可以是二进制数据。
加大限制
为了增加VerneMQ中的客户端ID限制,你可以设置一个选项,max_client_id_size。
https://docs.vernemq.com/configuration/nonstandard
它的默认值是23。
客户ID应该是唯一的
在MQTT中,通常客户应该有不同的客户ID,即使他们有不同的用户名。
如果两个客户共享客户端ID,他们将在连接-断开连接的尝试中结束,因为代理通常不允许两个具有相同客户端ID的客户的连接。
(我相信VerneMQ有这个选项,但我也相信它已经被废弃了;无论如何,最好不要在设计时考虑到它,以保持与其他经纪商的兼容!)。
参考资料
- http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.pdf
- 关于通用UTF-8编码字符串的限制,见1.5.3节,该节适用于用户名