○PC情報
開発環境情報:visualstudio2019
OS:windows10
言語:C#
API:Microsoft.Windows.SDK.Contracts
○前提・実現したいこと
BluetoothLE(BLE)端末からのデータの受信を行う為、C#を使用し、ウィンドウズフォームアプリケーションでBluetoothLE(BLE)端末と通信するソフトの開発を行っています。
アドバタイズパケットのウォッチャーでペアリングしてあるデバイスの中から指定のサービス、キャラスティックスを見つけデータの受信イベントの登録を行い、データの受信を行うよう実装しました。端末Aでは基本的に端末からのデータ送信時は受信イベントが動作し、データの受信ができますが、端末Aの電源がOFFになると次回のデータ送信からはソフトでデータの受信イベントが動作せず、受信ができません。なお、私が所持している他の端末Bでは電源OFF後何度でもデータの受信が可能です。私が調べた限りでは端末AとBの大きな違いはBluetoothAddressTypeで、端末AはRandom、端末BはPublicでした。データが受信できなくなる現象としてBluetoothAddressTypeが関係している事はあるのでしょうか?
また、BluetoothAddressTypeがRandomの場合、何か特殊な操作を行わないといけないのでしょうか?
ご存知の方がいらっしゃいましたらご教授いただけると助かります。
○ソースコード
public void Start()
{
// アドバタイズパケットの受信開始
this.advWatcher = new BluetoothLEAdvertisementWatcher();
this.advWatcher.Start();
}
private async void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
// アドバタイズパケット受信
var bleServiceUUIDs = args.Advertisement.ServiceUuids;
foreach (var uuidone in bleServiceUUIDs)
{
if (uuidone == new Guid("00001822-0000-1000-8000-00805f9b34fb"))
{
// 発見
BluetoothLEDevice dev = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
GattDeviceService service = dev.GetGattService(new Guid("00001809-0000-1000-8000-00805f9b34fb"));
break;
}
}
var characteristics = await service.Services[0].GetCharacteristicsForUuidAsync("0000-2A5E-0000-1000-8000-00805f9b34fb"); if (characteristics.Characteristics.Count > 0) { var abc = characteristics.Characteristics.First(); if (abc == null) { Console.WriteLine("Characteristicに接続できない..."); } else { if (abc.CharacteristicProperties.HasFlag(GattCharacteristicProperties.Indicate)) { // イベントハンドラ追加 abc.ValueChanged += characteristicPlx_SpotCheck_Measurementt; // これで有効 await abc.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Indicate); } } }
}