【发布时间】:2020-09-18 13:00:43
【问题描述】:
我有一个结构 IoT_Publish_Message_Params 需要准备,以便准备在 AWS IoT 上发布。当我将字符串作为有效负载传递时,下面的 sn-p 工作得很好。
/**
* @brief Publish Message Parameters Type
*
* Defines a type for MQTT Publish messages. Used for both incoming and out going messages
*
*/
typedef struct {
QoS qos; ///< Message Quality of Service
uint8_t isRetained; ///< Retained messages are \b NOT supported by the AWS IoT Service at the time of this SDK release.
uint8_t isDup; ///< Is this message a duplicate QoS > 0 message? Handled automatically by the MQTT client.
uint16_t id; ///< Message sequence identifier. Handled automatically by the MQTT client.
void *payload; ///< Pointer to MQTT message payload (bytes).
size_t payloadLen; ///< Length of MQTT payload.
} IoT_Publish_Message_Params;
IoT_Publish_Message_Params paramsQOS0;
sprintf(cPayload, "%s : %d ", "Hello from HOME!!", i);
paramsQOS0.qos = QOS0;
paramsQOS0.payload = (void *) cPayload;
paramsQOS0.isRetained = 0;
paramsQOS0.payloadLen = strlen(cPayload);
rc = aws_iot_mqtt_publish(&client, TOPIC, TOPIC_LEN, ¶msQOS0);
现在我想发送一个实际的 JSON 有效负载,但我不知道该怎么做。我尝试使用 cJSON 创建 JSON 对象:
cJSON *root,*fmt;
root=cJSON_CreateObject();
paramsQOS0.payload = (void *) root
cJSON_AddItemToObject(root, "response", fmt=cJSON_CreateObject());
cJSON_AddNumberToObject(fmt,"hello", 123);
cJSON_AddNumberToObject(fmt,"bye", 321);
但是,我的问题是,我在这里传递什么作为 IoT_Publish_Message_Params.payloadLen ?以及如何将 json 对象传递给 IoT_Publish_Message_Params.payload?
【问题讨论】:
-
如果你不会有很多动态消息并且如果你在 lambda 或后端服务中处理你的消息,我建议你发送它二进制。对于像 ESP32 这样的低内存嵌入式系统,处理 json 可能会导致内存效率低下。但是您应该在 IoT 规则级别对消息进行编码,例如“选择编码(*)作为来自 /some/topic 的数据”
标签: c mqtt esp32 aws-iot cjson