IoT中心C2D消息属性溢出到正文

时间:2019-09-24 00:19:07

标签: c# azure-iot-hub

我创建了IoT中心应用程序,并尝试通过C#控制台应用程序使用多个云到设备(C2D)消息将JSON Blob发送到Android设备。

我将JSON blob拆分为多个字符串,长度为64000,并在单独的C2D消息中发送每个块。我使用64000作为字符串的长度,因为字符串的长度等于以字节为单位的大小(请参见https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messages-construct),并且我留了一些空间以获取其他属性

每个块都存储为如下属性:

 var message = new Message();
 message.MessageId = messageId;
 message.Ack = DeliveryAcknowledgement.Full;

 message.CreationTimeUtc = creationTime;
 message.Properties.Add("type", "EXAMPLE_TYPE");
 message.Properties.Add("example_data_key", chunk);
 message.Properties.Add("checksum", checksum);
 message.Properties.Add("page", pageNumber.ToString());
 message.Properties.Add("page_total", chunks.Count.ToString());

该消息已从控制台应用程序成功发送,但是当我在Android设备上通过MQTT协议接收到该消息时,example_data_key属性中的许多数据似乎都在消息正文中找到了进行网址编码。

例如,":"3","将显示为%22%3A%223%22%2C%22,但属性中的字符串已正确解码

有什么想法吗?

编辑:忘了提到这仅在我发送非常大的消息(例如长度为64000的字符串)时发生。例如,如果我将字符串设置为32000长度,那么一切正常。

1 个答案:

答案 0 :(得分:0)

我无法重现您的问题:

使用Azure门户发送C2D消息,请参见以下屏幕片段:

enter image description here

并且设备(例如我的Azure IoT Hub Tester)收到一条消息:

MQTT:
{
  "Topic": "devices/Device1/messages/devicebound/%24.to=%2Fdevices%2FDevice1%2Fmessages%2FdeviceBound&example_data_key=%22%3A%223%22%2C%22",
  "Timestamp": "2019-09-24T02:24:42.6540481Z",
  "DupFlag": false,
  "QosLevel": 1,
  "Retain": false
}

Payload:
123

您可以看到上面的 Topic ,MQTT订阅处理程序通过Azure IoT中心以正确编码的格式接收了此属性:

example_data_key=%22%3A%223%22%2C%22

我建议您查看一下您的MQTT库如何处理该主题,或者尝试对该属性值使用Base64编码。请注意,最大size of the message(包括的属性)为64k。