Estou ciente de algumas bibliotecas de análise JSON para Arduino.
Eu nunca usei nenhum desses, mas fiz uma análise JSON simples em um projeto em que estou trabalhando, por isso vou mostrar como fiz isso.
NOTA: Estou lendo dados seriais usando a biblioteca serial do software. Você precisará alterar esse código para trabalhar para você. Isso funcionará apenas em cadeias JSON muito simples. É muito limitado, mas se é tudo o que você está analisando, funcionará.
Exemplo de resposta JSON do servidor:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
Primeiro, leia apenas os dados entre chaves.
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);
}
Esse código lê os dados um byte de cada vez e, quando recebe uma chave aberta, começa a salvá-la response
. Quando recebe uma chave de fechamento, ela termina. Portanto, aqui está uma limitação clara: você pode ter apenas um conjunto de chaves de abertura / fechamento em sua string.
Depois de obter a string, uso indexOf
e substring
para extrair informações relevantes:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
Esse código define start
o início de id":"
+ 5 caracteres na string. É +5 porque é quanto tempo id":"
é. Então, start
aponta para TEST1
na cadeia JSON. No meu sistema, o ID sempre terá 5 caracteres, assim como o fim start + 5
. Eu então uso substring
para extrair isso.
Novamente, antes que alguém comece a votar em mim para esta solução horrível: se você sabe exatamente com o que está trabalhando e entende as limitações deste código, essa não é uma solução ruim. É uma solução que faz o trabalho.
String
uso não piora a situação da memória (sim,String
no Arduino está minha irritação).Programei uma classe que receberá char por char o documento JSON. Ele armazenará apenas alguns bytes na estrutura JSON conhecida, usando uma máquina de estado e os resultados necessários. Portanto, você pode consultar os resultados da classe e processar o JSON.
É ideal para o seu propósito. Eu usei para conectar a um serviço meteorológico que retorna um json:
Confira este post que acabei de escrever: http://web.biicode.com/blog/big-json-on-arduino .
O código fonte está aqui no Biicode.
fonte
Eu escrevi um analisador para o PIC que tem uso de memória RAM muito baixo, porque funciona diretamente com ponteiros de char e não constrói uma estrutura de árvore. Se você solicitar o item N de uma lista, ele fornecerá um ponteiro real para o arquivo JSON direto logo no início do item N da lista. Então você pode perguntar que tipo de objeto o ponteiro representa, etc. É buggy e não suporta flutuadores. Acho que tem algumas outras limitações (há muito tempo), mas está tudo no github: https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Você precisará procurar no libfortune que faz parte da versão C.
fonte
Eu escrevi uma biblioteca JSON-RPC simples (em cima de aJson) com um exemplo de como ativar um led com chamada de procedimento JSON-RPC:
fonte