HoloLens 2 と SORACOM SIM 挿したモバイルルータで SORACOM Beam でやってみるメモ

HoloLens 2 と SORACOM SIM 挿したモバイルルータで SORACOM Beam でやってみるメモです。

この記事は SORACOM Advent Calendar 2022 の 12 日目の記事です。

VR + Unity の開発でネットワークまわりの開発が割と大変

HoloLens 2 に限りませんが Android ベースの VR 機器含めて Unity でネットワークにつながるものの開発していると結構苦労します。

それもそのはず、3D 的な UI づくりもしつつ、Untiy の C# な仕組みも気にしつつで、わりと技術要素が積み重なった状況で、それなりに時間をかかるビルドと実機でのテストを繰り返しているにも関わらず、プラスアルファでネットワークへの接続を試行錯誤するとなれば、かなり時間がかかり色々と気にする必要があります。

VR 系の開発でも SORACOM Beam が役に立つんじゃないかと思った

そんななか、たとえば VR 機器から SORACOM SIM 挿したモバイルルータをつないで SORACOM Beam を使えば、ネットワークでやり取りする先を自由に切り替えられるし、実機に依存せず挿した SIM の情報で切り替えることもできて、開発で役に立つんじゃないかと思い、今回の実験に至りました。

なにはともあれ、VR まわりにも SORACOM が活きるユースケースを見つけるってワクワクするのでやってみたいんです。

モバイルルーターの SIM の切り替え

image

ということで、手持ちのモバイルルーター Aterm MR05LN に SORACOM SIM を挿しているので切り替えます。

image

SORACOM コンソール側でもオンラインになったのを確認します。

image

HoloLens 2 もモバイルルーターにつなぎます。

Node-RED の設定

今回 SORACOM Beam からデータを送る、ひとまずのサーバーは Node-RED でつくります。

image

シンプルな /soracom/beam パスにデータをオウム返しするサーバーをつくります。

SORACOM Beam の設定

SORACOM Beam を使ったデータ転送 – SORACOMでわかるIoT を参考に進めます。

image

今回使う SIM のグループのSORACOM Beam の設定を HTTP プロトコルで設定します。さきほどの Node-RED に向けます。

  • エントリポイント
    • パス
      • /
  • 転送先
    • プロトコル
      • HTTPS
    • ホスト名
      • 今回つなぐ Node-RED サーバーのホスト名
    • ポート
      • 今回つなぐ Node-RED サーバーのポート
    • パス
      • 今回つなぐ Node-RED サーバーのパス

これで SORACOM 側の設定は完了です。

HoloLens 2 のプロジェクトの準備

のこりは HoloLens 2 側の対応。Unity プロジェクトを作ります。

image

このあたりを参考に holo-soracom というプロジェクトを立ち上げました。ごくごくシンプルなものです。

HoloLens 2 の設定

image

このように、真ん中に Cube をつくって、あとは SorecomBeam クラスをつくって動作するようにしました。これもシンプルに SORACOM Beam につなぐ内容です。

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using TMPro;

public class SorecomBeam : MonoBehaviour
{
    // JSON データ化するクラス
    [Serializable]
    public class SendData
    {
        public string message;
    }

    void Start()
    {
        // 一度実行ならこれ
        SendSorecomBeamAPI();
    }

    // StartCoroutine でアクセスできるようにするため
    void SendSorecomBeamAPI()
    {
        StartCoroutine(SendSorecomBeamAPICore());
    }

    IEnumerator SendSorecomBeamAPICore()
    {
        // API URL
        // 今回は POST リクエストの設定
        UnityWebRequest request = new UnityWebRequest("http://beam.soracom.io:8888/", UnityWebRequest.kHttpVerbPOST);
        // SendData クラス呼び出し
        SendData data = new SendData();
        // メッセージ
        data.message = "Hello! SORACOM Beam!";
        // SendData クラスに合わせて JSON データ変換
        string json = JsonUtility.ToJson(data);
        // UTF8 変換
        byte[] postData = Encoding.UTF8.GetBytes(json);
        // 送るデータの設定
        request.uploadHandler = new UploadHandlerRaw(postData);
        // JSON で送るヘッダー設定
        request.SetRequestHeader("Content-Type", "application/json");
        // 受信データの受け皿を準備
        request.downloadHandler = new DownloadHandlerBuffer();

        yield return request.SendWebRequest();

        switch (request.result)
        {
            case UnityWebRequest.Result.InProgress:
                Debug.Log("リクエスト中");
                break;

            case UnityWebRequest.Result.Success:
                Debug.Log("リクエスト成功");

                Debug.Log(request.downloadHandler.text);

                break;
        }

    }
}

Hello! SORACOM Beam! というメッセージを送っています。

動かしてみる

こちらを先ほどの SORACOM SIM につながったモバイルルータにつながった HoloLens 2 にビルドして動かしてみます。

image

デバッグ用のログに、無事 SORACOM Beam へデータが送られて Node-RED 側からオウム返ししたデータがこのように HoloLens 2 に帰ってきました!成功!

image

Node-RED 側にも SORACOM Beam から転送されてきた HoloLens 2 のデータが届いていました。これを HoloLens 2 にオウム返ししてます。

image

また、Node-RED 側でリクエストヘッダのほうも確認したところ、ちゃんと x-soracom-sim-id や x-soracom-imsi で SIM の情報が取れてました。x-unity-version は Unity から来たデータを示すヘッダなんですが Unity と SORACOM のことが一緒に行えてて改めてグッときました!

ということで、このようなことができると、VR デバイスの内容を変えずに SORACOM Beam で本番用とテスト用の API を切り替えたり、SIM と各 VR デバイスをペアにさせたうえで特定の実機に応じた API 挙動を変えることができるので VR デバイスに対して IoT デバイスのようなアプローチで、開発に活用できそうです。

今回は、そのスタートの部分を探れてよかったです!