我创建了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长度,那么一切正常。
答案 0 :(得分:0)
我无法重现您的问题:
使用Azure门户发送C2D消息,请参见以下屏幕片段:
并且设备(例如我的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。