bleHID
C#、.NetFrameworkを使い、Bluetooth LEのHIDリモコンデバイスとして動作するWindowsコンソールアプリです。
HoGPでWindowsと他の機器を接続する場合、WindowsはCentral側となりBLE接続キーボード等のPeripheralからの入力を受ける使い方が一般的ですが、今回はWindowsをPeripheral側としてHIDリモコンの機能を実装します。
Requirement
ハードウェア動作環境
Windows上でBluetooth LEが使用できるハードウェアが必要です。Windowsに実装されているBluetoothのデバイス(USBドングル等)によっては、Central側としては使えてもPeripheral側としては使えないものも存在しますので確認が必要です。
確認方法としては、microsoft製ツール: Bluetooth LE ExplorerでVertual PeripheralやVertual Keybordが正常に動作すれはPeripheral側として動作できていると言えます。
Peripheral側として動作しない場合は、USBドングルを調達します。TP-Link UB500は動作確認が取れています。
ソフトウェア開発環境
@gpsnmeajpさんの記事に従ってコンソールアプリケーションの開発環境を整えます。
- Visual Studio 2019 Communityをインストール
- Windows SDKをインストール
- .Net Framework 4.7 コンソールアプリケーションのプロジェクトを作成
- Microsoft.Windows.SDK.ContractsをNuGetでインストール
- packages.config を PackageReference に移行
開発環境が整ったら、ソースコードをビルドし実行します。
Source code
bleHID.exe
HIDリモコンデバイスとして動作し、UDPサーバーが別プロセスから受信したキーコードをCentral機器へ通知します。
ビルド時の注意点として、BLEのリセットの目的でBluetoothハードウェアのOFF/ONを行うライブラリを使用しているためAnyCPUでは動作しません。x86, x64などでビルドする必要があります。
bleHIDsockClient.exe
UDPクライアントでbleHID.exeへキーコードを送るサンプルです。
Usage
まず、Windows上でbleHID.exeを起動します。
起動すると、bleHID.exeはHID機器としてAdvertiseを開始します。
Central機器で、Advertiseを受けたらConnectします。
次に、Windows上でbleHIDsockClient.exeを起動すると、サンプルでは自動でbleHID.exeへUDPで接続してキーコードを送信します。
このプログラムを実際に使うときには、bleHID.exeは最小化して起動しておき、作成するアプリ側にはUDPクライアントを実装しキーコードを送ると良いです。
参考: 今回接続テストに使用したCentral機器は以下のものです。
Note
- 市販のリモコン等のデバイスは電池で動き省電力化のためTypeはPUBLICになっているものが多いのですが、このアプリのようにWindowsをPeripheralにした場合のBD_ADDRESSのTypeはRANDOMが使われるようです。よって、Central側の実装にはBD_ADDRESSが変更される事への対応が必要です。
- Windows上で動作しているこのアプリを再起動した場合、Central側も再起動しないとAdvertiseを受けた後、Connectしようとして ErrorCode 574や532で失敗するようです。
-> E NimBLEClient: "Connection failed; status=574"--> 0x 23E
-> E NimBLEClient: "Connection failed; status=532"--> 0x 214
https://github.com/h2zero/NimBLE-Arduino/issues/140
今回は業務要件的にCentral側の再起動は不可能なため、このアプリの起動時にBluetoothDeviceをOFF->ONする処理を入れて対策しましたが、これは正しい方法ではないかもしれません。より良い方法があれば教えていただけると嬉しいです。
参考文献
C#でWindowsをBLEデバイスにする(Peripheral & GATT Server)
https://qiita.com/gpsnmeajp/items/481fd731851e0e538263
Bluetooth LE Explorer::Vertual Keybord
https://github.com/microsoft/BluetoothLEExplorer
備忘録 - BLE - 概要
https://shizuk.sakura.ne.jp/bluetooth/ble/overview.html