Bluetooth

Bluetooth
ver3.*までのSPPと
Ver4.*以降のBLEでは互換性が無い
SPPではWindows接続時にCOMポートとして認識出来るが、BLEは不可
BLEでは専用APIでパケット通信にて実装する必要
ただし、BLEは通信速度がSPPより遅いのに注意、

Ver5.0では高速化されている?
Ver5.1では、2M PHY で高速化可能

SPP実装例

ペアリングは手動で、繋がっている中から選んで通信をする方式

DeviceWatcher = DeviceInformation.CreateWatcher();
DeviceWatcher.Added += DeviceWatcher_Added;
DeviceWatcher.Start();
とすると色々大量にデバイスが出てくるので、クラス名?とか何かで絞り込みが必要。
一応、Bluetoothで接続処理したものだけ出したい。

一度繋がったらIDを保存しておいて、次回からはそれで自動接続。
接続解除操作手段も用意しておく。

BLEじゃない方。SPP?
var selector = "System.Devices.DevObjectType:=5 AND System.Devices.Aep.ProtocolId:=\"{E0CBF06C-CD8B-4647-BB8A-263B43F0F974}\"";
var devices = await DeviceInformation.FindAllAsync(selector);
var item = devices[0];
var dev = await BluetoothDevice.FromIdAsync(item.Id).AsTask();
最後にAsTask()が必要なのに注意

なんで?

繋げたBluetoothのレジストリの場所
コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Devices\d5257279ecba

.NET FrameworkでBluetoothを扱う場合
nugetから、Microsoft.Windows.SDK.Contracts を入れる

デバイスサーチ
deviceWatcher = DeviceInformation.CreateWatcher();
deviceWatcher.Added += DeviceWatcher_Added;
deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted;
Addedでデバイス1つ見つかる毎に呼ばれる
完了したらEnumerationCompletedが呼ばれる

上記は全デバイス対象なので、デバイス名とかで絞り込みとかは、
Addedで渡されるオブジェクトの Name に名前が入っているのでそれで判定する。

デバイスを最初から絞り込んでサーチする場合は、
var selector = BluetoothLEDevice.GetDeviceSelectorFromDeviceName(デバイス名);
selector = "System.Devices.DevObjectType:=5 AND System.Devices.Aep.ProtocolId:="{BB7BB05E-5972-42B5-94FC-76EAA7084D49}" AND (System.Devices.Aep.IsConnected:=System.StructuredQueryType.Boolean#True OR System.Devices.Aep.Bluetooth.IssueInquiry:=System.StructuredQueryType.Boolean#False)"
にて取得した文字列をCreateWatcherに渡せば良さそう(?)
ただ現状は、条件文字列を外して
var selector = "System.Devices.DevObjectType:=5 AND System.Devices.Aep.ProtocolId:=\"{BB7BB05E-5972-42B5-94FC-76EAA7084D49}\"";
deviceWatcher = DeviceInformation.CreateWatcher(
$"({selector})",
new string[] { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" },
DeviceInformationKind.AssociationEndpoint);
にしないとデバイスが検索出来ない。(理由不明)

BLEなデバイスはペアリングしていない状態で、BLEデバイスをサーチした場合
var selector = "System.Devices.DevObjectType:=5 AND System.Devices.Aep.ProtocolId:=\"{BB7BB05E-5972-42B5-94FC-76EAA7084D49}\"";
var devices = await DeviceInformation.FindAllAsync(selector);
列挙はされるが、どれもName欄が空

Blutooth ver5.1のキーボードをペアリングした状態で、Bluetooth(旧?)をサーチした場合
var selector = "System.Devices.DevObjectType:=5 AND System.Devices.Aep.ProtocolId:=\"{E0CBF06C-CD8B-4647-BB8A-263B43F0F974}\"";
var devices = await DeviceInformation.FindAllAsync(selector);
キーボードを含め、心当たりの有るデバイス名がNameに入ったデバイスが列挙された

Bluetooth v4.x GATTプロファイル解説ページ

カスタムのサービス?