Mir sind einige JSON-Parsing-Bibliotheken für Arduino bekannt.
Ich habe noch nie eines davon verwendet, aber ich habe in einem Projekt, an dem ich arbeite, ein einfaches JSON-Parsen durchgeführt, damit ich Ihnen zeigen kann, wie ich das gemacht habe.
HINWEIS: Ich lese serielle Daten mithilfe der Software-Serienbibliothek. Sie müssen diesen Code ändern, damit er für Sie funktioniert. Dies funktioniert nur mit sehr einfachen JSON-Zeichenfolgen. Es ist sehr begrenzt, aber wenn das alles ist, was Sie analysieren, dann wird es funktionieren.
Beispiel für eine JSON-Antwort vom Server:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
Lesen Sie zunächst nur Daten zwischen geschweiften Klammern.
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);
}
Dieser Code liest die Daten byteweise und beginnt, sobald er eine offene Klammer erhält, sie zu speichern response
. Wenn es eine schließende Klammer bekommt, endet es. Hier ist also eine klare Einschränkung: Sie können nur einen Satz öffnender / schließender Klammern in Ihrer Zeichenfolge haben.
Sobald ich den String habe, benutze indexOf
und substring
extrahiere ich relevante Informationen:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
Dieser Code setzt start
auf den Anfang von id":"
+ 5 Zeichen in der Zeichenfolge. Es ist +5, weil es so lang id":"
ist. So start
Punkte TEST1
in dem JSON - String. In meinem System wird die ID immer 5 Zeichen lang sein, also ist das Ende start + 5
. Ich benutze dann, um das substring
zu extrahieren.
Nochmals, bevor mich jemand für diese schreckliche Lösung abstimmt: Wenn Sie genau wissen, womit Sie arbeiten und die Einschränkungen dieses Codes verstehen, ist dies keine schlechte Lösung. Es ist eine Lösung, die den Job erledigt.
String
Verwendung die Gedächtnissituation nicht verschlimmert (ja,String
in Arduino ist mein Haustier ärgerlich).Ich habe eine Klasse programmiert, die char für char das JSON-Dokument erhält. Es werden nur einige Bytes für die bekannte JSON-Struktur unter Verwendung einer Zustandsmaschine und der von Ihnen benötigten Ergebnisse im Speicher gespeichert. Sie können also die Klasse nach den gewünschten Ergebnissen abfragen und JSON verarbeiten.
Es ist ideal für Ihren Zweck. Ich habe eine Verbindung zu einem Wetterdienst hergestellt, der einen JSON zurückgibt:
Überprüfen Sie diesen Blogeintrag, den ich gerade geschrieben habe: http://web.biicode.com/blog/big-json-on-arduino .
Der Quellcode ist hier in Biicode.
quelle
Ich habe einen Parser für den PIC geschrieben, der nur sehr wenig RAM verwendet, da er direkt mit Zeichenzeigern zusammenarbeitet und keine Baumstruktur erstellt. Wenn Sie nach Element N einer Liste fragen, erhalten Sie einen tatsächlichen Zeiger auf die direkte JSON-Datei direkt am Anfang von Element N der Liste. Dann können Sie fragen, für welche Art von Objekt der Zeiger steht. Es ist fehlerhaft und unterstützt keine Floats. Ich glaube, es gibt noch ein paar andere Einschränkungen (vor langer Zeit), aber alles auf github: https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Sie müssen in libfortune suchen, das Teil der C-Version ist.
quelle
Ich habe eine einfache JSON-RPC-Bibliothek (zusätzlich zu aJson) mit dem Beispiel geschrieben, wie eine LED mit einem JSON-RPC-Prozeduraufruf eingeschaltet wird:
quelle