我正在尝试将此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(此错误消息在下面)
答案 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。