【问题标题】:Are there benefits of using the BLE's GATT API call of onCharacteristicChanged() versus getValue() of a characteristic?使用 BLE 的 GATT API 调用 onCharacteristicChanged() 与 getValue() 相比有什么好处吗?
【发布时间】:2014-07-27 08:08:09
【问题描述】:
我注意到,在查看低功耗蓝牙 (BLE) 的最佳实践时,Apple 提到使用与 Android GATT 的 onNotificationChanged() 相当的 API 比在定期更新的特性上调用 getValue() 更有效。
“虽然使用 readValueForCharacteristic: 方法读取特征值对于某些用例可能是有效的,但它并不是检索变化值的最有效方法。对于大多数变化的特征值,例如,你的心脏任何给定时间的汇率——您应该通过订阅它们来检索它们。”
Link for reference
我正在开发一个我们有多个传感器的设备(类似于Text Insturment's CC2541)。幕后发生了什么(即蓝牙天线功率、传感器活动)使通知更高效?
我正在查看通过在设备上设置更新周期、通过 ping 设备来调整传输速度是否有益(查询将是每个传感器每秒获取 1-2 次读数)。
【问题讨论】:
标签:
android
bluetooth
bluetooth-lowenergy
【解决方案1】:
不同之处在于,通常事件驱动的行为比轮询行为更有效。这在电池供电的设备上尤其重要,例如电话或嵌入式传感器。建立连接和读取值需要从两个设备进行传输 - 消耗电池电量。
使用通知允许设备仅在有新数据时进行传输。
考虑几个不同的场景 -
首先,温度传感器。在许多环境(房间,甚至室外)中,温度相对稳定 - 几分钟内变化几度。如果您每秒轮询一次传感器,那么 99.99% 的时间您将获得与上次相同的答案。如果传感器在温度变化时发出通知,您将只传输 0.01% 的时间 - 节省大量电力。
其次,一个心率传感器,它报告该速率的速率和持续时间的“表格”。此处的数据可能会更频繁地变化且难以预测——你不知道佩戴者何时开始或停止锻炼——但在这些“边缘”之外,心率可能相当稳定——例如在休息、看电视时等等。在这种情况下,您可以进行轮询,但您将在稳定期间浪费电力。通过通知,传感器可以定期通知有新的心率信息集合可用,并且通知周期将根据心率的变化程度而变化。如果检测到严重但罕见的事件(例如心脏病发作),该设备还可以立即通知。
当然,您可以在通知强制发送到您的传感器之前添加一个最长时间(例如 30 秒),以确保即使“没有”发生任何事情,应用程序也会收到定期更新 - 这仍然意味着减少了 83%在传输中与每秒轮询两次相比。