Je connais quelques bibliothèques d'analyse JSON pour Arduino.
Je n'en ai jamais utilisé, mais j'ai fait une analyse JSON simple dans un projet sur lequel je travaille, je vais donc vous montrer comment j'ai fait cela.
REMARQUE: je lis les données série à l'aide de la bibliothèque série du logiciel. Vous devrez modifier ce code pour qu'il fonctionne pour vous. Cela ne fonctionnera que sur des chaînes JSON très simples. C'est très limité, mais si c'est tout ce que vous analysez, cela fonctionnera.
Exemple de réponse JSON du serveur:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
Tout d'abord, lisez uniquement les données entre accolades.
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);
}
Ce code lit les données un octet à la fois et une fois qu'il reçoit une accolade ouverte, il commence à les enregistrer response
. Quand il obtient un corset de fermeture, il le termine. Voici donc une limitation claire, vous ne pouvez avoir qu'un seul ensemble d'accolades d'ouverture / fermeture dans votre chaîne.
Une fois que j'ai la chaîne, j'utilise indexOf
et substring
pour extraire les informations pertinentes:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
Ce code définit start
au début de id":"
+ 5 caractères dans la chaîne. C'est +5 parce que c'est combien de temps id":"
. Ainsi , les start
points à TEST1
la chaîne JSON. Dans mon système, l'ID comportera toujours 5 caractères, la fin l'est donc start + 5
. J'utilise ensuite substring
pour extraire cela.
Encore une fois, avant que quelqu'un ne me vote pour cette horrible solution: si vous savez exactement avec quoi vous travaillez et comprenez les limites de ce code, ce n'est pas une mauvaise solution. C'est une solution qui fait le travail.
String
utilisation n'aggrave pas la situation de la mémoire (oui,String
en Arduino est ma bête noire).J'ai programmé une classe qui recevra caractère par caractère le document JSON. Il ne stockera en mémoire que quelques octets pour la structure JSON connue en utilisant une machine d'état et les résultats dont vous avez besoin. Vous pouvez donc interroger la classe pour obtenir les résultats souhaités et traiter le JSON.
Son idéal pour votre but. J'ai utilisé pour me connecter à un service météo qui renvoie un json:
Consultez ce billet de blog que je viens d'écrire: http://web.biicode.com/blog/big-json-on-arduino .
Le code source est ici en Biicode.
la source
J'ai écrit un analyseur pour le PIC qui utilise très peu de RAM car il fonctionne directement avec les pointeurs char et ne construit pas une structure arborescente. Si vous demandez à obtenir l'élément N d'une liste, cela vous donne un pointeur réel dans le fichier JSON direct juste au début de l'élément N de la liste. Ensuite , vous pouvez demander à quel type d'objet représente le pointeur, etc. Il est boguée et ne supporte pas les flotteurs et je pense a quelques autres limitations (TWAS il y a longtemps) , mais il est tout sur github: https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Vous devrez regarder dans libfortune qui fait partie de la version C.
la source
J'ai écrit une bibliothèque JSON-RPC simple (au-dessus de aJson) avec un exemple de comment allumer une led avec l'appel de procédure JSON-RPC:
la source