c#蓝牙LE – 写配置错误 – 从未调用ValueChanged

所以我尝试将我的c#WPF程序连接到BLE设备,这是连接到设备的代码:

private async Task ConnectToWatcher(DeviceInformation deviceInfo) { try { // get the device BluetoothLEDevice device = await BluetoothLEDevice.FromIdAsync(deviceInfo.Id); // get the GATT service Thread.Sleep(150); var gattServicesResult = await device.GetGattServicesForUuidAsync(new Guid(RX_SERVICE_UUID)); service = gattServicesResult.Services[0]; // get the GATT characteristic Thread.Sleep(150); var gattCharacteristicsResult = await service.GetCharacteristicsForUuidAsync(new Guid(RX_CHAR_UUID)); characteristic = gattCharacteristicsResult.Characteristics[0]; // register for notifications Thread.Sleep(150); characteristic.ValueChanged += (sender, args) => { Debug.WriteLine($"[{device.Name}] Received notification containing {args.CharacteristicValue.Length} bytes"); }; GattWriteResult result = await characteristic.WriteClientCharacteristicConfigurationDescriptorWithResultAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify); Debug.WriteLine($"Characteristics write result: status={result.Status}, protocolError={result.ProtocolError}"); } catch (Exception ex) when ((uint)ex.HResult == 0x800710df) { Debug.WriteLine("bluetooth error 1"); // ERROR_DEVICE_NOT_AVAILABLE because the Bluetooth radio is not on. } } 

这条线

  Debug.WriteLine($"Characteristics write result: status={result.Status}, protocolError={result.ProtocolError}" 

创建输出特征写入结果:status = protocolError,protocolError = 3我无法找到任何意味着什么。 效果是方法特性 .ValueChanged永远不会被调用。

我是否必须做更多才能具有可配置的特性? 并且有任何人知道为什么不调用该方法或该错误消息的含义是什么?

谢谢你们。

显然,某些Windows 10版本存在COM安全漏洞。 解决方案是注册Windows-Insider-Program并更新Windows。

更新:还有两个解决方案:1)从c#-code外部调用CoInitializeSecurity(没有使它工作) – 或者 – 2)将两个新密钥写入Windows注册表。 您可以创建一个文件“Bluetooth.reg”,它将在doubleklick上添加这两个键。 这个答案来自https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/bluetooth-bluetoothledevicefromidasync-does-not-complete-on-10015063?forum=wdk是我的解:

嗨Kamen,我遇到了完全相同的问题。 您可以快速尝试以下内容:


Windows注册表编辑器版本5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ AppID {C6BFD646-3DF0-4DE5-B7AF-5FFFACB844A5}]“AccessPermission”= hex:01,00,04,80,9c,00,00,00,ac,00,00,00, 00,00,00,00,14,00,\ 00,00,02,00,88,00,06,00,00,00,00,00,14,00,07,00,00,00,01 ,01,00,00,00,00,00,\ 05,0a,00,00,00,00,00,14,00,03,00,00,00,01,01,00,00,00, 00,00,05,12,00,00,00,\ 00,00,18,00,07,00,00,00,01,02,00,00,00,00,00,05,20,00 ,00,00,20,02,00,00,00,\ 00,18,00,03,00,00,00,01,02,00,00,00,00,00,0f,02,00, 00,00,01,00,00,00,00,00,\ 14,00,03,00,00,00,01,01,00,00,00,00,00,015,100,00,00 ,00,00,00,14,00,03,00,00,\ 00,01,01,00,00,00,00,00,005,14,00,00,00,01,02,00, 00,00,00,00,05,20,00,00,00,\ 20,02,00,00,01,02,00,00,00,00,00,05,20,00,00,00 ,20,02,00,00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ AppID \ YOURAPP.exe]“AppID”=“{C6BFD646-3DF0-4DE5-B7AF-5FFFACB844A5}”


  1. 将上述内容复制到文本文件。

  2. 用您的可执行文件名替换’YOURAPP.EXE’

  3. (可选)替换GUID(我为您创建了一个新的)

  4. 保存扩展名为.reg的文本文件

  5. 双击该文件。

  6. 您会看到一条消息“….. .reg中包含的密钥和值已成功添加到注册表中。”

有了这个,我不需要从我的应用程序调用CoInitializeSecurity。

你需要先调用CoInitializeSecurity

更多信息在这里。 我花了几个星期寻找解决方案:)

https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/