我尝试将此 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(此错误消息如下)
最佳答案
增加 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/