Розберіть JSON з arduino, щоб увімкнути світлодіод


18

Привіт, я намагаюся розібрати JSON resposne з веб-сервера в моєму ардуїно, щоб увімкнути та вимкнути світлодіодне світло. Я використовую повторний приклад клієнта wifi, щоб зробити запит на отримання мого сервера:

http://arduino.cc/en/Tutorial/WiFiWebClientRepeating

Ось що я надруковую назад з послідовного порту

connecting...
HTTP/1.1 200 OK
Date: Sun, 06 Apr 2014 01:14:37 GMT
Server: Apache
X-Powered-By: PHP/5.5.10
Cache-Control: no-cache
X-Frame-Options: SAMEORIGIN
Set-Cookie: expires=Sun, 06-Apr-2014 03:14:37 GMT; Max-Age=7200; path=/; httponly
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

19
{"lightstatus":"on"}
0

Як я проаналізую лише JSON-частину цієї відповіді, щоб я міг використовувати її для управління моїм світлодіодом?

Спасибі

Відповіді:


11

Мені відомо кілька бібліотек JSON для розбору Arduino.

Я ніколи не використовував нічого з цього, але я робив простий розбір JSON в проекті, над яким я працюю, тож я покажу вам, як я це зробив.

ПРИМІТКА. Я читаю послідовні дані, використовуючи послідовну бібліотеку програмного забезпечення. Вам потрібно буде змінити цей код, щоб він працював для вас. Це буде працювати лише на дуже простих струнах JSON. Це дуже обмежено, але якщо це все, що ти розбираєш, то це спрацює.

Приклад відповіді JSON від сервера:

{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}

По-перше, читайте лише дані між фігурними дужками.

String response = "";
bool begin = false;
while (SIM900.available() || !begin) {

    char in = SIM900.read();

    if (in == '{') {
        begin = true;
    }

    if (begin) response += (in);

    if (in == '}') {
        break;
    }

    delay(1);
}

Цей код зчитує дані по одному байту за часом, і як тільки він отримує відкриту дужку, він починає зберігати їх у response. Коли він отримує фіксатор, він закінчує його. Отже, ось чітке обмеження, у вашому рядку може бути лише один набір дужок відкриття / закриття.

Щойно у мене є рядок, я використовую indexOfта substringвитягую відповідну інформацію:

start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);

Цей код встановлює startпочаток id":"+ 5 символів у рядку. Це +5, оскільки так триває id":". Так startвказує на TEST1рядок JSON. У моїй системі ідентифікатор завжди матиме 5 символів, тому кінець start + 5. Потім я використовую substringдля вилучення цього.

Знову ж таки, перш ніж хтось почне голосувати за це жахливе рішення: якщо ви точно знаєте, з чим працюєте, і розумієте обмеження цього коду, то це не є поганим рішенням. Це рішення, яке виконує роботу.


Приклад JSON, який ви наводите, не виглядає як "хороший" JSON, наприклад, числові значення зазвичай не повинні котируватися як рядки.
jfpoilpret

+1 - список потенційно корисних бібліотек для JSON. Мене дивує, що жодна бібліотека не заснована на підході до функції зворотного виклику, який би викликався під час розбору (набагато ефективніше пам'яті).
jfpoilpret

Принаймні ви усвідомлюєте, що зразок вашого коду жахливий :-) Звичайно, це робиться робота, але вона не читається (кимось іншим, навіть самим за 6 місяців) і, отже, не піддається ремонту.
jfpoilpret

@jfpoilpret У мене немає пам’яті на мікросхемі, тому мені довелося в деяких місцях вирізати кути. Принаймні, це сильно коментується.
sachleen

Я розумію; але мені цікаво, якщо Stringвикористання не погіршує ситуацію з пам’яттю (так, Stringв Ардуїно - це мій вихованець).
jfpoilpret

7

Я запрограмував клас, який отримає знак char за документом JSON. Він лише збереже в пам’яті кілька байтів для відомої структури JSON за допомогою державної машини та необхідних результатів. Таким чином, ви можете запитувати клас для бажаних результатів і буде обробляти JSON.

Її ідеал для вашого призначення. Я використовував для підключення до погодної служби, яка повертає json:

static const char* queries[] = { "list.0.deg", "list.0.weather.0.main"};
StreamJsonReader jsonreader(queries, 2); // 2 queries    
while(char c  =  read()){
      jsonreader.process_char(c);
}

cout << jsonreader.results[0] << endl;
cout << jsonreader.results[1] << endl;

Перевірте щойно написане вами блогу: http://web.biicode.com/blog/big-json-on-arduino .

Вихідний код знаходиться тут у Biicode.


2

Я написав аналізатор для PIC, який має дуже низьке використання оперативної пам’яті, оскільки він працює безпосередньо з покажчиками char та не будує структури дерева. Якщо ви попросите отримати пункт N списку, він дає вам фактичний вказівник на прямий файл JSON прямо на початку пункту N списку. Потім ви можете запитати, який тип об’єкта вказує вказівник і т. Д. Він баггі і не підтримує плаває, і я думаю, що є кілька інших обмежень (давно давно), але все це на github: https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Вам потрібно буде шукати libfortune, що є частиною версії C.


1

Я написав просту бібліотеку JSON-RPC (поверх aJson) з прикладом того, як увімкнути світлодіодний виклик процедури JSON-RPC:


2
Чи можете ви додати ще якусь інформацію у свою відповідь, якщо посилання на код / ​​документацію зміниться ...
sachleen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.