Azure IoT Hub:ESP8266 Arduino示例发遥测显示ASCII数组,如何发送JSON格式?
ESP8266上报遥测在IoT Explorer显示为ASCII数组问题
问题背景
- 开发使用的参考代码为Azure官方ESP8266遥测示例仓库,地址:iothub_ll_telemetry_sample
- 代码未做任何修改,核心发送逻辑为:
const char* telemetry_msg = "test_message"; message_handle = IoTHubMessage_CreateFromString(telemetry_msg); result = IoTHubDeviceClient_LL_SendEventAsync(device_ll_handle, message_handle, send_confirm_callback, NULL);
现象与疑问
通过Azure IoT Explorer查看遥测消息时,消息主体(body)被显示为ASCII字节数组,实际效果:
存在的疑问:
- 这种ASCII数组的显示格式是否为Azure IoT Explorer的预期行为?
- 接收端是否必须对该字节数组做解包操作,才能获取原始发送的字符串?
- 期望达到与Azure设备模拟器一致的展示效果,遥测内容可直接以格式化JSON结构呈现,预期效果:

对应解答
ASCII数组显示的本质
这是完全正常的预期显示行为。Azure IoT Hub传输的消息本体本质是二进制字节流,IoTHubMessage_CreateFromString接口会将传入的字符串按ASCII编码转换为对应字节序列存入消息体;当消息未声明内容格式属性时,Azure IoT Explorer会默认将原始字节流以ASCII字节数组的形式展示,不存在数据传输损坏的问题。接收端处理逻辑
接收端确实需要对二进制字节流做解码处理,才能拿到原始字符串内容。如果在设备发送消息时显式声明了编码规则,接收端和IoT Explorer会自动完成解码,无需手动逐字节解包。实现JSON格式化展示的方法
达不到设备模拟器的展示效果,核心原因是发送的消息缺少两个关键属性设置:内容类型(Content Type)、内容编码(Content Encoding)。Azure IoT Explorer在解析消息时,会自动识别这两个属性,当检测到内容类型为application/json、编码为utf-8时,就会自动将二进制消息体解码为格式化JSON展示,而非默认显示字节数组。修改代码时,只需在创建消息句柄后、调用发送接口前补充属性设置,并将待发送字符串替换为合法JSON格式即可:
const char* telemetry_msg = "{\"temperature\": 25.6, \"humidity\": 58.2}"; message_handle = IoTHubMessage_CreateFromString(telemetry_msg); // 补充消息属性声明 IoTHubMessage_SetContentType(message_handle, "application/json"); IoTHubMessage_SetContentEncoding(message_handle, "utf-8"); result = IoTHubDeviceClient_LL_SendEventAsync(device_ll_handle, message_handle, send_confirm_callback, NULL);
内容的提问来源于stack exchange,提问作者mleister
相关产品推荐
相关产品推荐

