Open28

Bluetooth

forest1forest1

Bluetooth
ver3.*までのSPPと
Ver4.*以降のBLEでは互換性が無い

SPPではWindows接続時にCOMポートとして認識出来るが、BLEは不可
BLEでは専用APIでパケット通信にて実装する必要
ただし、BLEは通信速度がSPPより遅いのに注意、
https://www.musen-connect.co.jp/blog/course/planning/spp-to-ble/

forest1forest1

ペアリングは手動で、繋がっている中から選んで通信をする方式
https://qiita.com/tera1707/items/5505ed22b5ddf93795f4

forest1forest1
            DeviceWatcher = DeviceInformation.CreateWatcher();
            DeviceWatcher.Added += DeviceWatcher_Added;

            DeviceWatcher.Start();

とすると色々大量にデバイスが出てくるので、クラス名?とか何かで絞り込みが必要。
一応、Bluetoothで接続処理したものだけ出したい。

forest1forest1

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

forest1forest1

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()が必要なのに注意

forest1forest1

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

forest1forest1

デバイスサーチ

            deviceWatcher = DeviceInformation.CreateWatcher();

            deviceWatcher.Added += DeviceWatcher_Added;
            deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted;

Addedでデバイス1つ見つかる毎に呼ばれる
完了したらEnumerationCompletedが呼ばれる

forest1forest1

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

forest1forest1

デバイスを最初から絞り込んでサーチする場合は、

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);

にしないとデバイスが検索出来ない。(理由不明)

forest1forest1

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欄が空

forest1forest1

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に入ったデバイスが列挙された