Arduino Azure IoT 库包含采用 Base64 编码的消息

问题描述 投票:0回答:1

我正在使用适用于 Arduino 的 Azure IoT 库。基于 ESP32 的 GitHub 存储库中的示例,请参阅:https://github.com/Azure/azure-sdk-for-c-arduino/tree/main/examples/Azure_IoT_Hub_ESP32

我根据传感器数据将消息发送到 Azure IoT 中心,然后从那里将它们传输到 Cosmos DB。但是,我注意到这些消息是采用 Base64 编码的。我在 Arduino 文件中发送消息的代码如下所示:

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");
    }
}

我找到了一个可能有帮助的解决方案。要将消息作为 JSON 而不是 Base64 字符串发送,请向消息添加 UTF-8 和 application/json 编码。我不知道如何使用 Arduino 库来实现这一点。是否可以将我的消息作为 JSON 而不是 Base64 字符串发送?

azure arduino iot hub
1个回答
0
投票

根据检索到的文档,您的Arduino设备发送到Azure IoT Hub的消息似乎是base64编码的。但是,从检索到的文档中尚不清楚是否可以使用适用于 Arduino 的 Azure IoT 库以 JSON 形式(而不是 Base64 字符串)发送消息。

一种可能的解决方案是修改代码以将消息作为 JSON 而不是 Base64 字符串发送。您可以尝试将 UTF-8 和 application/json 编码添加到消息中,如检索到的 documents 中的建议。为此,您可以修改 Arduino 文件中的

sendTelemetry
函数,将遥测有效负载序列化为 JSON 字符串,并将
Content-Type
标头设置为
application/json
。以下是如何修改
sendTelemetry
函数的示例:

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);

    // Serialize the telemetry payload as a JSON string
    DynamicJsonDocument json(1024);
    json["message"] = telemetry_payload;
    String json_payload;
    serializeJson(json, json_payload);

    if (esp_mqtt_client_publish(
        mqtt_client,
        telemetry_topic,
        (const char*)json_payload.c_str(),
        json_payload.length(),
        MQTT_QOS1,
        DO_NOT_RETAIN_MSG) == 0) {
        Logger.Error("Failed publishing");
    } else {
        Logger.Info("Message published successfully");
    }
}

有关更多详细信息,请参阅 IoT 的 JSON C 源代码库通信SO

© www.soinside.com 2019 - 2024. All rights reserved.