c - AWS IoT - JSON 格式不正确

标签 c json freertos esp32

我尝试将此 JSON 数据包发送到 AWS IoT,但 AWS 无法识别它。我正在使用示例 ESP32 AWS FreeRTOS 代码,但无法理解包含以下代码的 JSON 数据包的正确格式:

#define echoMAX_DATA_LENGTH 20

char cDataBuffer[ echoMAX_DATA_LENGTH ];

(void) snprintf(cDataBuffer, echoMAX_DATA_LENGTH, "{\"state\":{\"reported\":%.*d}, \"clientToken\":\"%d\"}", x, x, x);

/* Setup the publish parameters. */
memset( &( xPublishParameters ), 0x00, sizeof( xPublishParameters ) );
xPublishParameters.pucTopic = echoTOPIC_NAME;
xPublishParameters.pvData = cDataBuffer;
xPublishParameters.usTopicLength = ( uint16_t ) strlen( ( const char * ) echoTOPIC_NAME );
xPublishParameters.ulDataLength = ( uint32_t ) strlen( cDataBuffer );
xPublishParameters.xQoS = eMQTTQoS1;

AWS测试页面,无法显示消息并已将其转换为UTF-8(此错误消息如下)

enter image description here

最佳答案

增加 echoMAX_DATA_LENGTH 使其足够大以容纳整个 JSON 消息。

代码中 JSON 的静态部分(没有由 snprintf() 填充的值)是 34 个字符,因此这不可能与 echoMAX_DATA_LENGTH 一起使用> 设置为 20 - 它始终会生成 JSON 片段而不是整个 JSON 对象。

记住 snprintf() 的长度使用包含 C 字符串终止字符“\0”的字节,因此您需要使 echoMAX_DATA_LENGTH 比最大 JSON 消息总长度大 1。

当您增加 echoMAX_DATA_LENGTH 时,请尝试在 snprintf() 之后添加调试消息,以便您可以看到正在生成的 JSON。如果您的代码已设置为使用 Serial,请添加:

Serial.println(cDataBuffer);

snprintf() 之后,以便您可以确认是否已正确生成 JSON。

关于c - AWS IoT - JSON 格式不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54040025/

相关文章:

c++ - 序列点从何而来?

java - 如何使用正则表达式修改其中的几个字段来创建新的 JSON 字符串?

c - freeRTOS:为什么需要像 StackDepth(用于 xTaskCreate)这样大的内存?

c++ - 设备驱动程序内存缓冲区处理器缓存问题

c - 使用 scanf ("%d ") 在 %d 之后有一个空格

sql - 使用聚合函数更新 json 数组

c++ - FreeRTOS 仅在发布时崩溃

使用 FOpen* 的 SQLite VFS 实现指南

c - 从用户那里获取输入 - 不起作用

java - 流式传输 json 元素