Привет я пытаюсь разобрать JSON Resposne от веб-сервера в моем Arduino, чтобы включить и выключить светодиод. Я использую пример повторения клиента Wi-Fi, чтобы сделать запрос на получение моего сервера:
http://arduino.cc/en/Tutorial/WiFiWebClientRepeating
Вот что я получаю обратно из последовательного порта при запуске
WiFiClient client;
char c = client.read();
Serial.write(c);
результаты последовательного порта
connecting...
HTTP/1.1 200 OK
Date: Sun, 06 Apr 2014 01:14:37 GMT
Server: Apache
X-Powered-By: PHP/5.5.10
Cache-Control: no-cache
X-Frame-Options: SAMEORIGIN
Set-Cookie: expires=Sun, 06-Apr-2014 03:14:37 GMT; Max-Age=7200; path=/; httponly
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json
19
{"lightstatus":"on"}
0
Как мне проанализировать JSON-часть этого ответа только для того, чтобы я мог использовать его для управления своим светодиодом?
Спасибо
хорошо, даже JSON «трудно» разобрать для arduino. Таким образом, вы должны рассмотреть вопрос о том, чтобы как можно больше ответить, используя 1
/0
целые числа вместо "on"
например.
То, что вам нужно для запуска, это в основном граф состояний:
if ('{' == client.read())
if ('"' == client.read())
if ('l' == client.read())
if ('i' == client.read())
if ('g' == client.read())
if ('h' == client.read())
if ('t' == client.read())
if ('s' == client.read())
if ('t' == client.read())
if ('a' == client.read())
if ('t' == client.read())
if ('u' == client.read())
if ('s' == client.read())
if ('"' == client.read())
if (':' == client.read()) {
char c = client.read();
if (c == '1')
// TURN LIGHT ON
else if (c == '0')
// TURN LIGHT OFF
}
что можно улучшить, используя строку и сохраняя состояние в индексной переменной:
const char* VAL="{\"lightstatus\":"
int parse_value(char c) {
static int val_idx=0;
// end of parsing condition, the index reached string length
if (strlen(VAL) == val_idx) {
// if the value is '1', return >0, if the value is '0', return 0
if ('1' == c) return 1;
else if ('0' == c) return 0;
}
// otherwise let's check if we're still in string
if (c == VAL[val_idx]) {
// if we do, increment the index variable
++val_idx;
} else {
// or reset it
val_idx = 0;
}
// return -1 while we're still parsing the string
return -1;
}
использовать этот код:
char val=-1;
while (val < 0)
val = parse_value(Serial.read())
Я не проверял это, но я надеюсь, что вы получите алгоритмическую идею!
НТН
Других решений пока нет …