Znam kilka bibliotek parsujących JSON dla Arduino.
Nigdy nie użyłem żadnego z nich, ale wykonałem kilka prostych analiz JSON w projekcie, nad którym pracuję, więc pokażę ci, jak to zrobiłem.
UWAGA: Czytam dane szeregowe za pomocą biblioteki oprogramowania szeregowego. Musisz zmienić ten kod, aby działał dla Ciebie. Działa to tylko na bardzo prostych ciągach JSON. Jest bardzo ograniczony, ale jeśli to wszystko, co analizujesz, to zadziała.
Przykład odpowiedzi JSON z serwera:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
Po pierwsze, czytaj tylko dane między nawiasami klamrowymi.
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);
}
Ten kod odczytuje dane jeden bajt na raz, a kiedy otrzyma otwarty nawias klamrowy, zaczyna zapisywać go response
. Kiedy dostaje nawias zamykający, kończy go. Oto wyraźne ograniczenie, możesz mieć tylko jeden zestaw nawiasów otwierających / zamykających w swoim ciągu.
Po otrzymaniu ciągu używam indexOf
i substring
wyodrębniam odpowiednie informacje:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
Ten kod ustawia start
początek id":"
+ 5 znaków w ciągu. To +5, bo tyle id":"
trwa. start
Wskazuje więc TEST1
na ciąg JSON. W moim systemie identyfikator ma zawsze 5 znaków, więc koniec start + 5
. Następnie używam substring
do wyodrębnienia tego.
Ponownie, zanim ktokolwiek zacznie głosować za tym okropnym rozwiązaniem: jeśli dokładnie wiesz, nad czym pracujesz i rozumiesz ograniczenia tego kodu, nie jest to złe rozwiązanie. To rozwiązanie pozwala wykonać zadanie.
String
użycie nie pogorszy sytuacji w pamięci (tak,String
w Arduino jest mój wkurzony zwierzak).Zaprogramowałem klasę, która otrzyma char przez char dokument JSON. Będzie przechowywać tylko w pamięci kilka bajtów dla znanej struktury JSON przy użyciu maszyny stanów i potrzebnych wyników. Możesz więc zapytać klasę o pożądane wyniki i przetworzy JSON.
Jest idealny do Twoich celów. Użyłem połączenia z usługą pogodową, która zwraca JSON:
Sprawdź ten post na blogu, który właśnie napisałem: http://web.biicode.com/blog/big-json-on-arduino .
Kod źródłowy jest tutaj w Biicode.
źródło
Napisałem parser dla PIC, który ma bardzo niskie wykorzystanie pamięci RAM, ponieważ działa bezpośrednio z wskaźnikami char i nie buduje struktury drzewa. Jeśli poprosisz o pobranie elementu N z listy, otrzymasz rzeczywisty wskaźnik do bezpośredniego pliku JSON na początku elementu N z listy. Następnie możesz zapytać, jaki typ obiektu reprezentuje wskaźnik itp. Jest błędny i nie obsługuje pływaków, i myślę, że ma kilka innych ograniczeń (dawno temu), ale wszystko jest na github: https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Musisz zajrzeć do libfortune, który jest częścią wersji C.
źródło
Napisałem prostą bibliotekę JSON-RPC (na górze aJson) z przykładem, jak włączyć diodę LED za pomocą wywołania procedury JSON-RPC:
źródło