JSON y XML son los formatos de serialización de datos más comunes. Internet es un centro para miles de millones de dispositivos, aplicaciones y servicios diferentes. Estos dispositivos y aplicaciones están construidos en diferentes lenguajes de programación y en diferentes plataformas. Para que todos estos dispositivos y aplicaciones tremendamente diferentes se comuniquen entre sí de manera efectiva, los datos se serializan y deserializan en los puntos finales en un formato que se puede compartir. JSON y XML son los dos lenguajes de marcado más importantes del mundo de Internet que permiten intercambiar datos entre diferentes plataformas, dispositivos y aplicaciones de forma estandarizada. Los dispositivos y aplicaciones serializan datos en formato JSON o XML antes de transmitirlos a Internet. El dispositivo o aplicación receptor en el otro extremo de Internet deserializa los datos JSON/XML y extrae la información necesaria según su código de usuario.
Todos los dispositivos IoT también forman parte del mismo universo de Internet. La mayoría de los dispositivos IoT utilizan el formato JSON para comunicar datos con un servidor, puerta de enlace u otros dispositivos (en la misma red). Se prefiere JSON a XML porque es más simple y menos detallado. Para los dispositivos IoT, incluso una pequeña sobrecarga puede ser una gran carga para los dispositivos que funcionan con microcontroladores. Es por eso que la mayoría de los dispositivos IoT utilizan JSON para intercambiar datos a través de Internet. La mayoría de las plataformas y servicios de IoT también utilizan esencialmente JSON, aunque también pueden utilizar el formato XML.
En este artículo, analizaremos cómo los microcontroladores Arduino y compatibles con Arduino serializan y deserializan datos JSON para la comunicación universal estándar en dominios de IoT. Arduino y sus placas compatibles dependen de la biblioteca ArduinoJSON para codificar y decodificar datos JSON para IoT e Internet.
¿Qué es JSON?
JSON significa notación de objetos JavaScript. Es un formato ligero de intercambio de datos basado en texto. JSON se utiliza ampliamente en aplicaciones web y API para intercambiar datos debido a su simplicidad y compatibilidad con varios lenguajes de programación. Se utiliza para serializar y transmitir datos estructurados a través de una conexión de red, como datos intercambiados entre un servidor y un cliente. JSON es legible por humanos y fácil de analizar y generar para las máquinas.
Sintaxis JSON
La sintaxis JSON se deriva de la notación de objetos de JavaScript, pero es independiente del lenguaje. JSON representa datos como pares de nombre/valor (similar a las propiedades de objetos de JavaScript), matrices o una combinación de ambos. Un objeto en JSON está encerrado entre llaves { }. Dentro del objeto, los datos se representan como una colección de pares clave/valor. Un par clave/valor consta de un nombre de campo (entre comillas dobles), seguido de dos puntos (:), seguido de un valor. Las comas separan los pares clave/valor (,). Los valores en JSON pueden ser cadenas (entre comillas dobles), números (enteros o de punto flotante), valores booleanos (verdaderos o falsos), matrices, objetos o valores nulos. Una matriz en JSON es una lista ordenada de valores y está entre corchetes. Las comas separan los valores de la matriz (,). Los valores de una matriz pueden ser objetos, números, cadenas, valores booleanos o incluso otras matrices. Los datos representados en JSON tienen este aspecto:
{“clave1″:”valor1”, “clave2″:”valor2”, “clave3″:”valor3”,….}
El siguiente es un ejemplo válido de datos JSON:
{“temperatura”:25.21, “humedad”:59.07, “presión”:1008.23}
La mayoría de las veces, los valores devueltos por los servidores o aplicaciones de IoT en JSON son otros objetos o matrices JSON.
Arduino, IoT y JSON
JSON es un formato de intercambio de datos común en Internet. Cualquier dispositivo IoT impulsado por Arduino o un microcontrolador similar puede recibir datos de un servidor web, API o servicio web únicamente en formato JSON. Debido a que JSON es simple y directo, incluso máquinas pequeñas como los microcontroladores son capaces de analizarlo y generarlo. El lenguaje de marcado permite la transmisión de datos útiles sin ningún gasto adicional. Es por eso que la mayoría de las aplicaciones web que alimentan los dispositivos IoT intercambian datos con dispositivos a través de JSON. Lo mismo ocurre cuando los dispositivos necesitan enviar datos a un servidor web, API o servicio web. Debido a que los microcontroladores pueden codificar datos fácilmente en JSON, es el estándar de facto para que los dispositivos y aplicaciones integrados serialicen datos (como datos de sensores) para su transmisión a través de Internet. JSON permite que los dispositivos IoT y las plataformas y servicios de IoT intercambien datos en un espacio mínimo.
¿Qué es ArduinoJSON?
Arduino y otros microcontroladores deben estar conectados a Internet a través de Ethernet o WiFi para intercambiar datos a través de Internet como un dispositivo IoT. Para Arduino, la placa necesita un escudo Ethernet, o se conecta a Internet a través de una placa de conexión WiFi, o debe tener funcionalidad WiFi o Ethernet incorporada. En el lado de la programación, además de las bibliotecas Ethernet o WiFi, Arduino y sus placas compatibles necesitan la biblioteca ArduinoJSON para codificar o decodificar JSON para una comunicación efectiva en el escenario de IoT.
ArduinoJSON está diseñado para entornos restringidos y optimizado para un uso mínimo de memoria, lo que lo hace adecuado para microcontroladores con RAM limitada. También admite la asignación de memoria estática y dinámica, lo que brinda a los desarrolladores flexibilidad según sus estrategias de administración de memoria. La biblioteca también filtrará los datos JSON y los transformará en diferentes estructuras según las necesidades de la aplicación; La biblioteca utiliza una API similar a DOM, lo que significa que puede analizar datos JSON en una estructura de árbol, lo que facilita la transferencia y extracción de valores. Además, admite la asignación de memoria estática y dinámica, lo que brinda a los desarrolladores flexibilidad en las estrategias de administración de la memoria.
Instalación de la biblioteca ArduinoJSON
ArduinoJSON no está vinculado a las bibliotecas de Arduino de forma predeterminada. Por lo tanto, debe instalar la biblioteca explícitamente en el IDE de Arduino. Puede descargar la última versión de la biblioteca aquí como un archivo ZIP. Cambie el nombre de la carpeta ZIP a ArduinoJSON. Abra el IDE de Arduino y navegue hasta Sketch -> Agregar biblioteca -> Agregar biblioteca .ZIP. Seleccione la carpeta ZIP ArduinoJSON e instálela. Alternativamente, la biblioteca se puede encontrar navegando a Herramientas -> Administrar bibliotecas y buscando ArduinoJSON en el cuadro de búsqueda. Seleccione ArduinoJSON y haga clic en el botón instalar. Después de instalar la biblioteca, se puede importar a un boceto siguiendo las siguientes instrucciones.
#incluir
Clases y funciones de la biblioteca ArduinoJSON
La biblioteca ArduinoJSON incluye las siguientes clases:
- Documento JSON dinámico
- Documento estático Json
- Documento Json
- Par Json
- Variante Json
- Objeto Json
- Matriz JSON
- Error de deserialización
Documento JSON dinámico
Esta clase representa un documento JSON y utiliza asignación de memoria dinámica. Es adecuado para situaciones en las que el tamaño del documento JSON puede variar. La memoria de documentos se asigna en el montón, lo que la hace más flexible pero un poco más lenta que StaticJsonDocument. La clase proporciona las siguientes funciones útiles para manipular documentos JSON:
- clear: borra el documento y libera toda la memoria.
- capacidad: Devuelve la capacidad actual del documento.
- ShrinkToFit: reduce la capacidad para que coincida con el uso actual.
- hacia
: convierte el documento a un tipo específico (como JsonObject o JsonArray). - Soy
: Crea una copia del documento como un tipo específico. - operador: Proporciona acceso a los elementos del objeto o matriz JSON.
- MemoryUsage: Devuelve la cantidad de memoria utilizada por el documento.
Documento estático Json
Esta clase es similar a DynamicJsonDocument, pero utiliza asignación de memoria estática. Es más rápido y eficiente en cuanto a memoria para documentos JSON más pequeños y de tamaño fijo porque la memoria se asigna en la pila. Esta clase es más adecuada para entornos con recursos de memoria limitados. Proporciona las mismas funciones que la clase DynamicJsonDocument.
Documento json
Esta es una clase base para DynamicJsonDocument y StaticJsonDocument. Proporciona la funcionalidad común entre estas dos clases, como analizar datos JSON de una cadena o secuencia y serializar el documento JSON nuevamente en una cadena o secuencia. Esta clase proporciona las siguientes funciones:
- deserializeJson: analiza una cadena o secuencia JSON en el documento.
- serializeJson: serializa el documento en una cadena o secuencia JSON.
- Soy
: convierte el documento a JsonObject. - Soy
: convierte el documento a JsonArray.
Par Json
Esta clase le permite manipular un par clave-valor en un JsonObject. Esta clase es útil cuando se itera sobre todos los elementos de un JsonObject. Esta clase proporciona las siguientes funciones:
- clave: Devuelve la clave del par clave-valor.
- valor: Devuelve el valor del par clave-valor.
Variante Json
Esta clase le permite manipular un valor JSON, que puede ser cualquier tipo de datos JSON: un número, una cadena, un booleano, una matriz (JsonArray), un objeto (JsonObject) o nulo. Proporciona funciones para convertir entre tipos y verificar el tipo real del valor almacenado. Esta clase proporciona las siguientes funciones:
- hacia
: convierte el valor a un tipo especificado. - es
: Comprueba si el valor se puede convertir a un tipo específico. - Soy
: Crea una copia del valor como un tipo especificado. - set: asigna un nuevo valor.
- claro: restablece el valor a nulo.
Objeto Json
Esta clase le permite manipular un objeto JSON, una colección de pares clave-valor. Le permite agregar, acceder y eliminar miembros. Las claves son cadenas y los valores pueden ser de varios tipos, incluidos JsonArray o JsonObject anidados. Esta clase proporciona las siguientes funciones:
- createNestedObject: crea un JsonObject anidado.
- createNestedArray: crea un JsonArray anidado.
- containsKey: comprueba si el objeto contiene una clave especificada.
- remove: Elimina el elemento con la clave especificada.
- clear: elimina todos los pares clave-valor del objeto.
- tamaño: Devuelve el número de pares clave-valor.
- inicio/fin: proporciona iteradores para atravesar el objeto.
- operador: accede o modifica un valor asociado a una clave.
Matriz JSON
Esta clase le permite manipular una matriz JSON. Proporciona funciones para agregar, eliminar y acceder a elementos de matriz. Puede iterar sobre los elementos en un JsonArray. Esta clase proporciona las siguientes funciones.
- add: Agrega un nuevo elemento al final de la matriz.
- remove: Elimina el elemento en el índice especificado.
- claro: elimina todos los elementos de la matriz.
- tamaño: Devuelve el número de elementos de la matriz.
- inicio/fin: proporciona iteradores para atravesar la matriz.
- operador: accede a un elemento en un índice específico.
Error de deserialización
Al analizar datos JSON, esta clase se utiliza para representar el resultado. Indica si la deserialización fue exitosa o se produjo un error. Proporciona métodos para comprobar el tipo de error y recuperar un mensaje de error. Esta clase proporciona las siguientes funciones.
- código: Devuelve el código de error.
- c_str: Devuelve una representación de cadena estilo C del mensaje de error.
Analizando datos JSON con Arduino
Analizar y deserializar datos JSON de un servidor web, API o servicio web implica los siguientes pasos:
- Incluya la biblioteca ArduinoJSON: Primero, incluya la biblioteca ArduinoJSON en su boceto de Arduino. La biblioteca debe estar instalada en el IDE de Arduino. La biblioteca se incluye en un boceto utilizando la siguiente declaración:
#incluyeArduinoJson.h>
- Asigne un documento JSON: a continuación, debe crear un objeto JsonDocument. Puede elegir entre DynamicJsonDocument y StaticJsonDocument según su estrategia de gestión de memoria. La siguiente declaración crea un documento JSON dinámico con un tamaño de 1024 bytes:
Documento DynamicJsonDocument(1024);
- Analizar datos JSON: obtenga datos JSON en una cadena y deserialícelos en el documento JSON. El siguiente es un ejemplo válido de análisis de una cadena JSON.
const char* jsonString = “{\”sensor\”:\”gps\”,\”time\”:1351824120,\”data\”:(48.756080,2.302038)}”;
Error DeserializationError = deserializeJson(doc, jsonString);
si (error) {
Serial.print(“falló deserializeJson: “);
Serial.println(error.c_str);
volver;
}
- Acceda a datos específicos: una vez que se deserializa el JSON, puede acceder a los datos utilizando JsonDocument. El siguiente es un ejemplo válido de cómo acceder a valores específicos desde un documento JSON deserializado.
const char* sensor = doc(“sensor”); // "GPS"
mucho tiempo = doc(“tiempo”); //1351824120
doble latitud = doc(“datos”)(0); //48.756080
doble longitud = doc(“datos”)(1); //2.302038
También se accede a los objetos y matrices anidados de forma similar a los pares clave-valor normales. Recuerde que siempre debe verificar el tamaño de sus datos JSON y ajustar el tamaño de JsonDocument en consecuencia. El tamaño requerido del documento JSON se puede calcular utilizando el Asistente ArduinoJson, que está disponible en el sitio web de ArduinoJSON.
Generando datos JSON con Arduino
Generar y serializar datos JSON utilizando la biblioteca ArduinoJSON implica crear un JsonDocument, llenarlo con datos y serializar esos datos en una cadena JSON. Implica los siguientes pasos:
- Incluya la biblioteca ArduinoJSON: Primero, incluya la biblioteca ArduinoJSON en su boceto de Arduino. La biblioteca debe estar instalada en el IDE de Arduino. La biblioteca se incluye en un boceto utilizando la siguiente declaración:
#incluyeArduinoJson.h>
- Cree un documento JSON: a continuación, debe crear un objeto JsonDocument. Puede elegir entre DynamicJsonDocument y StaticJsonDocument según su estrategia de gestión de memoria. La siguiente declaración crea un documento JSON dinámico con un tamaño de 1024 bytes.
Documento DynamicJsonDocument(1024);
- Complete el documento JSON: agregue datos al JsonDocument. El documento puede constar de valores, matrices u objetos anidados. El siguiente es un ejemplo válido de cómo completar un documento JSON:
documento(“sensor”) = “gps”;
doc(“hora”) = 1351824120;
Datos JsonArray = doc.createNestedArray(“datos”);
datos.add(48.756080);
datos.add(2.302038) ;
- Serializar el documento JSON: Finalmente, convierta el JsonDocument en una cadena JSON usando serializeJson. Puede serializarlo directamente en una cadena, una matriz de caracteres o cualquier flujo de salida (como Serial). A continuación se muestra un ejemplo válido de serialización de documentos JSON.
Salida de cadena;
serializeJson(doc,salida);
Para serializar el documento al puerto serie de Arduino, utilice las siguientes instrucciones.
serializeJson(doc,Serial);
El documento JSON debe ser lo suficientemente grande como para contener todo el objeto JSON. Puede utilizar ArduinoJson Assistant para calcular el tamaño requerido. Recuerde que cada adición al documento consume memoria. Así que tenga cuidado con las limitaciones de memoria, especialmente en microcontroladores más pequeños. JSON serializado está en formato compacto. Si necesita un formato legible por humanos, puede usar la función serializeJsonPretty en lugar de serializeJson.
Conclusión
Siempre que un dispositivo IoT comunica datos con un servidor web, API o servicio web, los datos se reciben en formato JSON o deben serializarse en formato JSON. El lenguaje de marcado es un estándar para el intercambio de datos a través de Internet entre dispositivos, aplicaciones y plataformas. En Arduino y placas compatibles, es posible codificar y decodificar documentos JSON con la ayuda de la biblioteca ArduinoJSON. La biblioteca ayuda a decodificar documentos JSON recibidos de un servidor/API/servicio web a través de una solicitud HTTP y extrae los valores requeridos del documento. La biblioteca también es útil para serializar datos en JSON para transmitirlos a un servidor web o API.