如何在Arduino Azure IoT库中发送JSON遥测数据而非Base64编码?
问题描述
我正在为ESP32使用Arduino版Azure IoT库开发项目,将传感器数据发送至Azure IoT Hub后流转至Cosmos DB,发现消息始终以Base64编码形式存储。我的消息发送代码如下:
static void generateTelemetryPayload(const char* activity) { time_t now = time(NULL); struct tm* timeinfo; char timeStr[64]; timeinfo = localtime(&now); strftime(timeStr, sizeof(timeStr), "%Y-%m-%dT%H:%M:%S", timeinfo); DynamicJsonDocument json(1024); json["category"] = "human_presence"; if (activity != "") { json["activity"] = activity; } json["zone"] = zone; json["timestamp"] = getFormattedTime(); char mqtt_message[128]; serializeJson(json, mqtt_message); telemetry_payload = mqtt_message; } static void sendTelemetry(const char* message) { Logger.Info("Sending telemetry ..."); if (az_result_failed(az_iot_hub_client_telemetry_get_publish_topic( &client, NULL, telemetry_topic, sizeof(telemetry_topic), NULL))) { Logger.Error("Failed az_iot_hub_client_telemetry_get_publish_topic"); return; } generateTelemetryPayload(message); if (esp_mqtt_client_publish( mqtt_client, telemetry_topic, (const char*)telemetry_payload.c_str(), telemetry_payload.length(), MQTT_QOS1, DO_NOT_RETAIN_MSG) == 0) { Logger.Error("Failed publishing"); } else { Logger.Info("Message published successfully"); } }
我知道可以通过添加UTF-8和application/json编码标识来让消息以JSON格式直接传输,而非Base64编码,但不清楚如何在这个Arduino库环境中实现,求可行方案。
解决方案
要让Azure IoT Hub将消息识别为JSON文本(而非二进制数据自动Base64编码),核心是在MQTT发布时添加消息属性,明确指定内容类型和字符编码。具体修改步骤如下:
- 定义MQTT消息属性字符串
在代码合适位置(比如全局区域或sendTelemetry函数内)添加属性定义:
// 指定消息为JSON格式,UTF-8编码 const char* mqtt_msg_properties = "content-type:application/json;charset=utf-8";
- 修改
esp_mqtt_client_publish调用
ESP-IDF的MQTT客户端支持在发布时传递属性参数,只需在原调用中新增属性参数即可:
if (esp_mqtt_client_publish( mqtt_client, telemetry_topic, (const char*)telemetry_payload.c_str(), telemetry_payload.length(), MQTT_QOS1, DO_NOT_RETAIN_MSG, mqtt_msg_properties) == 0) { // 新增属性参数 Logger.Error("Failed publishing"); } else { Logger.Info("Message published successfully"); }
- 验证效果
修改完成后,发送的消息会被Azure IoT Hub识别为JSON文本,流转至Cosmos DB时将直接存储原始JSON内容,不再自动进行Base64编码。
额外注意事项:
- 确保你的JSON payload是有效的UTF-8编码(代码中通过
serializeJson生成的内容默认符合UTF-8要求) - 若使用的Azure SDK版本提供了
az_iot_message_properties封装类,也可通过该类设置属性后再发布,但直接传递属性字符串是更轻量化的实现方式。
内容的提问来源于stack exchange,提问作者Rene Prins
相关产品推荐
相关产品推荐

