单个 TLS 加密的 MQTT 消息的字节大小是多少?

物联网 MQTT 联网
2021-06-28 10:54:41

要确定带宽使用情况,我需要知道从设备发送到服务器的 MQTT 消息的确切大小。

此消息如下所示:

client.publish(topic="foo", payload="Hello World!");

我想知道整个消息的大小,因为它是使用 TLS 通过 Internet 加密传输到 MQTT 代理的。

1个回答

这在某种程度上取决于您的意思是 MQTT v3 还是 MQTT v5(规范的新版本,它可以有更多可选的标头)。

我将根据最小 v3 进行回答,因为这将给出默认的最小大小,并且在不使用任何附加功能时仍然对 MQTT 5 iirc 有效(它可能有一个额外的标志字节)。

首先,MQTT 数据包由 4 部分组成(只有第 1 和 2 部分用于所有数据包类型,但对于发布,您需要全部 4 部分)

  1. 一个控制头,这是一个固定大小的 1 个字节
  2. 长度字段,根据有效负载的大小可以介于 1 到 4 个字节之间。在这种情况下,它应该是另一个单字节。(最大数据包大小为 256MB)
  3. 可变长度的标题,可以是任意长度,因为它包含主题名称。
    • 由于您尚未指定主题,因此假设您要发布到foo另外 5 个字节的主题(长度为 2 个字节,主题为 3 个字节)
    • 它在末尾有 2 个字节作为数据包 ID
  4. 接下来是这种情况下的有效载荷,Hello World!它是 12 个字节(UTF-8 编码时)

所以这应该加起来1 + 1 + 5 + 2 + 12 = 21 bytes(或负载顶部的 9 个字节的开销)

更多细节在这里:https : //docs.solace.com/MQTT-311-Prtl-Conformance-Spec/MQTT%20Control%20Packets.htm#_Toc430864901

如果您真的指的是 MQTT-SN,那么您应该能够从规范中解决它(http://www.mqtt.org/new/wp-content/uploads/2009/06/MQTT-SN_spec_v1.2.pdf)但它可以更少,因为您可以预先配置主题,只需按编号引用它们,这样标题就会变得更小。