【问题标题】:Android BLE Beacon scanningAndroid BLE 信标扫描
【发布时间】:2013-09-24 05:33:06
【问题描述】:

蓝牙 LE 是在 Android 4.3 中添加的,但似乎没有后台扫描模式,一旦应用注册通过附近可用的 BLE UUID 获得通知,它就会唤醒应用。

这似乎完全可以通过 iOS7 和 iBeacons API 实现。有谁知道 Android 4.3 中是否有这样的功能,或者是否有一个很好的解决方法来定期扫描 B​​LE 设备的 BLE 环境?

http://developer.android.com/guide/topics/connectivity/bluetooth-le.html

http://techcrunch.com/2013/09/11/estimote-details-ios-7-ibeacon-support-for-its-contextual-proximity-shopping-devices/

【问题讨论】:

    标签: android bluetooth ibeacon-android


    【解决方案1】:

    我认为有一个解决方法如下: 您需要实现一个服务并创建线程到while循环来调用mBluetoothAdapter.startLeScan(mLeScanCallback),然后您可以检查是否被特定设备触发并进一步搜索特定的UUID。

    【讨论】:

    • 我即将实现这一点。但是我可能会创建一个广播接收器并每 1 分钟唤醒一次,而不是运行一个连续的服务。在地理围栏正式添加到游戏服务之前,我使用了这个。显然,问题在于应用程序之间不共享信息/扫描,并且效率会降低。但应该可以。
    • 您的建议没问题,可以在某些情况下使用,但它更像是一种幼稚的实现。这种方法的问题肯定是功耗。请注意 BLE 文档页面中的这一行“要查找 BLE 设备,请使用 startLeScan() 方法。此方法将 BluetoothAdapter.LeScanCallback 作为参数。您必须实现此回调,因为这是返回扫描结果的方式。因为扫描是电池密集型的......”我认为可能有更好的方法来做这件事,比如在地理围栏 API 中注册系统范围的事件
    • +1 用于提醒文档说它是电池密集型的。您还可以连接到尚未收到广告的设备并将 autoConnect 设置为true。 (BluetoothDevice 可以这样创建:BluetoothAdapter.getDefaultAdapter().getRemoteDevice("20:00:A0:60:DD:05");)但是,它只有在您开始扫描时才会连接。似乎还没有某种背景扫描。也许他们稍后会添加。
    【解决方案2】:

    直接来自android示例,您可以使用处理程序:

    private void scanLeDevice(final boolean enable) {
            if (enable) {
                // Stops scanning after a pre-defined scan period.
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mScanning = false;
                        mBluetoothAdapter.stopLeScan(mLeScanCallback);
                        invalidateOptionsMenu();
                    }
                }, SCAN_PERIOD);
    
                mScanning = true;
                mBluetoothAdapter.startLeScan(mLeScanCallback);
            } else {
                mScanning = false;
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
            }
            invalidateOptionsMenu();
        }
    

    【讨论】:

    • 您知道我是否可以使用此代码检测 iBeacons,还是需要额外的库?
    【解决方案3】:

    根据我的经验,最好创建一个保持运行的服务。重要的是只扫描你感兴趣的信标,否则你会浪费大量的cpu功率来解析信标消息。

    这个库可以帮助您扫描您感兴趣的 iBeacons:https://github.com/inthepocket/ibeacon-scanner-android

    此外,当无法扫描时(由于蓝牙关闭、位置关闭、权限撤销),您必须在每次再次满足所有需要的条件时重新开始扫描,这里您将需要广播监听器。

    能够扫描的条件:

    • 有一个低功耗蓝牙芯片:任意。

    • 开启蓝牙:任意。

    • 定位在:Android 6+。

    • 拥有定位运行时权限:Android 6+。

    • 30 秒内最多启动 5 次扫描:Android 7+。

    【讨论】: