arduino로 JSON을 구문 분석하여 LED를 켭니다.


18

안녕하세요, LED 조명을 켜고 끄기 위해 arduino의 웹 서버에서 JSON 응답을 구문 분석하려고합니다. wifi 클라이언트 반복 예제를 사용하여 서버에 요청을 보냅니다.

http://arduino.cc/en/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 부분을 구문 분석하여 LED를 제어하는 ​​데 사용할 수 있도록하려면 어떻게해야합니까?

감사

답변:


11

Arduino에 대한 몇 가지 JSON 구문 분석 라이브러리를 알고 있습니다.

나는이 중 하나를 사용한 적이 없지만 작업중 인 프로젝트에서 간단한 JSON 구문 분석을 수행 했으므로 어떻게했는지 보여 드리겠습니다.

참고 : 소프트웨어 직렬 라이브러리를 사용하여 직렬 데이터를 읽고 있습니다. 당신을 위해이 코드를 변경해야합니다. 이것은 매우 간단한 JSON 문자열에서만 작동합니다. 그건 매우 제한하지만 모든 당신이 다음 구문 분석하고이 있다면 그것은 작동합니다.

서버의 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);

이 코드는 문자열에서 + 5 자의 start시작으로 설정 됩니다 id":". 길이 id":"가 길기 때문에 +5 입니다. 그래서 start포인트 TEST1json으로 문자열이다. 내 시스템에서 ID는 항상 5 자이므로 end는 start + 5입니다. 그런 다음 substring추출하는 데 사용합니다.

다시 말하지만 누군가 가이 끔찍한 해결책에 대해 투표를 시작하기 전에 : 작업중 인 것을 정확히 알고이 코드의 한계를 이해한다면 이것은 나쁜 해결책이 아닙니다. 작업을 수행하는 솔루션입니다.


제공하는 JSON 예제는 "좋은"JSON처럼 보이지 않습니다. 예를 들어 숫자 값은 일반적으로 문자열로 인용해서는 안됩니다.
jfpoilpret

JSON에 사용 가능한 잠재적 라이브러리 목록은 +1입니다. 라이브러리가 콜백 함수 접근 방식을 기반으로하지 않는다는 것에 놀랐습니다.이 구문 분석 중에 호출됩니다 (훨씬 효율적인 메모리 방식).
jfpoilpret

적어도 당신은 코드 샘플이 끔찍하다는 것을 알고 있습니다 :-) 물론 작업을 수행하지만 읽을 수는 없지만 (6 개월 만에 다른 사람이 읽을 수 없으므로) 유지할 수 없습니다.
jfpoilpret

@jfpoilpret 칩의 메모리가 부족하여 일부 장소에서 모서리를 잘라야했습니다. 적어도 그것은 크게 언급되었습니다.
sachleen

이해 했어요; 그러나 String사용법으로 인해 메모리 상황이 악화되지 않는지 궁금합니다 ( StringArduino에서는 내 애완 동물이 있습니다).
jfpoilpret

7

JSON 문서를 char로 수신하는 클래스를 프로그래밍했습니다. 상태 머신과 필요한 결과를 사용하여 알려진 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-on-arduino을 .

소스 코드는 여기 Biicode에 있습니다.


2

char 포인터와 직접 작동하고 트리 구조를 작성하지 않기 때문에 램 사용이 매우 낮은 PIC 용 파서를 작성했습니다. 목록의 항목 N을 가져 오도록 요청하면 목록의 항목 N 시작 부분에서 직접 JSON 파일에 대한 실제 포인터를 제공합니다. 그런 다음 포인터가 나타내는 유형의 객체 등을 물어볼 수 있습니다. 버그가 있고 플로트를 지원하지 않으며 몇 가지 다른 제한 사항이 있습니다 (오래 전에)하지만 github에 있습니다. https://github.com / EternityForest / OpenFortune-fortune-like-text-generator C 버전의 일부인 libfortune을 찾아야합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.