LoginSignup
5
5

Windows C#でBLE HID(HoGP) Peripheral コンソールアプリを作成する

Last updated at Posted at 2022-12-31

bleHID

C#、.NetFrameworkを使い、Bluetooth LEのHIDリモコンデバイスとして動作するWindowsコンソールアプリです。
HoGPでWindowsと他の機器を接続する場合、WindowsはCentral側となりBLE接続キーボード等のPeripheralからの入力を受ける使い方が一般的ですが、今回はWindowsをPeripheral側としてHIDリモコンの機能を実装します。
win_HoGP_Peripheral.PNG

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を開始します。
ble1.PNG
Central機器で、Advertiseを受けたらConnectします。
ble_c1.PNG
ble2.PNG
次に、Windows上でbleHIDsockClient.exeを起動すると、サンプルでは自動でbleHID.exeへUDPで接続してキーコードを送信します。
ble3.PNG
ble_c2.PNG
このプログラムを実際に使うときには、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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5