android - 在 Android 上为低功耗蓝牙创建后台服务

标签 android bluetooth-lowenergy

背景:

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

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

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

最简单的例子:

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

问题:

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

可能的解决方案:

这是我迄今为止想出的。

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

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

最佳答案

此功能已全部移至开源 Android Beacon Library这将:

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

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

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

代码示例显示here

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

关于android - 在 Android 上为低功耗蓝牙创建后台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914244/

相关文章:

android - 使用 ConstraintLayout 查看与工具栏的重叠

java - Android 自动完成 TextView 下拉宽度

android 蓝牙低功耗状态 = 61

iOS 将 WIFI 设置传递给蓝牙(BLE)设备?

c++ - Windows 上的低功耗蓝牙堆栈溢出

ios - 如何让 CC2541 在广告数据中包含 kCBAdvDataServiceUUID

java - 如何在 Android Studio 中导入 android.support.v7.app.NotificationCompat.Builder 类

android - 通过匹配adb设备ID的代码获取ID?

android - 无法通过servlet向mysql插入数据

python-3.x - 无法连接到套接字/opt/local/var/run/dbus/system_bus_socket : No such file or directory