arduinoでJSONを解析してLEDをオンにする


18

こんにちは、私はarduinoでWebサーバーからのJSON応答を解析して、LEDライトをオンまたはオフにしようとしています。私はwifiクライアントの繰り返し例を使用して、サーバーにgetリクエストを作成しています:

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

LEDを制御するために使用できるように、この応答のJSON部分のみを解析するにはどうすればよいですか?

ありがとう

回答:


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

このコードは一度に1バイトずつデータを読み取り、中括弧を取得すると、データをに保存し始めresponseます。閉じ括弧を取得すると、それを終了します。そのため、ここに明確な制限があります。文字列には、中かっこを1つだけ設定できます。

文字列を取得したら、とを使用indexOfsubstringて関連情報を抽出します。

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

このコードは、文字列の+ 5文字のstart先頭に設定しid":"ます。+5 id":"です。なぜなら、それがどれくらいの長さだからです。そのstartためTEST1、JSON文字列内を指します。私のシステムでは、IDは常に5文字になるため、endはstart + 5です。次に、それを使用substringして抽出します。

繰り返しますが、誰かがこの恐ろしい解決策に賛成票を投じる前に、あなたが作業しているものを正確に知っていて、このコードの制限を理解していれば、これは悪い解決策ではありません。それは仕事を成し遂げるソリューションです。


あなたが与えるJSONの例は、「良い」JSONのようには見えません。例えば、通常、数値は文字列として引用されるべきではありません。
jfpoilpret 14

JSONの潜在的に使用可能なライブラリのリストについては+1。解析中に呼び出されるコールバック関数アプローチに基づいたライブラリがないことに驚いています(メモリ効率がはるかに高い)。
jfpoilpret 14

少なくともあなたはあなたのコードサンプルが恐ろしいことを意識しています:-)もちろん仕事は完了しますが、それは読めません(他の誰かが6か月以内に自分でもqndによって)、したがってメンテナンスできません。
jfpoilpret 14

@jfpoilpretチップ上のメモリが不足しているため、いくつかの場所でコーナーをカットする必要がありました。少なくともコメントは多い。
サックリーン14

わかります; しかし、String使用してもメモリ状況が悪化しないのではないかと思います(はい、StringArduinoで私の欲求不満です)。
jfpoilpret 14

7

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-on-arduinoを

ソースコードはあるここビイコードに。


2

PICのパーサーを作成しました。これは、charポインターで直接動作し、ツリー構造を構築しないため、RAM使用量が非常に少ないものです。リストの項目Nを取得するように要求すると、リストの項目Nの先頭にある直接JSONファイルへの実際のポインターが表示されます。そして、あなたがオブジェクトの型がポインタ等、それのバギーを表し、山車をサポートしていないものを尋ねることができると私は(前に長い時間TWAS)他のいくつかの制限があると思いますが、それはgithubの上のすべてです:https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Cバージョンの一部であるlibfortuneを調べる必要があります。


1

JSON-RPCプロシージャコールでledをオンにする方法の例を使用して、簡単なJSON-RPCライブラリ(aJsonの上)を作成しました。


2
コード/ドキュメントへのリンクが変更された場合に、回答にさらに情報を追加できますか
-sachleen 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.