50

背景

理想情况下,我希望我的 Android 设备一直在扫描低功耗蓝牙设备,并能够在出现具有特定属性的新设备时启动应用程序。

因此,BLE 中的广播数据包将例如枚举广播设备提供的一组服务。然后,应用程序将能够注册对某些服务的兴趣,并在具有此服务的设备进入范围时自动启动。

据我了解,这不是 Android BLE API 的工作方式吗?那么我怎样才能得到类似的东西呢?

最简单的例子

我有一个 BLE 传感器,可以随时间记录环境温度。每当我的 Android 手机足够近时,我都想连接并下载所有数据,并将其发送到某个云存储解决方案。这个应用程序不需要任何 GUI(至少在配置完成后不需要)。但是它应该如何在不耗尽电池的情况下在后台运行,但一旦它在范围内仍然给我一个很好的机会快速连接设备?

问题

我是否需要设置一个计时器并每隔一段时间唤醒应用程序,然后手动开始扫描?然后我应该选择什么样的间隔。我可以让扫描仪运行多长时间而不会对电池产生不利影响?

可能的解决方案

到目前为止,这是我想出的。

  • 用于设置要扫描的时间间隔和设备的配置活动
  • 配置活动将设置一个类似于调度程序示例的 WakefulBroadcastReceiver
  • 当接收器收到 onReceive 事件时,我启动一个 BLE 扫描服务(我已经写过)作为唤醒服务。
  • 扫描服务开始扫描(带有注册的回调)。
  • 该服务可能会收到它可以采取行动的广告报告
  • 超时后,服务将停止扫描程序并结束唤醒服务。

这可行,但我不确定这是最好的方法。我也不知道我可以有多小的间隔并且仍然避免破坏电池寿命。我想要的是每两分钟开始扫描一次,扫描 10-20 秒。但恐怕唤醒设备会相当频繁?

4

1 回答 1

23

此功能已全部移至开源Android 信标库,该库将:

  • 当检测到与所需模式匹配的 iBeacon 时唤醒/启动您的应用程序

  • 即使用户尚未启动您的应用程序,也会在后台执行信标扫描

  • 在后台自动将扫描速率降低到每五分钟 30 秒以节省电池电量。(时间可配置。)

代码示例显示在这里

如果您的 BLE 设备不是信标,您仍然可以使用此库来完成此操作,方法是让您的传感器也作为信标传输,然后在检测到它之后连接到主服务。

于 2014-01-03T13:31:09.200 回答