Conozco algunas bibliotecas de análisis JSON para Arduino.
Nunca he usado ninguno de estos, pero hice un análisis JSON simple en un proyecto en el que estoy trabajando, así que te mostraré cómo lo hice.
NOTA: Estoy leyendo datos en serie usando la biblioteca en serie del software. Tendrá que cambiar este código para que funcione para usted. Esto solo funcionará en cadenas JSON muy simples. Es muy limitado, pero si eso es todo lo que está analizando, funcionará.
Ejemplo de respuesta JSON del servidor:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
Primero, solo lea los datos entre llaves.
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);
}
Este código lee los datos un byte a la vez y una vez que obtiene una llave abierta, comienza a guardarlos response
. Cuando obtiene una llave de cierre, la termina. Así que aquí hay una clara limitación, solo puede tener un conjunto de llaves de apertura / cierre en su cadena.
Una vez que tengo la cadena, uso indexOf
y substring
para extraer información relevante:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
Este código se establece start
al comienzo de id":"
+ 5 caracteres en la cadena. Es +5 porque así de largo id":"
es. Entonces start
apunta a TEST1
la cadena JSON. En mi sistema, la identificación siempre tendrá 5 caracteres, así que el final es start + 5
. Luego uso substring
para extraer eso.
Nuevamente, antes de que alguien empiece a votar por esta horrible solución: si sabe exactamente con qué está trabajando y comprende las limitaciones de este código, entonces esta no es una mala solución. Es una solución que hace el trabajo.
String
uso no empeora la situación de la memoria (sí,String
en Arduino es mi motivo favorito).He programado una clase que recibirá char by char el documento JSON. Solo almacenará en la memoria unos pocos bytes para la estructura JSON conocida utilizando una máquina de estado y los resultados que necesita. Para que pueda consultar en la clase los resultados que desea y procesará el JSON.
Es ideal para su propósito. Lo he usado para conectarme a un servicio meteorológico que devuelve un json:
Mira esta publicación de blog que acabo de escribir: http://web.biicode.com/blog/big-json-on-arduino .
El código fuente está aquí en Biicode.
fuente
Escribí un analizador para el PIC que tiene un uso de RAM muy bajo porque funciona directamente con punteros de caracteres y no construye una estructura de árbol. Si solicita obtener el elemento N de una lista, le proporciona un puntero real en el archivo JSON directo justo al comienzo del elemento N de la lista. Luego puede preguntar qué tipo de objeto representa el puntero, etc. Tiene errores y no admite flotadores y creo que tiene algunas otras limitaciones (hace mucho tiempo), pero todo está en github: https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Necesitará buscar en libfortune, que es parte de la versión C.
fuente
Escribí una biblioteca simple JSON-RPC (encima de aJson) con un ejemplo de cómo encender un led con la llamada al procedimiento JSON-RPC:
fuente