Como codificar e decodificar dados JSON no Arduino para IoT

JSON e XML são os formatos de serialização de dados mais comuns. A Internet é um centro de bilhões de dispositivos, aplicativos e serviços diferentes. Esses dispositivos e aplicativos são construídos em diferentes linguagens de programação e em diversas plataformas. Para que todos esses dispositivos e aplicativos totalmente diferentes se comuniquem entre si de maneira eficaz, os dados são serializados e desserializados nos terminais em um formato compartilhável. JSON e XML são as duas linguagens de marcação mais importantes no mundo da Internet que permitem a troca de dados entre diferentes plataformas, dispositivos e aplicativos de maneira padronizada. Os dispositivos e aplicativos serializam os dados no formato JSON ou XML antes de transmiti-los para a Internet. O dispositivo ou aplicativo receptor na outra extremidade da Internet desserializa os dados JSON/XML e extrai as informações necessárias de acordo com seu código de usuário.

Todos os dispositivos IoT também fazem parte do mesmo universo da Internet. A maioria dos dispositivos IoT usa o formato JSON para comunicar dados com um servidor, gateway ou outros dispositivos (na mesma rede). JSON é preferido ao XML porque é mais simples e menos detalhado. Para dispositivos IoT, mesmo uma pequena sobrecarga pode ser um grande fardo para dispositivos executados por microcontroladores. É por isso que a maioria dos dispositivos IoT usa JSON para trocar dados pela Internet. A maioria das plataformas e serviços IoT também usam essencialmente JSON, embora também possam usar o formato XML.

Neste artigo, discutiremos como Arduino e microcontroladores compatíveis com Arduino serializam e desserializam dados JSON para comunicação universal padrão nos domínios da IoT. O Arduino e suas placas compatíveis contam com a biblioteca ArduinoJSON para codificar e decodificar dados JSON para IoT e Internet.

O que é JSON?
JSON significa JavaScript object notation. É um formato leve de troca de dados baseado em texto. JSON é amplamente usado em aplicativos da web e APIs para trocar dados devido à sua simplicidade e compatibilidade com várias linguagens de programação. É usado para serializar e transmitir dados estruturados por uma conexão de rede, como dados trocados entre um servidor e um cliente. JSON é legível por humanos, bem como fácil para máquinas analisarem e gerarem.

Sintaxe JSON
A sintaxe do JSON é derivada da notação de objeto JavaScript, mas é independente da linguagem. JSON representa dados como pares nome/valor (semelhantes às propriedades de objetos JavaScript), matrizes ou uma combinação de ambos. Um objeto em JSON é colocado entre chaves { }. Dentro do objeto, os dados são representados como uma coleção de pares chave/valor. Um par chave/valor consiste em um nome de campo (entre aspas duplas), seguido por dois pontos (:), seguido por um valor. Vírgulas separam os pares chave/valor (,). Os valores em JSON podem ser strings (entre aspas duplas), números (inteiro ou ponto flutuante), valores booleanos (verdadeiro ou falso), matrizes, objetos ou nulos. Uma matriz em JSON é uma lista ordenada de valores e está entre colchetes . Vírgulas separam os valores na matriz (,). Os valores em um array podem ser objetos, números, strings, booleanos ou até mesmo outros arrays. Os dados representados em JSON têm a seguinte aparência:

{“chave1″:”valor1”, “chave2″:”valor2”, “chave3″:”valor3”,….}

A seguir está um exemplo válido de dados JSON:

{“temperatura”:25,21, “umidade”:59,07, “pressão”:1008,23}

Na maioria das vezes, os valores retornados por servidores ou aplicativos IoT em JSON são outros objetos JSON ou matrizes.

