AWS IoT-JSON格式不正确

时间:2019-01-04 13:37:16

标签: 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

1 个答案:

答案 0 :(得分:1)

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。