Android蓝牙LE扫描非常难以预测

时间:2015-04-20 11:16:21

标签: android bluetooth-lowenergy android-bluetooth

我正在开发一款定期扫描BLE设备的Android应用,并将信标信息用于进一步的处理。我需要抓住距离最近的灯塔。

// Scan for bluetooth devices and parse results
private void scanLeDevice() {

    // Stops scanning after a pre-defined scan period.
    if(!mScanning){
        Handler mHandler = new Handler();
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "stop scanning");
                mScanning = false;
                mBluetoothAdapter.stopLeScan(mLeScanCallback);

                Log.v(TAG, "closing scan. beacon found:" + beaconFound);
                broadcastLocalUpdate();

                beaconFound = false;
                stopSelf();
            }
        }, SCAN_PERIOD);

        proximity=null;
        totalDevices=0;
        mScanning = true;
        mBluetoothAdapter.startLeScan(mLeScanCallback);
        Log.d(TAG, "start scanning");       
    }   
}

我使用的信标:

  • 每秒发布3次广告
  • 发出超过3个不同的频道
  • 我在一个房间里超过5个

在我的一个测试设备上,索尼Xperia z2,这是有效的。我得到了一长串具有Beacon信息和RSSI值的设备。每次扫描都会多次发现每个信标。

在我的另一个测试设备上,Motorolla Moto G(第2代),这种扫描表现得非常不可预测。在大多数扫描中,仅发现2或3个设备。其他场合它发现了大约10个设备(包括重复)。无论这些设备是近还是远,都无关紧要。

  • 这是软件问题还是硬件问题?
  • 如何改善BLE扫描的结果?

2 个答案:

答案 0 :(得分:0)

扫描结果针对每个收到的副词。不管是什么rssi。 天线是大多数手机上的共享资源。 Wifi,bt classic,ble。所以手机只能在Windows中监听。只有当adv落入这个窗口才会得到回调。手机必须通过3个频道收听。 因此,尝试使用您的adv间隔和adv包装尺寸。如果你在同一个房间里有很多人,你不应该使用太快的adv间隔,因为adv通道将被填充并且会发生碰撞。 尝试关闭wifi并重新测试。 避免使用经典的bt连接。 如果你能保持adv包短,请将名称放在scanresponse中。

答案 1 :(得分:0)

您的信标不经常播放频道,创造了一个非常真实的机会,即当接收机监控其频率时不会发生传输。每秒至少尝试10次传输,但如果你有外部电源,最好更多。

当然,发射器并不是全部 - 安卓手机在检测BLE广告时接收的数量差别很大,并且可能在相同条件下报告截然不同的信号电平。

您可能希望在短时间内通过多次扫描收集结果,并查看汇总数据,而不仅仅是单次扫描的数据。