LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

Organization

UnityからSORACOM Harvestにあるデータをゲットする方法

前回のQiitaの記事
M5StackGRAYのジャイロセンサの値を3G拡張ボードを使ってSORACOM Harvestに送ってみた
で送ったデータを今度はUnityで取得します。



SORACOM Harvestのデータを取得方法については、公式サイトに書かれてます。

$ curl -X GET \
  -H "X-Soracom-API-Key: ${API-KEY}" \
  -H "X-Soracom-Token: ${API-TOKEN}" \
  https://api.soracom.io/v1/subscribers/${IMSI}/data | jq .

普通のエンジニアの方はこれからコードに反映できると思いますが、私はcurl文だけではコード化できない素人なので、すごく悩みました。
ググっても、そのものずばりのコード例が無かったので、結構苦戦しましたが、なんとか以下のやり方で、UnityからHarvestのデータをゲットすることができました。

SORACOMでの対応

SORACOMのAPIリファレンスページを開きます。
https://dev.soracom.io/jp/docs/api/

認証キーかアカウントのメールアドレスを入力し、認証ボタンを押します。
Image from Gyazo

APIキーとトークンが発行されます。
Image from Gyazo

その下は、
日本だけのSIMなら "JAPAN"
グローバルなら "GLOBAL" を選択
Image from Gyazo
※デフォルトがJAPANなのでグローバルSIMの人は注意。私はグローバルSIMだったにも関わらず、そのままにしてたため、ちょっとハマりました。



下にスクロールすると、たくさんのAPIが列挙されてます。
Image from Gyazo

Harvestのデータを取得するには、先程のcurlの例法を見ると、

/subscribers/{imsi}/data

と書いてあったので、同じものを下にスクロールして探してみると、

あった!
Image from Gyazo

ここをクリックすると、
実際にAPIが試せる画面が現れます。

1、 必要最低限 imsiを入力(他の項目は任意)
 ※imsiはユーザーコンソールの該当SIMの「SIM詳細」に書かれてます。
2、 Tri it Out! をクリックします。
Image from Gyazo

こんな画面が現れます。
この画面が現れないと何かが間違ってます。
Image from Gyazo

ここで注目するのが以下の赤線で囲った
curl と Request URL
あとで、Unityのプログラムで使います。
Image from Gyazo

Unityでの対応

動作確認バージョン

Unity 2019.2.21f1

事前準備

UnityでHTTP(GET)通信によるJSONデータ取得するために、
Unityアセットストアから
JSON Object
というアセット をインポートします。

Image from Gyazo

コード

getHarvest.cs
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class getHarvest : MonoBehaviour
{
    private string APIKEY = "APIKEY";
    private string APITOKEN = "APITOKEN";

    void Update()
    {

      //URLは先程soracomのAPIリファレンスサイトで現れたRequestURLを記載 
      StartCoroutine(GetText("https://g.api.soracom.io/v1/subscribers/${IMSI}/data?sort=desc"));
    }


    IEnumerator GetText(string url)
    {
        using (UnityWebRequest www = UnityWebRequest.Get(url))
        {
            //soracomのAPIリファレンスにあるヘッダーの情報を設定する
            //SetRequestHeaderは何個でも書ける
            www.SetRequestHeader("Accept", "application/json");
            www.SetRequestHeader("X-Soracom-API-Key", APIKEY);
            www.SetRequestHeader("X-Soracom-Token", APITOKEN);

            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
              {
                 Debug.Log(www.error);
             }
             else
             {
            // 結果をテキストとして表示
              Debug.Log(www.downloadHandler.text);
             }

        }
     }


}


UnityのHTTP通信について参考にしたサイト



結果

Unityのコンソール画面です。
Harvestに保存されているデータを取得できました。
Image from Gyazo

ただ、これだと、バックスラッシュがついているので、このままではデータを読めません。
前述のコードのGET Text関数にJSONを加工する処理を付け加えました。
JSON形式をいったん文字列に変換し、それからバックスラッシュを削除してからJSONに変換するという方式をとってます。
もっとキレイなやり方があると思いますが、とりあえず、動いたからヨシ!


JSONObject json = new JSONObject(www.downloadHandler.text);
JSONObject content = json[0].GetField("content"); //配列であることに注意

//いったん文字列に変換してバックッシュラッシュを削除する
string content2 = content.str; 
string str = System.Text.RegularExpressions.Regex.Unescape(content2);

//再度JSON形式に変換
JSONObject jsonObj = new JSONObject(str);

float gyroX = jsonObj.GetField("gyroX").n;
float gyroY = jsonObj.GetField("gyroY").n;
float gyroZ = jsonObj.GetField("gyroZ").n;

Debug.Log("gyroX:" + gyroX + "\t gyroY:" + gyroY + "\t gyroZ:" + gyroZ);



このようにHarvestに保存してある各ジャイロデータ(gyroX,gyroY,guroZ)のデータを取得できました。
Image from Gyazo



これを考慮したコードが以下

コード(完成版)

getHarvest.cs
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class getHarvest : MonoBehaviour
{
    private string APIKEY = "APIKEY";
    private string APITOKEN = "APITOKEN";

    void Update()
    {

      //URLはsoracomのAPIリファレンスサイトのRequestURLを記載 
      StartCoroutine(GetText("https://g.api.soracom.io/v1/subscribers/${IMSI}/data?sort=desc"));
    }


    IEnumerator GetText(string url)
    {
        using (UnityWebRequest www = UnityWebRequest.Get(url))
        {
            //さきほどsoracomのAPIリファレンスで現れたヘッダーの情報を設定する
            //ちなみにヘッダーを複数設定する場合は以下のようにSetRequestHeaderは何個でも書ける
            www.SetRequestHeader("Accept", "application/json");
            www.SetRequestHeader("X-Soracom-API-Key", APIKEY);
            www.SetRequestHeader("X-Soracom-Token", APITOKEN);

            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
              {
                 Debug.Log(www.error);
             }
             else
             {
            // 結果を表示
              JSONObject json = new JSONObject(www.downloadHandler.text);
              JSONObject content = json[0].GetField("content"); //配列であることに注意

            //いったん文字列に変換してバックッシュラッシュを削除する
            string content2 = content.str; 
            string str = System.Text.RegularExpressions.Regex.Unescape(content2);

            //再度JSON形式に変換
            JSONObject jsonObj = new JSONObject(str);

            float gyroX = jsonObj.GetField("gyroX").n;
            float gyroY = jsonObj.GetField("gyroY").n;
            float gyroZ = jsonObj.GetField("gyroZ").n;

            Debug.Log("gyroX:" + gyroX + "\t gyroY:" + gyroY + "\t gyroZ:" + gyroZ);

             }

        }
     }


}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0