首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C和ESP-IDF框架通过MQTT将JSON对象从ESP32发布到AWS IoT

使用C和ESP-IDF框架通过MQTT将JSON对象从ESP32发布到AWS IoT
EN

Stack Overflow用户
提问于 2020-09-09 19:18:45
回答 2查看 1.1K关注 0票数 0

我有一个结构IoT_Publish_Message_Params,为了准备在亚马逊网络服务IoT上发布,需要准备好。当我将字符串作为有效负载传递时,下面的代码片段工作得很好。

代码语言:javascript
复制
/**
 * @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, &paramsQOS0);

现在我想发送一个实际的JSON有效负载,但我不确定如何才能做到这一点。我尝试过使用cJSON创建一个JSON对象:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

发布于 2020-09-09 20:28:34

在我看来,你有两个选择。以字符串或原始字节的形式发送JSON。

如果你想把它作为字符串发送(例如{"CarType":"BMW","carID":"bmw123"}),那么你需要把它转换成字符串。找到一些代码here

代码语言:javascript
复制
char* str = cJSON_Print(root);  
paramsQOS0.payload = (void *) str;
paramsQOS0.payloadLen = strlen(str);

但是,将其作为原始字节发送会更有效率。为此,您需要一个指向对象起始位置的指针,以及以字节为单位的对象大小。快速扫描GitHub Page,我找到了cJSON_GetArraySize,它显然返回了对象大小。

那么它应该看起来像这样:

代码语言:javascript
复制
paramsQOS0.payload = (void *) root;
paramsQOS0.payloadLen = cJSON_GetArraySize(root); // Not sure about this one

免责声明,我没有使用过cJSON,也没有测试过代码。我在试着告诉你该往哪个方向走。

票数 0
EN

Stack Overflow用户

发布于 2020-09-18 13:00:43

IoT_Publish_Message_Params具有payloadpayloadLen成员,因此您可以提供要发送的任何有效内存和字节长度。在第一个示例中,您提供了一个静态分配的字符串及其长度。

JSON是一种基于字符串的编码协议,因此payload将是一个char指针,可以使用strlen计算payloadLen

cJSON_Print返回一个对象的json字符串,使用它返回的指针并将其赋值给payload

请阅读cJSON API documentation如何使用它。下面是如何使用修改代码来发送JSON字符串。

代码语言:javascript
复制
IoT_Publish_Message_Params paramsQOS0;
char *json_str;

/* create a json message */
cJSON *root, *response;
root = cJSON_CreateObject();
response = cJSON_CreateObject();
cJSON_AddItemToObject(root, "response", response);
cJSON_AddNumberToObject(response, "hello", 123);
cJSON_AddNumberToObject(response, "bye", 321);

json_str = cJSON_Print(root);
if (json_str != NULL)
{
    paramsQOS0.qos = QOS0;
    paramsQOS0.isRetained = 0;
    paramsQOS0.payload = json_str;
    paramsQOS0.payloadLen = strlen(json_str);
    rc = aws_iot_mqtt_publish(&client, TOPIC, TOPIC_LEN, &paramsQOS0);
    free(json_str);
}

cJSON_Delete(root);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63810555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档