3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-24

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


SORACOM Harvestのデータを取得方法については、[公式サイト](https://dev.soracom.io/jp/start/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](https://i.gyazo.com/aafc136d1d060d1cd644236ab162ca45.png)](https://gyazo.com/aafc136d1d060d1cd644236ab162ca45)

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](https://i.gyazo.com/25bfdb5b2af971532d14ee2c55f04452.png)](https://gyazo.com/25bfdb5b2af971532d14ee2c55f04452)
これを考慮したコードが以下

##コード(完成版)

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

             }

        }
     }


}

3
0
0

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
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?