Разбор Json с использованием arduino-mqtt lib - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь использовать библиотеку arduino-mqtt.

У меня есть эта работа, отправляющая строку json. Проблема заключается в попытке разобрать строку с ArduinioJson. Он просто не возвращает значения.

Я думаю, что это может быть связано со ссылкой на указатель в функции mqttMessageRecived ( String & payload ).

Функция вызывается при появлении сообщения MQTT:

void mqttMessageReceived(String &topic, String &payload){

//Example String for test

String json = "{"id" : "100" , "cmd" : "0xff"}";

jsonout(payload);

Serial.println("Sending Static String");
jsonout(json);

Функция для анализа ввода JSON:

void jsonout(String Json){

StaticJsonDocument<200> doc;

//Deserialize the JSON document
DeserializationError error = deserializeJson(doc, Json);
Serial.println("Got String: ");
Serial.println(Json);

// Test if parsing succeeds.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}

const char* id = doc["id"];
const char* cmd = doc["cmd"];

// Print values.
Serial.println(id);
Serial.println(cmd);

}

Непроанализированный вывод: Сообщение от MQTT

Got String: 
"{\"id\" : 4 , \"cmd\": \"0xee\"}"

Результат = Нет вывода из анализа json


Непроанализированный вывод: Отправка статической строки

Got String: 
{"id" : "100" , "cmd" : "0xff"}

Результат = Вывод из анализа json:

100 
0xff

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Сервер возвращает участника id, который является Number "id":4, в то время как вы генерируете id это String "id":"200".

Вам необходимо настроить свой код налибо один.Если это число (и это так), вам нужно отправить "id":200 и изменить свой код, чтобы получить число:

unsigned id = (double)doc["id"];

// And to generate it:
String json = "{\"id\" : 100 , \"cmd\" : \"0xff\"}";

Кроме того, с JSON, остерегайтесь шестнадцатеричного кодирования, если оно не преобразованона номер (вы должны сделать это самостоятельно, набрав const char* и позвонив по номеру sscanf или strtol или ...), и это не удобно.Вместо этого лучше использовать кодировку base-10:

String json = "{\"id\" : 100 , \"cmd\" : 255}";
0 голосов
/ 17 июня 2019

Проблема в том, что - в ответе с сервера

"{\" id \ ": 4, \" cmd \ ": \" 0xee \ "}"

поле id является целым числом, а не символьным массивом.

Так что вам нужно изменить

const char* id = doc["id"];

до

int id = doc["id"];

(и обновите свою тестовую строку, чтобы использовать также int для идентификатора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...