Разберите JSON с arduino, чтобы включить светодиод

Привет, я пытаюсь разобрать JSON resposne с веб-сервера в моем arduino, чтобы включить и выключить светодиодный индикатор. Я использую пример повторения клиента wifi, чтобы сделать запрос на мой сервер:

http://arduino.cc/ru/Tutorial/WiFiWebClientRepeating

Вот то, что я распечатываю из последовательного порта

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 этого ответа только для того, чтобы я мог использовать его для управления моим светодиодом?

Спасибо

18 голосов | спросил user1424508 6 AMpSun, 06 Apr 2014 04:41:43 +040041Sunday 2014, 04:41:43

4 ответа


11

Я знаю несколько JSON-анализирующих библиотек для Arduino.

Я никогда не использовал ни одного из них, но я делал простой JSON-анализ в проекте, над которым я работаю, поэтому я покажу вам, как я это сделал.

ПРИМЕЧАНИЕ. Я читаю серийные данные с помощью последовательной библиотеки программного обеспечения. Вам нужно будет изменить этот код, чтобы работать на вас. Это будет работать только на очень простых строках JSON. Это very ограниченный, но если это все, что вы разобрали, это сработает.

Пример ответа JSON от сервера:

{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}

Во-первых, только чтение данных между фигурными фигурными скобками.

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);
}

Этот код считывает данные по одному байту за раз, и как только он получает открытую скобку, он начинает сохранять его в response. Когда он получает закрытие, он заканчивает его. Итак, вот явное ограничение, вы можете иметь только один набор открывающих /закрывающих фигурных скобок в вашей строке.

Как только у меня есть строка, я использую indexOf и substring для извлечения релевантной информации:

start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);

Этот код устанавливает start в начало id":" + 5 символов в строке. Это +5, потому что так долго id":". Итак, start указывает на TEST1 в строке JSON. В моей системе идентификатор всегда будет длиной 5 символов, поэтому конец start + 5. Затем я использую substring, чтобы извлечь это.

Опять же, прежде чем кто-нибудь начнет голосовать за меня за это ужасное решение: если вы точно знаете, с чем работаете, и понимаете ограничения этого кода, то это не плохое решение. Это решение, которое выполняет свою работу.

ответил sachleen 6 AMpSun, 06 Apr 2014 09:12:47 +040012Sunday 2014, 09:12:47
8

Я запрограммировал класс, который будет получать char путем записи документа JSON. Он только сохранит в памяти несколько байтов для известной структуры JSON, используя конечный автомат и результаты, которые вам нужны. Таким образом, вы можете запросить класс для желаемых результатов и обработать JSON.

Идеально для вашей цели. Я использовал для подключения к службе погоды, которая возвращает json:

static const char* queries[] = { "list.0.deg", "list.0.weather.0.main"};
StreamJsonReader jsonreader(queries, 2); // 2 queries    
while(char c  =  read()){
      jsonreader.process_char(c);
}

cout << jsonreader.results[0] << endl;
cout << jsonreader.results[1] << endl;

Отметьте это сообщение в блоге, которое я только что написал: http://web.biicode.com/blog/big -json-на-Arduino .

Исходный код здесь в Biicode.

ответил lasote 6 AMpSun, 06 Apr 2014 11:56:37 +040056Sunday 2014, 11:56:37
2

Я написал парсер для PIC, который имеет очень низкое использование ram, потому что он работает непосредственно с указателями на char и не создает древовидную структуру. Если вы попросите получить элемент N списка, он дает фактический указатель на прямой файл JSON прямо в начале элемента N списка. Затем вы можете спросить, какой тип объекта представляет указатель, и т. Д. Он глючит и не поддерживает поплавки, и я думаю, что имеет несколько других ограничений (два года назад), но все это на github: https://github.com/EternityForest/OpenFortune-fortune-like-text-generator Вам нужно посмотреть в libfortune, который является частью версии C.

ответил EternityForest 6 PMpSun, 06 Apr 2014 16:52:40 +040052Sunday 2014, 16:52:40
1

Я написал простую библиотеку JSON-RPC (поверх aJson) с примером того, как включить светодиод с вызовом процедуры JSON-RPC:

ответил Meir Tseitlin 16 J000000Wednesday14 2014, 14:43:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132