Arduino, IoT e JSON
JSON é um formato comum de intercâmbio de dados na Internet. Qualquer dispositivo IoT alimentado por Arduino ou um microcontrolador semelhante pode receber dados de um servidor web, API ou serviço web apenas no formato JSON. Como o JSON é simples e direto, até mesmo máquinas minúsculas como microcontroladores são capazes de analisá-lo e gerá-lo. A linguagem de marcação permite a transmissão de dados úteis sem qualquer sobrecarga extra. É por isso que a maioria dos aplicativos da web que alimentam dispositivos IoT trocam dados com dispositivos por meio de JSON. O mesmo acontece quando os dispositivos precisam enviar dados para um servidor web, API ou serviço web. Como os microcontroladores podem facilmente codificar dados em JSON, é o padrão de fato para dispositivos e aplicativos incorporados serializarem dados (como dados de sensores) para transmissão pela Internet. JSON permite que dispositivos IoT e plataformas e serviços IoT troquem dados em um espaço mínimo.

O que é ArduinoJSON?
Arduino e outros microcontroladores precisam estar conectados à Internet através de Ethernet ou WiFi para trocar dados pela Internet como um dispositivo IoT. Para Arduino, a placa precisa de um escudo Ethernet, ou se conecta à Internet através de uma placa de interrupção WiFi, ou deve ter funcionalidade WiFi ou Ethernet integrada. Do lado da programação, além das bibliotecas Ethernet ou WiFi, o Arduino e suas placas compatíveis precisam da biblioteca ArduinoJSON para codificar ou decodificar JSON para uma comunicação eficaz no cenário IoT.

ArduinoJSON foi projetado para ambientes restritos e otimizado para uso mínimo de memória, tornando-o adequado para microcontroladores com RAM limitada. Ele também oferece suporte à alocação de memória estática e dinâmica, proporcionando aos desenvolvedores flexibilidade com base em suas estratégias de gerenciamento de memória. A biblioteca também filtrará os dados JSON e os transformará em diferentes estruturas conforme a necessidade da aplicação; a biblioteca usa uma API semelhante a DOM, o que significa que ela pode analisar dados JSON em uma estrutura de árvore, facilitando a passagem e a extração de valores. Além disso, suporta alocação de memória estática e dinâmica, dando aos desenvolvedores flexibilidade nas estratégias de gerenciamento de memória.

Instalando a biblioteca ArduinoJSON
ArduinoJSON não está vinculado às bibliotecas Arduino por padrão. Portanto, você precisa instalar a biblioteca explicitamente no IDE do Arduino. Você pode baixar a versão mais recente da biblioteca aqui como um arquivo ZIP. Renomeie a pasta ZIP para ArduinoJSON. Abra o Arduino IDE e navegue até Sketch -> Incluir Biblioteca -> Adicionar Biblioteca .ZIP. Selecione a pasta ArduinoJSON ZIP e instale-a. Alternativamente, a biblioteca pode ser encontrada navegando em Ferramentas -> Gerenciar Bibliotecas e procurando ArduinoJSON na caixa de pesquisa. Selecione ArduinoJSON e clique no botão instalar. Depois de instalar a biblioteca, ela pode ser importada para um esboço usando a instrução a seguir.

#incluir

Classes e funções da biblioteca ArduinoJSON
A biblioteca ArduinoJSON inclui as seguintes classes:

  • Documento JSON Dinâmico
  • Documento estáticoJson
  • JsonDocumento
  • Par Json
  • JsonVariante
  • JsonObject
  • JSONArray
  • Erro de desserialização

Documento JSON Dinâmico
Esta classe representa um documento JSON e usa alocação dinâmica de memória. É adequado para situações em que o tamanho do documento JSON pode variar. A memória do documento é alocada no heap, tornando-o mais flexível, mas um pouco mais lento que StaticJsonDocument. A classe fornece as seguintes funções úteis na manipulação de documentos JSON:

  • clear : Limpa o documento e libera toda a memória.
  • capacidade : Retorna a capacidade atual do documento.
  • ShrinkToFit : Reduz a capacidade para corresponder ao uso atual.
  • as : Converte o documento para um tipo específico (como JsonObject ou JsonArray).
  • to : Cria uma cópia do documento como um tipo específico.
  • operador : fornece acesso aos elementos do objeto ou array JSON.
  • memoryUsage : Retorna a quantidade de memória utilizada pelo documento.

Documento estáticoJson
Esta classe é semelhante a DynamicJsonDocument, mas usa alocação de memória estática. É mais rápido e mais eficiente em termos de memória para documentos JSON menores e de tamanho fixo, pois a memória é alocada na pilha. Esta classe é mais adequada para ambientes com recursos de memória limitados. Ele fornece as mesmas funções que a classe DynamicJsonDocument.

