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.