为什么altbeacon库只检测少量信标

时间:2018-08-20 21:38:42

标签: android ibeacon beacon altbeacon ibeacon-android

我正在开发一个android应用程序,每隔1秒钟检测一次信标,我使用altbeacon库来实现该服务,我使用了200个信标来测试了此应用程序,但是我的应用程序只能检测到40-80个数字信标,而不是200个信标,我认为可能是因为信标的广告间隔,所以我将所有信标的间隔调整为300ms,最后我仍然得到类似的结果(小于80),有人知道这是怎么回事吗?

在这里附上我的主要代码:
我首先使用布局初始化beacomanager并绑定服务:

    private void initManager(){
    beaconManager = BeaconManager.getInstanceForApplication(getActivity().getApplicationContext());

    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));

    beaconManager.setForegroundScanPeriod(1000);
    beaconManager.setForegroundBetweenScanPeriod(0);

    beaconManager.bind(this);

    try {
        if (beaconManager.isAnyConsumerBound()) {
            beaconManager.updateScanPeriods();
        }
    } catch (RemoteException e) {
        Log.e("RECO", "update scan periods error", e);
    }
    }

然后我从onBeaconServiceConnect获取结果并将其发送到主线程(我创建了一个发信给startranigng的信标)

    @Override
public void onBeaconServiceConnect() {
    Log.d(TAG, "onBeaconServiceConnect called");
    beaconManager.addRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            Log.i("RECORangingActivity", "didRangeBeaconsInRegion() region: " + region.getUniqueId() + ", number of beacons ranged: " + beacons.size());


            // send bacon to main_activity to update UI
            ArrayList<Beacon> scanedBeacon = new ArrayList<Beacon>(beacons);
            // rank beacon by RSSI
            Collections.sort(scanedBeacon, new Comparator<Beacon>() {
                public int compare(Beacon one, Beacon other) {
                    return Integer.compare(other.getRssi(), one.getRssi());
                }
            });

            Intent intent = new Intent(action);
            intent.putParcelableArrayListExtra("RecoBeacon", scanedBeacon);
            getActivity().sendBroadcast(intent);
        }
    });
}

最后,我创建了startranging和stopranging函数以对其进行控制,并将startranging放入onclicklistener内的线程中;

    private void startRanging(){
    Log.d(TAG, "start Ranging beacons");

    try {
        beaconRegion = new Region("MyBeacons", Identifier.parse(RECO_UUID), null, null);
        beaconManager.startMonitoringBeaconsInRegion(beaconRegion);
        beaconManager.startRangingBeaconsInRegion(beaconRegion);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

private void stopRanging(){
    Log.d(TAG, "stop Ranging beacons");
    try {
        beaconManager.stopMonitoringBeaconsInRegion(beaconRegion);
        beaconManager.stopRangingBeaconsInRegion(beaconRegion);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}



    startBT.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        startBT.setText("Running");
        startBT.setEnabled(false);

        Thread t1 = new Thread(){
            @Override
            public void run() {
                startRanging();
            }
        };
        t1.start();
    }
    })  

,检测结果如下:

    08-21 06:33:51.373 10408-11779/com.example.haoch.groupsI/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 60
    08-21 06:33:52.394 10408-11780/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 49
    08-21 06:33:53.416 10408-11781/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 43
    08-21 06:33:54.475 10408-11782/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 58
    08-21 06:33:55.515 10408-11783/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 64
    08-21 06:33:56.541 10408-11784/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 64
    08-21 06:33:57.566 10408-11785/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 46
    08-21 06:33:58.599 10408-11786/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 68
    08-21 06:33:59.637 10408-11788/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 68
    08-21 06:34:00.665 10408-11789/com.example.haoch.groupse I/RECORangingActivity: didRangeBeaconsInRegion() region: MyBeacons, number of beacons ranged: 72  

显然,这是错误的检测结果,它应该可以检测到近200个信标,但我只能得到很少的信标。

1 个答案:

答案 0 :(得分:0)

坏消息是,图书馆可能不是限制您的地方。这是手机上的蓝牙堆栈。您可以同时成功扫描的信标数量很大程度上取决于两个因素:

  1. 正在使用的Android设备模型的蓝牙堆栈(硬件,固件和操作系统软件)。
  2. 设备的CPU电源。 第一个因素几乎总是限制因素。第二个因素仅在信标回调中正在进行大量处理(或在库中打开调试日志记录)时起作用。

我已经对许多三星设备型号进行了测试,因为这些是市场上最常见的一些设备。 Galaxy S5(Android 6)的性能优于S8(Android 7)或S9(Android 8)。我已经看到它在5分钟的时间内检测到大约350个唯一的信标传输,但是并非所有这些都在同一测距周期中被检测到-通常少于100。每个测距周期都会检测到一组不同的信标,但是他们所有的时间。

一个设备型号与另一个设备型号之间有很大差异,并且价格也不是预测因素。 S8和S9在一个周期内检测到的信标少于S5。 Nexus 5X(Android 6)简直糟透了,只能检测到比S5少10%的信标。华为P9(Android 7)的性能类似于三星Galaxy S8和S9。

要确认手机型号是关键因素,请尝试同时在几台不同的手机上运行完全相同的应用,并计算检测到的信标数量。您可能会发现设备型号之间存在很大差异。