我正在使用适用于 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 字符串发送?
根据检索到的文档,您的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");
}
}