使用BLE的onCharacteristicChanged()的GATT API调用与特征的getValue()有什么好处?

时间:2014-07-25 16:47:32

标签: android bluetooth bluetooth-lowenergy

我注意到,在查看蓝牙低功耗(BLE)的最佳做法时,Apple提到使用与Android GATT相比的onNotificationChanged()的API比在定期更新的特性上调用getValue()更有效。 / p>

  

“虽然使用readValueForCharacteristic:方法读取特征的值对某些用例有效,但它不是检索更改值的最有效方法。对于大多数特征值,例如,你的心脏在任何给定时间的费率 - 您应该通过订阅它们来检索它们。“

Link for reference

我正在使用我们有多个传感器的设备(类似于Text Insturment's CC2541)。幕后发生了什么(即蓝牙天线功率,传感器活动),使通知更有效?

我看到通过ping设备来设置设备的更新周期来调整传输速度是否有益(查询将是每个传感器每秒读取1-2次)。

1 个答案:

答案 0 :(得分:0)

不同之处在于,事件驱动的行为通常比轮询行为更有效。这对于电池供电的设备尤其重要,例如电话或嵌入式传感器。建立连接并读取值需要从两个设备进行传输 - 消耗电池电量。

使用通知只允许设备在有新数据时进行传输。

考虑几种不同的情景 -

首先,温度传感器。在许多环境(房间,甚至室外),温度相对稳定 - 在几分钟内变化几度。如果您每秒轮询传感器,那么99.99%的时间您将获得与上次相同的答案。如果传感器通知温度变化,您只会在0.01%的时间内传输 - 大大节省电量。

第二,心率传感器报告"表"该比率的费率和持续时间。这里的数据可以更频繁,更不可预测地改变 - 你不知道佩戴者什么时候开始或停止锻炼 - 但是在这些边缘之外"边缘"心率可能相当稳定 - 例如休息,看电视等。在这种情况下你可以进行轮询,但是你会在稳定期间浪费电力。通过通知,传感器可以周期性地通知新的心率信息集合可用,并且通知周期将根据心率的变化而变化。如果设备检测到严重但罕见的事件(例如心脏病发作),也可以立即通知。

当然,您可以在传感器上强制通知之前包括最长时间,例如30秒,以确保应用程序即使在没有任何内容的情况下也会定期更新。正在发生 - 与每秒两次轮询相比,这仍然意味着传输减少了83%。