IoTサービスに位置情報を送信 (KC4-C-100A)
レシピ
概要
前回 の続きで、デバイスからGPSの位置情報を取得してIoTサービスにデータ送信してみます。
当レシピでは、GPSから位置情報が取得できた場合は、IoTサービスに送信するJSON値に緯度・経度をセットしてデータ送信します。
ブロック構成
- 「60秒ごと」の設定の繰り返しブロックを配置し、イベントID「1」として定義しています。
「プログラム開始」のブロックで、このイベントID「1」を開始しています。 - GPS位置情報を取得します。
屋内にいるなどの理由で位置情報が取得できない場合もありますので、その場合は仮に緯度・経度ともに「-1」をセットします。
位置情報が取得できた場合は、数値変数に取得できた位置情報の緯度・経度をセットします。 - 位置情報のデータを保持するためのマップ変数を定義します。
後ろのブロックで値をセットするので、この段階では空の状態です。 - 緯度・経度が取得できていた(いずれも「-1」ではない)場合は、緯度・経度を文字列に変換した上で位置情報のマップ変数にセットします。
緯度・経度が取得できていなかった場合は何もしません(位置情報のマップ変数は空のままです)。 - 位置情報のマップ変数をJSON文字列に変換し、文字列変数にセットします。
- IoTサービスのデータ送信用のマップ変数を生成します。
本来は "meta"キーの値として位置情報(緯度・経度)のマップ変数をセットしたいのですが、このブロックプログラムの仕様によりマップ変数内にマップ変数をセットできないため、まずは仮で -99999 という数値をセットしています。 - IoTサービスのデータ送信用のマップ変数をJSON文字列に変換し、文字列変数にセットします。
- IoTサービスのデータ送信用のJSON文字列変数内の "-99999" (つまりmeta属性に仮にセットした数値)を、位置情報のJSON文字列に置換します。
これにより、マップ変数内にマップ変数を代入できない代わりの処理として、"meta" の属性に位置情報の子オブジェクトをセットしています。 - httpプロトコルを使用して、IoTサービスのURIに対して上記のJSON文字列をPOSTしています。
- httpでの送信の成功・失敗の結果をディスプレイに表示します。
ポイント
- JSON文字列の生成は、マップ変数を変換する方法を利用します。
ただし、以下のような階層構造を持つJSON文字列を生成したい場合、マップ変数から直接変換する方法は取れません。
{ "name": "test_data", "value": 100, "meta": { "latitude": "123.4567", "longitude": "34.5678" } }
この場合、以下の手順でJSON文字列を生成させます。
まずは子階層用のマップ変数を先に定義します。
これをJSON文字列に変換すると、以下のようになります。{ "latitude": "123.4567", "longitude": "34.5678" }
- 親階層用のマップ変数を定義します。この際、子階層とすべき部分の属性値は仮の値をセットしておきます。
これをJSON文字列に変換すると、以下のようになります。
{ "name": "test_data", "value": 100, "meta": -99999 }
文字列操作を行います。親階層のJSON文字列内の仮の値 "-99999" を、子階層のJSON文字列に置換します。
結果的に、以下のような階層構造を持つJSON文字列ができあがります。{ "name": "test_data", "value": 100, "meta": { "latitude": "123.4567", "longitude": "34.5678" } }