xamarin - 在 IOS13 上的 Xamarin 中订阅外设特性时遇到问题
问题描述
我使用 BLE 连接到设备。该设备具有每 20 毫秒返回一次值的特性。我正在使用 SetNotifyValue(true, characteristic) 订阅一个特征。在 iOS 13 上,特征值的数量如此之大,以至于阻塞了整个应用程序。以前的版本没有这个问题。根据我的应用程序输出,iOS 13 接收到的数据量要大得多。
特征值被添加到队列中。然后我在另一个线程中读取/出列它们。在以前的 iOS 版本中,队列永远不会超过个位数。在 iOS 13 上,队列的大小迅速增长。在我停止应用程序之前,它达到了 10 000+。这些值的添加速度如此之快,以至于线程永远无法访问队列并将它们出列。
有没有人遇到过这个或类似的问题?我正在寻求有关如何进一步调查此行为原因的建议/建议。
我想看看是否每个订阅特性都这样做。我检查了电池百分比特性并订阅它工作正常。
如果在将值添加到队列之前大小超过 n,我尝试清空队列。这无济于事,因为值仍然以相同的速度出现,并且另一个线程仍然无法访问队列以使值出列。
我从有问题的特征中删除了 SetNotifyValue(true, characteristic) 并添加了一个计时器,该计时器将按时间间隔读取特征值。我尝试了不同的时间间隔(20ms / 50ms / 500ms / 10000ms)。看起来它仍然以某种方式订阅了该特性,因为应用程序输出与以前相同。
我目前不确定是否允许我显示任何/多少代码。
这是应用程序的输出。每行打印出最后 22 个接收到的值。我已经缩短了它以便于概述。我添加了这个来显示接收数据的速度。这是从 UpdatedCharacterteristicValue 打印出来的。
iOS 13:
[13:27:38.0410] 22 个值
[13:27:38.0416] 22 个值
[13:27:38.0423] 22 个值
[13:27:38.0430] 22 个值
[13:27:38.0435] 22 个值
[13:27:38.0440] 22 个值
[13:27:38.0445] 22 个值
[13:27:38.0450] 22 个值
[13:27:38.0455] 22 个值
[13:27:38.0461] 22 个值
[13:27:38.0465] 22 个值
iOS 10.3.4:
[13:20:19.0000] 22 个值
[13:20:19.0840] 22 个值
[13:20:20.0680] 22 个值
[13:20:21.0491] 22 个值
[13:20:22.0361] 22 个值
[13:20:23.0171] 22 个值
[13:20:24.0009] 22 个值
[13:20:24.0852] 22 个值
[13:20:25.0690] 22 个值
[13:20:26.0500] 22 个值
[13:20:27.0310] 22 个值
解决方案
问题是我在 UpdatedCharacteristicValue 中调用了 readValue。
在查看 nrfConnect 时,设备没有此特性的读取选项,仅通知。我的猜测是以前的版本处理这个不同。在 iOS 13 上再次进行了订阅。
删除 readValue() 调用后,应用程序现在按预期运行。
我还要感谢 Apple 支持帮助我联系硬件人员。在我的代码中找到错误至关重要。
推荐阅读
- amazon-web-services - AWS 上的 Kubernetes 入口/负载平衡
- angular - Angular 4 错误:“无法从应用程序模块解析外部模块”,延迟加载
- c# - 枚举中的 switch 语句。如何提高性能?
- javascript - 如果文本相同,如何从集合中推出一个数组
- javascript - 什么是 _interopRequireDefault ?
- html - 为什么向 div 添加内容会使它们不对齐?
- r - 避免在 purrr 映射调用中返回匿名函数中最后评估的表达式
- java - JVM 是否为未初始化的对象调用终结器?
- python - GLIBC_2.12 问题
- excel - 在有条件的列中查找