スタンプ型デバイス(3) ~HoloLens2とBluetoothで通信~

####まえがき
[前回](https://qiita.com/T170521/items/acf8a5230655c5e57e45)Bluetoothでのシリアル通信に無事成功しました．
Unityで扱えるならビルド先でも簡単に利用できるはずだと思い，そのままHoloLens2用に書き換え，ビルドしました．
ここまでは順調でした...

HoloLens2とBluetoothでペアリングしてデモを実行しましたが反応ない．
理由はシリアルポートの接続がうまくいっていないことが原因でした．
PCならデバイスマネージャーからポートを判別できますがHoloLens2には判別する手法はありません．
この解決法はかなり悩みました．
![IMG_20200821_204951.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563922/96978f58-f6a3-f5df-6107-37b231580c8e.jpeg)

####本題

手当たり次第ポート番号を変えて接続を試みたが全く繋がらず，断念
そこでプログラムで有効なポートを検索，自動で選択するようにしようと考えた

#####機器概要
・Windows10 Laptop
・Unity 2019.3.2f1
・HoloLens2
・スタンプ型デバイス(M5StickC)
・Visual Stadio 2019

####手順
#####1.プログラム作成
有効なポートを識別するプログラムを作成

```C#:ShowSerialPortNum.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO.Ports;
using TMPro;

public class ShowSerialPortNum : MonoBehaviour{

  [SerializeField]
  private TextMeshPro portNameText;

  private void Awake() {
    string[] ports = SerialPort.GetPortNames();
    portNameText.text = "The following ports are valid\n"; //有効なポートは以下の通りです
    foreach(string port in ports) //portsの数だけループ
    {
      portNameText.text += port + "\n"; //テキストに表示
    }
  }
}
```
#####2.デモ作成
UXのデモからパネルを拝借して本文にポートを羅列する
空のGameObjectを作成し，Eventとして先ほどのscriptをアタッチする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563922/736cd2bd-bd68-14a3-f793-67aa0b4df4f7.png)

PCでBluetoothをONにして実行すると以下のように表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563922/e502da83-bc9d-cfa9-c47e-d3c2ae245080.png)

#####3.HoloLens2にビルド
これをHoloLens2にビルドしてみたが，結果は残念...
本文が変化しなかった．ポートの識別どころか，ポートで制御されていないのか？
これでは自動選択もできない．(そもそも違うポートだった場合，タイムアウト処理でアプリ自体が停止した)

####あとがき
HoloLens2とシリアル通信は難しいので断念します．(有料Assetでいけるかもしれないが確証がない)
次回は違うアプローチでやってみます．

![IMG_20200827_122557.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563922/8ca9187b-c552-1546-7002-415e801697f0.jpeg)

####参考
[HoloLens 2 の環境構築をして実機で動かす](https://medium.com/kadinche-engineering/hololens-2-%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%82%92%E3%81%97%E3%81%A6%E5%AE%9F%E6%A9%9F%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99-7a15bfe5e088)
[C#でCOMポート番号とシリアル接続機器名を同時に取得する方法](http://truthfullscore.hatenablog.com/entry/2014/01/10/180608)

#####Bluetooth関連
[Unity(C#)でシリアル接続デバイス名の一括取得](https://teratail.com/questions/91858)
[UnityでArduinoとシリアル通信をする](https://nn-hokuson.hatenablog.com/entry/2016/07/26/205745)
[How to send a string from Arduino to a Hololens game via Bluetooth?](https://forum.unity.com/threads/how-to-send-a-string-from-arduino-to-a-hololens-game-via-bluetooth.457237/)
[HoloLens Bluetooth Ports](https://forums.hololens.com/discussion/8724/hololens-bluetooth-ports)
[HoloLens BLE communication ( windows 10 )](https://stackoverrun.com/ja/q/10917628)

[micro:bitとHoloLensをBluetoothで接続できたメモ](https://www.1ft-seabass.jp/memo/2018/02/09/microbit-hololens-bluetooth-firstste/)
[ESP-IDF ESP32でのBluetooth HIDの利用](https://blog.kat-kai.net/ESP-IDF%E3%81%A8ESP32%E3%81%A7Bluetooth-HID/)
[SerialPort.GetPortNames メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport.getportnames?view=dotnet-plat-ext-3.1)
[マネージプラグイン](https://docs.unity3d.com/ja/2018.4/Manual/UsingDLL.html)

#####Text Mesh pro
[【Unity】Text Mesh Proのテキストをスクリプトから表示・変更する](https://unity-mantario.hatenablog.com/entry/2018/07/15/205727)
[UNITY*TextMeshPro テキストボックスにテキストを反映](https://kumastudio-pro.amebaownd.com/posts/6180747/)
[TMProをusingできない時](https://raspberly.hateblo.jp/entry/2018/09/19/190000)
[TextMeshProの使い方](https://qiita.com/hinagawa/items/b606c6a2fd56d559a375)
[【Unity】TextMesh ProがUnityに組み込まれました](https://section31.jp/gamedevelopment/unity/textmeshpro1/)

#####ボタン作成
[What is the Mixed Reality Toolkit](https://microsoft.github.io/MixedRealityToolkit-Unity/README.html)