この前、HoloLens 2とPCとの間の視界共有に関して調べていました。
Miracastなどを使用すれば、比較的簡単に視界を共有できそうだということはわかりました。 これができると、今度はHoloLens 2に対して外部から制御信号を送って、HoloLensに表示されるコンテンツを操作したくなります。
こちら、調べてみたんですが、HoloLens 2に関する情報は出てきませんでした... 考えてみれば、スマートフォンも外部デバイスから普通は操作できませんし、普通はできないのだと思います。 でも、どうにかして外部から操作できる方法を、調べてみたので今回はそのメモです。
調べてみた
調べてみると、どうやらHoloLensを使った通信はSharingと呼ばれているようで、主な用途はHoloLens-他デバイスの間で3Dオブジェクトなどのコンテンツ情報の共有のようです。
ただ、今回やりたいのはHoloLensに対して制御信号を送りたいので、若干sharingとは違うのかなという感じになりました。
さらに調べてみて、こちらの記事を拝見しました。
akihiro-document.azurewebsites.net
なんとなく、やりたいことに近そうだったので、こちらを参考にしてやりたいことができそうか確認してみたいと思います。
WebSocket について
ネットワーク系の話はあまり強くなかったので、WebSocketについて先に調べてみました。
どうやら双方向通信を低コストで行うことができるようです。 HTTPのようなハンドシェイクを行いますが、厳密には異なるプロトコルになっており、ws:、wss:というURIを使用するようです。
実装を眺める
さて、実際の中身に入っていきます。 参考にさせていただいた記事の実装はUnity 2017.4で作られていたのですが、後で別のところで使うことも考えてUnity 2019.2で作っていきたいと思います。
実際に通信の制御に使用しているのは下記の3つのようですね。
- WebSocketControlSample.cs
- WebSocketClientManager.cs
- WebSocketServerManager.cs
この中身をちゃんと読めば通信ができそうです。
先程のWebSocketの説明の通り、クライアントからサーバーにアクセスし、本来たどり着きたい相手をサーバー経由でアクセスするようになります。 参考にさせていただいている実装では、PC側でサーバープロセスを起動し、それを経由することでHoloLens-PC間の接続を行っているようです。
コードを見る
動かしてみる
すいません、動きませんでした。
PC側でパケットを送信できてそうだというところまでは確認できたのですが、受信側の環境がないので… (エミュレータとかでなんとかなるかなと思ったら、PCのスペック不足なのかエミュレータがフリーズした…)
Unity上ではちゃんと動いていたので、多分平気でしょう。 実機に触る機会があったら、再度トライしてみたいと思います。
参考にさせていただいた記事
その他、下記の記事を参考にさせていただきました。
akihiro-document.azurewebsites.net
akihiro-document.azurewebsites.net
なんだか、HoloLens-HoloLensのP2P通信だと、TCPとかUDPを制御する機能を直接叩いて通信するのが普通みたいですね。 Unetとか使うと楽に使えそう…
感想
UnityとかUWPとか、正直あまり良くわかっていませんが、習うより慣れろだと思っているので、いまはこれでOKとします。 意外とネットワークの知識も必要になってきて、専門外な感じが半端じゃないんですが、たまにはこういうのもありでしょうか。