You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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发布时添加消息属性,明确指定内容类型和字符编码。具体修改步骤如下:

  1. 定义MQTT消息属性字符串
    在代码合适位置(比如全局区域或sendTelemetry函数内)添加属性定义:
// 指定消息为JSON格式,UTF-8编码
const char* mqtt_msg_properties = "content-type:application/json;charset=utf-8";
  1. 修改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");
}
  1. 验证效果
    修改完成后,发送的消息会被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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:04:52