Documento Json
Esta é uma classe base para DynamicJsonDocument e StaticJsonDocument. Ele fornece a funcionalidade comum entre essas duas classes, como analisar dados JSON de uma string ou fluxo e serializar o documento JSON de volta para uma string ou fluxo. Esta classe fornece as seguintes funções:

  • deserializeJson : analisa uma string JSON ou fluxo no documento.
  • serializeJson : serializa o documento em uma string ou fluxo JSON.
  • to : converte o documento em JsonObject.
  • to : converte o documento em JsonArray.

JsonPair
Esta classe permite manipular um par chave-valor em um JsonObject. Esta classe é útil ao iterar todos os elementos em um JsonObject. Esta classe fornece as seguintes funções:

  • key : Retorna a chave do par chave-valor.
  • value : Retorna o valor do par chave-valor.

JsonVariante
Esta classe permite manipular um valor JSON, que pode ser qualquer tipo de dados JSON: um número, uma string, um booleano, um array (JsonArray), um objeto (JsonObject) ou nulo. Ele fornece funções para converter entre tipos e verificar o tipo real do valor armazenado. Esta classe fornece as seguintes funções:

  • as : Converte o valor para um tipo especificado.
  • is : Verifica se o valor pode ser convertido para um tipo especificado.
  • to : Cria uma cópia do valor como um tipo especificado.
  • set : atribui um novo valor.
  • clear : redefine o valor para nulo.

JsonObject
Esta classe permite manipular um objeto JSON, uma coleção de pares chave-valor. Permite adicionar, acessar e remover membros. As chaves são strings e os valores podem ser de vários tipos, incluindo JsonArray ou JsonObject aninhados. Esta classe fornece as seguintes funções:

  • createNestedObject : Cria um JsonObject aninhado.
  • createNestedArray : Cria um JsonArray aninhado.
  • containsKey : Verifica se o objeto contém uma chave especificada.
  • remove : Remove o elemento com a chave especificada.
  • clear : Remove todos os pares chave-valor do objeto.
  • size : Retorna o número de pares de valores-chave.
  • start / end : Fornece iteradores para percorrer o objeto.
  • operador : acessa ou modifica um valor associado a uma chave.

JSONArray
Esta classe permite manipular um array JSON. Ele fornece funções para adicionar, remover e acessar elementos do array. Você pode iterar sobre os elementos em um JsonArray. Esta classe fornece as seguintes funções.

  • add : Adiciona um novo elemento no final do array.
  • remove : Remove o elemento no índice especificado.
  • clear : Remove todos os elementos do array.
  • size : Retorna o número de elementos do array.
  • start / end : Fornece iteradores para percorrer o array.
  • operador : acessa um elemento em um índice especificado.

Erro de desserialização
Ao analisar dados JSON, esta classe é usada para representar o resultado. Indica se a desserialização foi bem-sucedida ou se ocorreu um erro. Ele fornece métodos para verificar o tipo de erro e recuperar uma mensagem de erro. Esta classe fornece as seguintes funções.

  • code : Retorna o código do erro.
  • c_str : Retorna uma representação de string no estilo C da mensagem de erro.

Analisando dados JSON com Arduino
A análise e desserialização de dados JSON de um servidor web, API ou serviço web envolve as seguintes etapas:

  1. Incluir a biblioteca ArduinoJSON: Primeiro, inclua a biblioteca ArduinoJSON em seu esboço do Arduino. A biblioteca deve ser instalada no Arduino IDE. A biblioteca é incluída em um esboço usando a seguinte instrução:

#includeArduinoJson.h>

  1. Aloque um documento JSON: Em seguida, você precisa criar um objeto JsonDocument. Você pode escolher entre DynamicJsonDocument e StaticJsonDocument de acordo com sua estratégia de gerenciamento de memória. A instrução a seguir cria um documento JSON dinâmico com 1.024 bytes de tamanho:

