C#、BLE。为什么 GetGattServicesAsync 永远挂起?是否有解决办法,例如关闭/打开 BLE?

问题描述 投票:0回答:1

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

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

var gatt = await device.GetGattServicesAsync();

我在这条线之前和之后放置了线,并验证它显然挂在这条线上。同样,可以是使用 8 小时或 24 小时后。在相当长的一段时间内,它确实运行得很好。杀死并重新启动该程序没有任何帮助。 它在第一次调用时挂起:

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

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

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

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

我找到了一些与此问题相关的链接,但没有任何明确的链接。
我还在努力编写一个更小、更完整的程序来展示这个问题。 到目前为止,我无法让示例程序失败,从中我得出结论:(1)我没有让它运行足够长的时间,或者(2)我没有完全复制我的完整程序所发生的情况。也许我没有给 BLE 驱动程序施加太大的压力,或者我没有监听信标并尝试以相同的比率或相同的时间进行连接。

我应该说,我看到很多关于 BLE 主机层和 BLE 驱动程序的 Windows 实现的抱怨。不幸的是,我一直使用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#。

非常感谢任何帮助。
谢谢!

c# uwp bluetooth-lowenergy
1个回答
0
投票

你找到解决办法了吗?我有完全相同的问题。

© www.soinside.com 2019 - 2024. All rights reserved.