Android BLE邻近通知

时间:2014-07-22 18:08:05

标签: java android bluetooth-lowenergy android-bluetooth

我一直致力于开发与BLE设备交互的应用程序。一切都很好,我可以扫描,连接和使用服务。

我一直在阅读所有文档,但我没有看到任何让开发人员选择收听BLE设备的选项。基本上我想在设备进入BLE设备范围时触发广播接收器。

我知道我可以继续扫描这个,但电池使用率太高了,即使我的应用程序没有被使用,我也希望调用它。

是否不支持此功能,或者我是否遗漏了讨论此内容的文档部分?

4 个答案:

答案 0 :(得分:5)

我最近做了一个项目,从我在你的问题中看到的,它与我所做的有些相似。

  

我知道我可以继续扫描这个,但电池使用率太高了,我希望即使我的应用程序没有被使用也可以调用它。

关于电池问题,一直使用蓝牙是耗电的,但同时你无法在没有蓝牙的情况下检测到BLE。

我所做的是两个实验,两个都很有用但不同,我不能说哪一个是最好的,但你需要测试它以符合你的要求。

  1. 让线程运行,打开蓝牙并以编程方式监听iBeacon并关闭(使用休眠时间)。它可以通过多种方式完成。

  2. 使用名为Altbeacon的软件包,有许多有用的功能,其中一项功能是使用example code自动省电:

    public class MyApplication extends Application implements BootstrapNotifier {
        private BackgroundPowerSaver backgroundPowerSaver;
    
        public void onCreate() {
            super.onCreate();
            // Simply constructing this class and holding a reference to it
            // in your custom Application class
            // enables auto battery saving of about 60%
            backgroundPowerSaver = new BackgroundPowerSaver(this);
        }
    }
    
  3.   

    我们需要一个广播事件,一旦具有特定Service-UUID的BLE设备到达,就会唤醒我们的应用程序。也许现在有比2年前更好的BLE API。最节能,最精确的方法得到了回报。

    你的另一部分,它被称为特定距离的触发动作。 我仍然使用Altbeacon来检查信标范围和触发动作。 sample code类似于

    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
        for (Beacon beacon : beacons) {
            if (beacon.getDistance() < 5.0) {
                Log.d(TAG, "I see a beacon that is less than 5 meters away.");
                // Perform distance-specific action here
            }
        }
    }
    

    所以当说,你也可以获得特定UUID的距离我建立一个基于Altbeacon的方法,看起来像这样(查看for循环和if语句):

    private void startRangeNotifier() {
        Log.i(TAG, "Starting range notifier...");
        beaconManager.setRangeNotifier(new BeaconRangeListener() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    
                if (beacons.size() > 0) {
                    for (Beacon beacon : beacons) {
                        Log.d(TAG, "uuid's: " + beacon);
                        Log.d(TAG, "uuid id1: " + beacon.getId1());
                        if (beacon.getId1().toString()
                                .equals("b9407f30-f5f8-466e-aff9-25556b57fe6d")) {
                            Log.d(TAG, "uuid id1 distance: " + beacon.getDistance());
                        }
                    }
    
                }
            }
        });
    
        try {
            beaconManager.startRangingBeaconsInRegion(
                    new Region(BEACON_MONITORING_ID, null, null, null));
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    

    我的日志输出:

    D/Main activity:: uuid's: id1: b9407f30-f5f8-466e-aff9-25556b57fe6d id2: 31807 id3: 59251
    D/Main activity:: uuid id1: b9407f30-f5f8-466e-aff9-25556b57fe6d
    D/Main activity:: uuid id1 distance: 0.2108658568686884
    

    在我的回答中,我想提出我使用的概念,Beacons项目总体上需要耐心。正如另一个答案所提到的,也可以将此处的解决方案与Geofences和ActivityRecognition结合起来。

      

    注意:由于蓝牙信标的性质,距离是接近而不是绝对的,有时甚至蓝牙信标是1米,它可能显示2米或0.5米,所以有这个想法

    链接参考:

答案 1 :(得分:4)

在Android上进行BLE扫描是相当耗电的,而且它绝对不是你想在后台做的事情。如果您正在处理具有固定蓝牙设备(àlabebeons)的后台应用程序,您知道它的位置,当您认为自己处于设备的近似位置时,可以使用Geofences打开和关闭扫描。如果你不小心,地理围栏也会耗尽电池。

如果您不知道蓝牙设备的位置,我猜您也可以使用ActivityRecognition玩弄技巧,即只在用户步行时定期扫描并在用户静止/跑步/骑自行车时停止扫描/在车辆中。同样,活动识别的东西也需要电池,所以你必须要明智。

答案 2 :(得分:2)

  

我们需要一个广播事件,一旦具有特定Service-UUID的BLE设备到达,就会唤醒我们的应用程序。

您可能知道如何按服务UUID过滤扫描结果,所以我不会进入。关于醒来:如果你的应用正在扫描,它的清晰度就是清醒。它可能是也可能不是前景,但它是清醒的。

  

也许现在有比2年前更好的BLE API。

自SDK版本21以来,您可以使用新的API进行BLE扫描。据我所知,唯一的区别是您访问API的方式和底层功能(关于功耗等)没有改变。

关于扫描:
扫描是电池密集型的。即使是docs也这么说。

强度是相对的。与完全不扫描相比,这是非常密集的,但它不够密集,以至于它将无可救药地耗尽电池。毕竟它被称为低能量

另一个答案建议监控Geofences,只有当您知道自己处于BLE设备范围内时才会进行扫描。虽然这会降低 ble scan 的电池消耗,但它需要为GPS提供电池电量,否则它无法监控Geofences(好吧,它可以使用蜂窝/ wifi数据,但是然后它就不会那么准确了。)

取决于您的扫描时间的关键时间(例如,如果附近有设备,必须您知道立即?或者如果延迟了一对,是否可以秒?)你可以在扫描之间实现暂停。

假设您扫描5秒钟,暂停5秒钟,再次扫描5秒钟。这样你就可以一直扫描几乎,但只消耗大约一半的电池电量。可以调整这些间隔以符合您的情况。也许你可以通过扫描3秒钟并暂停10分钟。(注意the maximum time between a device's broadcasts is 10.24 seconds)。

我有一个有大约50个用户的应用程序,在后台24/7扫描这样的暂停(扫描3秒,暂停3,重复),并且没有收到任何有关电池使用过量的投诉。

答案 3 :(得分:-1)

如果您要检测特定的BLE外围设备,请找出其广告时段。如果您有不同的设备,请找到最长的广告时段。扫描时间长于设备的广告时段,因此您至少会收到一条广告消息。定期以适合您用例的频率重复扫描。例如。您的外围设备每秒都会广告一次。在接近时,您希望在5秒内检测到设备。然后扫描1秒(或更多)。关闭扫描4秒。这样可以节省电量。