Documento DynamicJsonDocument(1024);

  1. Analise dados JSON: busque dados JSON em uma string e desserialize-os no documento JSON. A seguir está um exemplo válido de análise de uma string JSON.

const char* jsonString = “{\”sensor\”:\”gps\”,\”tempo\”:1351824120,\”dados\”:(48.756080,2.302038)}”;
Erro DeserializationError = deserializeJson(doc, jsonString);
se (erro) {
Serial.print(“deserializeJson falhou: “);
Serial.println(error.c_str );
retornar;
}

  1. Acesse dados específicos: depois que o JSON for desserializado, você poderá acessar os dados usando o JsonDocument. A seguir está um exemplo válido de acesso a valores específicos de um documento JSON desserializado.

const char* sensor = doc(“sensor”); // “GPS”
muito tempo = doc(“tempo”); //1351824120
latitude dupla = doc(“dados”)(0); //48.756080
longitude dupla = doc(“dados”)(1); //2.302038

Os objetos e matrizes aninhados também são acessados ​​de forma semelhante aos pares de valores-chave regulares. Lembre-se de que você deve sempre verificar o tamanho dos seus dados JSON e ajustar o tamanho do JsonDocument de acordo. O tamanho necessário do documento JSON pode ser calculado usando o ArduinoJson Assistant, que está disponível no site ArduinoJSON.

Gerando dados JSON com Arduino
A geração e serialização de dados JSON usando a biblioteca ArduinoJSON envolve a criação de um JsonDocument, seu preenchimento com dados e a serialização desses dados em uma string JSON. Envolve as seguintes etapas:

  1. Incluir a biblioteca ArduinoJSON: Primeiro, inclua a biblioteca ArduinoJSON em seu esboço do Arduino. A biblioteca deve ser instalada no Arduino IDE. A biblioteca é incluída em um esboço usando a seguinte instrução:

#includeArduinoJson.h>

  1. Crie um documento JSON: Em seguida, você precisa criar um objeto JsonDocument. Você pode escolher entre DynamicJsonDocument e StaticJsonDocument de acordo com sua estratégia de gerenciamento de memória. A instrução a seguir cria um documento JSON dinâmico com 1.024 bytes de tamanho.

Documento DynamicJsonDocument(1024);

  1. Preencha o documento JSON: adicione dados ao JsonDocument. O documento pode consistir em valores, matrizes ou objetos aninhados. A seguir está um exemplo válido de preenchimento de um documento JSON:

doc(“sensor”) = “gps”;
doc(“tempo”) = 1351824120;
dados JsonArray = doc.createNestedArray(“dados”);
dados.add(48.756080);
dados.add(2.302038);

  1. Serialize o documento JSON: por fim, converta o JsonDocument em uma string JSON usando serializeJson. Você pode serializá-lo diretamente em uma String, um array de caracteres ou qualquer fluxo de saída (como Serial). A seguir está um exemplo válido de serialização do documento JSON.

Saída de string;
serializeJson(doc,saída);

Para serializar o documento para a porta serial do Arduino, use a seguinte instrução.

serializeJson(doc,Serial);

O documento JSON deve ser grande o suficiente para conter todo o objeto JSON. Você pode usar o ArduinoJson Assistant para calcular o tamanho necessário. Lembre-se de que cada adição ao documento consome memória. Portanto, tome cuidado com as restrições de memória, especialmente em microcontroladores menores. O JSON serializado está em formato compacto. Se precisar de um formato legível por humanos, você pode usar a função serializeJsonPretty em vez de serializeJson .

Conclusão
Sempre que um dispositivo IoT comunica dados com um servidor web, API ou serviço web, os dados são recebidos no formato JSON ou precisam ser serializados no formato JSON. A linguagem de marcação é um padrão para troca de dados pela internet por dispositivos, aplicativos e plataformas. No Arduino e placas compatíveis, a codificação e decodificação de documentos JSON é possível com a ajuda da biblioteca ArduinoJSON. A biblioteca ajuda a decodificar documentos JSON recebidos de um servidor/API/serviço web por meio de uma solicitação HTTP e extrai os valores necessários do documento. A biblioteca também é útil para serializar dados em JSON para transmissão a um servidor web ou API.

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.