AWS IoT - неверный формат JSON - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь отправить этот 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 голосов
/ 05 января 2019

Увеличьте echoMAX_DATA_LENGTH до размера, достаточного для всего вашего сообщения JSON.

Статическая часть JSON в вашем коде (без значений, заполненных snprintf()) имеет длину 34 символа, так что это никак не может сработать, если echoMAX_DATA_LENGTH установлен в 20 - он всегда будет генерировать фрагмент JSON вместо всего объекта JSON.

Помните, что длина, которую snprintf () использует, включает в себя байт для завершающего символа строки C '\ 0', поэтому вам нужно, чтобы echoMAX_DATA_LENGTH был на единицу больше, чем максимальный общий JSON длина сообщения.

Когда вы увеличиваете echoMAX_DATA_LENGTH, попробуйте добавить отладочное сообщение после snprintf(), чтобы вы могли видеть JSON, который вы генерируете. Если ваш код уже настроен на использование Serial, добавьте:

Serial.println(cDataBuffer);

после snprintf(), чтобы вы могли подтвердить, что вы сгенерировали JSON правильно.

...