AWS IoT Core - MQTT 测试客户端未接收完整的 JSON 负载

问题描述 投票:0回答:1

目前我使用 Arduino MKR WiFi 1010 和此处描述的库成功向 AWS IoT Core MQTT 测试客户端发送短信。 (代码和需要遵循的步骤都可以在链接中找到。)

我还成功地将这些数据从 MQTT 客户端移动到 AWS Dynamo DB 表。

当我尝试发送长度超过 250 个字符的有效负载时,就会出现问题。我知道这是可能的,因为我之前已经发送了 400 个字符,但我不确定我做错了什么/不同。

amazon-web-services mqtt
1个回答
0
投票

在线路上,每个 MQTT 消息都有一个固定标头,其中包含:

  • 字节 1 - 数据包类型和标志 - 对于
    PUBLISH
    ,数据包类型为 50,标志是 QOS 级别之类的东西。
  • byte 2...(可变长度)- 剩余长度 - 当前数据包中剩余的字节数,包括可变标头和有效负载中的数据。

因此,客户端在传输消息之前需要知道数据包的总大小。对于发布消息(有效负载大小可能会有很大差异),库有两种可能的方法:

  1. 等到整个消息可用后再发送(这样我们就知道大小)。
  2. 允许用户提供大小(允许正文以多个块的形式传输)。

ArduinoMqttClient
通过一系列
beginMessage
签名支持两者:

int beginMessage(const char* topic, unsigned long size, bool retain = false, uint8_t qos = 0, bool dup = false);
int beginMessage(const String& topic, unsigned long size, bool retain = false, uint8_t qos = 0, bool dup = false);
int beginMessage(const char* topic, bool retain = false, uint8_t qos = 0, bool dup = false);
int beginMessage(const String& topic, bool retain = false, uint8_t qos = 0, bool dup = false);

如果您传递

size
,则消息将被流式传输(请参阅此处此处)。这意味着当您调用
beginMessage
时将发送标头,然后每次调用
write
都会导致数据被发送出去。如果您知道要发送的数据的大小,这是最好的方法,因为它避免了将数据复制到缓冲区的需要。

如果没有传递

size
,则每次调用
write
都会将数据复制到缓冲区(并且在调用
endMessage
时发送数据)。如果传入的数据超过缓冲区的容量(默认为 128 或 256 字节),则数据将丢失。在该库的最新版本中,您可以使用 void setTxPayloadSize(unsigned short size). 设置缓冲区大小
© www.soinside.com 2019 - 2024. All rights reserved.