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 の切り替え
ということで、手持ちのモバイルルーター Aterm MR05LN に SORACOM SIM を挿しているので切り替えます。
SORACOM コンソール側でもオンラインになったのを確認します。
HoloLens 2 もモバイルルーターにつなぎます。
Node-RED の設定
今回 SORACOM Beam からデータを送る、ひとまずのサーバーは Node-RED でつくります。
シンプルな /soracom/beam パスにデータをオウム返しするサーバーをつくります。
SORACOM Beam の設定
SORACOM Beam を使ったデータ転送 – SORACOMでわかるIoT を参考に進めます。
今回使う SIM のグループのSORACOM Beam の設定を HTTP プロトコルで設定します。さきほどの Node-RED に向けます。
- エントリポイント
- パス
- /
- パス
- 転送先
- プロトコル
- HTTPS
- ホスト名
- 今回つなぐ Node-RED サーバーのホスト名
- ポート
- 今回つなぐ Node-RED サーバーのポート
- パス
- 今回つなぐ Node-RED サーバーのパス
- プロトコル
これで SORACOM 側の設定は完了です。
HoloLens 2 のプロジェクトの準備
のこりは HoloLens 2 側の対応。Unity プロジェクトを作ります。
- 演習 – Windows Mixed Reality 用に Unity を構成する – Training | Microsoft Learn
- 演習 – リソースをインポートして構成する – Training | Microsoft Learn
このあたりを参考に holo-soracom というプロジェクトを立ち上げました。ごくごくシンプルなものです。
HoloLens 2 の設定
このように、真ん中に 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 にビルドして動かしてみます。
デバッグ用のログに、無事 SORACOM Beam へデータが送られて Node-RED 側からオウム返ししたデータがこのように HoloLens 2 に帰ってきました!成功!
Node-RED 側にも SORACOM Beam から転送されてきた HoloLens 2 のデータが届いていました。これを HoloLens 2 にオウム返ししてます。
また、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 デバイスのようなアプローチで、開発に活用できそうです。
今回は、そのスタートの部分を探れてよかったです!