在Android上为蓝牙低功耗创build后台服务

背景

理想情况下,我希望我的Android设备始终能够扫描Bluetooth Low Energy设备,以便每当出现具有特定属性的新设备时启动应用程序。

因此,BLE中的广播包例如列举了由广播设备提供的一组服务。 然后,应用程序就可以注册某些服务的兴趣,并在具有此服务的设备进入范围时自动启动。

从我的理解,这不是如何Android BLE API的作品? 那么我怎么能得到类似的东西?

最简单的例子

我有一个BLE传感器可以logging环境温度。 每当我的Android手机足够接近我想连接并下载所有的数据,发送到一些云存储解决scheme。 这个应用程序不需要任何GUI(至less在configuration完成后)。 但是如何在不消耗电池的情况下在后台运行,但是一旦处于范围之内,还是给了我一个很好的连接设备的机会?

问题

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

可能的scheme

这是我到目前为止所提出的。

  • configuration活动来设置要扫描的时间间隔和设备
  • configuration活动将设置一个类似于Scheduler例子的WakefulBroadcastReceiver
  • 当接收者得到onReceive事件时,我开始一个BLE扫描服务(我写的)作为一个醒目的服务。
  • 扫描服务开始扫描(使用注册callback)。
  • 该服务可能会得到副作用的报告
  • 超时后,服务将停止扫描器并结束清醒的服务。

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

此function已全部移至开放源代码Android Beacon库 ,该库将:

  • 当检测到符合期望模式的iBeacons时,唤醒/启动您的应用程序

  • 在后台执行信标扫描,即使用户还没有启动您的应用程序

  • 每5分钟将后台的扫描速率自动降低到30秒,以节省电量。 (定时可configuration)

代码示例显示在这里

如果您的BLE设备不是信号灯,您仍然可以使用这个库来实现这一点,让您的传感器也作为信标传输,然后检测到连接到主要服务。