代码之家  ›  专栏  ›  技术社区  ›  Dave

C,BLE。为什么GetGattServicesAync会永远挂起?是否有关闭/打开BLE等解决方法?

  •  0
  • Dave  · 技术社区  · 4 年前

    我考虑过交叉发布到超级用户网站或类似网站,但不知道该怎么做。正如您将看到的,这不仅仅是一个编程问题。

    我开发了一些C#代码,通过蓝牙低功耗(BLE)与Onset InTemp温度计通信。它长时间运行良好。我能够获取信标(其中包含温度计数据),并连接、获取服务和特征,以防我需要获取遗漏的数据或设置温度计的参数。然而,在连续接收信标和连接、获取历史数据等约8小时(可能长达24小时)后,我的应用程序挂在这条线上:

    var gatt = await device.GetGattServicesAsync();
    

    我把线放在这条线的前后,并确认它显然挂在这条线上。同样,它可以在使用8小时或24小时后使用。在相当长的一段时间里,它确实运行得很好。终止并重新启动程序无济于事。它挂在第一个电话上:

    device = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
    

    只有重新启动电脑才能解决问题。考虑到Windows事件日志中挂起之前的消息,这并不奇怪:

    蓝牙驱动程序预期会发生一定大小的HCI事件,但没有收到。

    正是出于这个原因,我说这可能是一个超级用户板问题。无论我的代码编程有多糟糕:),杀死程序应该会让BLE重新工作。FWW,在重新启动之前,我确实尝试过通过设置禁用/重新启用BLE。

    我发现了一些与这个问题相关的链接,但没有什么是非常明确的。
    我还在写一个更小、更完整的程序来显示这个问题。到目前为止,我无法让示例程序失败,从而得出以下结论:(1)我没有让它运行足够长的时间,或者(2)我没有完全复制整个程序的运行情况。也许我没有给BLE司机施加太大的压力,或者我没有在听信标,也没有试图以相同的比率或相同的时间连接。

    我应该说,我看到了很多关于Windows实现BLE主机层和BLE驱动程序的抱怨。不幸的是,我被Windows困住了。Nordic还表示,我所报道的一切都是一个“已知问题”,使用他们的Nordic加密狗将解决这个问题。例如,请参见: https://devzone.nordicsemi.com/f/nordic-q-a/65516/using-nrf52840-dongle-as-receiver-client-for-onset-thermometer .
    这可能是真的,但这需要做很多工作,因为他们有C++和Node中的库。JS,而不是C#。

    任何帮助都将不胜感激。
    非常感谢。

    0 回复  |  直到 4 年前