Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用内部蓝牙时,UWP BLE停止通知_C#_Uwp_Bluetooth_Bluetooth Lowenergy - Fatal编程技术网

C# 使用内部蓝牙时,UWP BLE停止通知

C# 使用内部蓝牙时,UWP BLE停止通知,c#,uwp,bluetooth,bluetooth-lowenergy,C#,Uwp,Bluetooth,Bluetooth Lowenergy,我有一个BLE传感器,以100Hz的频率发送数据,我开发了一个UWP应用程序来接收这些数据。我遇到了一个奇怪的问题,在一切正常运行几秒钟后,我停止接收新数据的通知 现在,我说这很奇怪,因为这发生在我使用笔记本电脑内部蓝牙时,而不是在使用蓝牙加密狗时。使用加密狗时,它工作正常,从不停止。内部蓝牙和加密狗驱动程序都更新到Windows可以找到的最新版本 一旦通知停止,传感器就会断开连接 该传感器基于北欧nRF52832 SoC 下面是关于我的代码的一些信息: 我有一个Sensor.cs类,我在其中

我有一个BLE传感器,以100Hz的频率发送数据,我开发了一个UWP应用程序来接收这些数据。我遇到了一个奇怪的问题,在一切正常运行几秒钟后,我停止接收新数据的通知

现在,我说这很奇怪,因为这发生在我使用笔记本电脑内部蓝牙时,而不是在使用蓝牙加密狗时。使用加密狗时,它工作正常,从不停止。内部蓝牙和加密狗驱动程序都更新到Windows可以找到的最新版本

一旦通知停止,传感器就会断开连接

该传感器基于北欧nRF52832 SoC

下面是关于我的代码的一些信息:

  • 我有一个Sensor.cs类,我在其中处理连接和数据流
  • 我正在使用
    BluetoothLEAdvertisementWatcher
    查找传感器
  • GattCharacteristic
    是传感器类的私有成员
  • 我通过拨打以下电话订阅通知:
这个应用程序没有做任何花哨的事情。只需连接到传感器,启动流式传输并打印数据

我做了相当多的研究,没有发现任何类似的。我发现过关于通知停止的帖子,因为对象被GC拿走了,特征是局部变量而不是类成员,或者没有等待调用

为什么会发生这种情况

第一次编辑 @Emil很抱歉,我的错是没有提到一旦通知停止,传感器就会断开。我正在编辑这个问题,以提及这一点,以及它的相关内容。不管怎么说,我正在尝试你提到的尽快

@GrooverFromhold已选中该选项。我曾在几台计算机上尝试取消选中该选项,但遗憾的是,取消选中该选项只会使代码持续几秒钟

@Nico Zhu-MSFT我已经按照您发布的链接阅读了文档,还转到了我的传感器手册,以仔细检查该特性是否允许通知,它确实允许读取和通知。我也做同样的事情
characteristic.ValueChanged+=characteristic\u ValueChanged如文件中所述

关于通知停止/值更改停止触发时传感器断开。我必须在我的主窗口中添加,sensor对象是一个成员类,它在任何时候都不会被释放。所以GC拿走对象是没有意义的,对吧

第二版 我已经尝试了我在笔记本电脑上使用的代码,无论是插上电源还是拔下电源,它总是设置为最高性能。我使用的代码可以在这里找到:

第三次编辑 根据@Emil的建议,我终于能够扫描流量。试图理解USBPcap生成的pcap文件是什么,但我就是不明白。我试过两个传感器的问题,每个传感器的断开/通知停止模式看起来不同。 我制作了一个Dropbox文件夹,其中包含两个pcap文件:


据我所知,在文件“ble-FE592382586F.pcap”中,有趣的行号是:12647和12681。它说源是控制器,目标是主机。控制器是笔记本电脑的蓝牙驱动程序吗?

控制器意味着蓝牙芯片(在计算机内部或外部),主机是主cpu。他们通过usb互相交谈。在第一个文件中的数据包12681处,断开连接的原因是连接超时(0x08)。这意味着连接意外中断(无线电干扰/坏信号?)。在另一个文件中的数据包613处,我们有相同的情况。不同之处在于,仅在第二个文件中,重新尝试连接设备


由于不使用绑定,因此必须确保在每次新连接时重新写入客户机特征配置描述符。你似乎没有这样做。

我遇到了类似的情况-我发现GattCharacteristic(你称之为WriteClientCharacteristicConfigurationDescriptorAsync的对象)正在获得GCD-我将其添加到一个类范围的变量(我制作了一个我跟踪的所有特征的字典)后,我的通知不断传来

您是否使用BLE嗅探器查看数据包是否真的通过空中发送?如果通知存在,您还应将USBPcap与Wireshark一起使用,以检查HCI数据包。在Windows设备管理器中,检查蓝牙设备属性。如果有“电源管理”选项卡,请确保未选中“允许计算机关闭此设备以节省电源”。请检查此文档。确保特征支持指示或通知(检查特征属性以确保)。因为大多数关贸总协定的交易宁愿节约能源,也不愿极为可靠。在任何情况下,所有这些都是在控制器层处理的,因此应用程序不会参与其中。@Emil谢谢你的提示,我一想起如何使用Wireshark就要尝试一下,我已经有一段时间没有使用过它了。此外,我还编辑了这个问题,并提供了有关该问题的更多信息,因为我遗漏了一些关键信息。@NicoZhu MSFT是的,该代码在笔记本电脑插上插头和拔下插头的情况下都进行了尝试,并始终达到最高性能。对于这个示例,我上传了这个repo,我使用的代码与bt加密狗完美配合:我将编辑问题以添加此内容。感谢您对pcap文件的评论,我已经浏览了这些文件,现在我知道在哪里可以查看未来的问题。现在,关于在每个新连接上重写CCCD,我了解到,在连接和查找特征时,一旦找到我想要从中获取通知的特征,我必须调用
wait_gattdatasensorschracteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
我已经试过了
await _gattDataSensorsCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(
   GattClientCharacteristicConfigurationDescriptorValue.Notify);