Android altBeacon有时我会在5瑞典克朗收到一个信标

问题描述

这是我的活动:

public class MyActivity extends Activity implements BeaconConsumer,RangeNotifier {

    private BeaconManager mBeaconManager;

    @Override
    public void onResume() {
        super.onResume();
        mBeaconManager = BeaconManager.getInstanceForApplication(this.getApplicationContext());
        mBeaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
        mBeaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout(BeaconParser.EDDYSTONE_TLM_LAYOUT));
        mBeaconManager.setBackgroundBetweenScanPeriod(0);
        mBeaconManager.setBackgroundScanPeriod(1100);
        try {
            mBeaconManager.updateScanPeriods();
        } catch (remoteexception e) {
            e.printstacktrace();
        }
        mBeaconManager.bind(this);
    }

    public void onBeaconServiceConnect() {
        Region region = new Region("all-beacons-region",null,null);
        try {
            mBeaconManager.startRangingBeaconsInRegion(region);
        } catch (remoteexception e) {
            e.printstacktrace();
        }
        mBeaconManager.addRangeNotifier(this);
    }

    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons,Region region) {
        Log.e("beacon size",beacons.size() + "");
        for (Beacon beacon : beacons) {
                // This is a Eddystone-UID frame
                Identifier namespaceId = beacon.getId1();
                Identifier instanceId = beacon.getId2();
                Log.e("Beacon ",beacon.getBluetoothName() +" id: " + namespaceId +
                        " id2: " + instanceId +
                        " id3 " + beacon.getId3());

                // Do we have telemetry data?
                if (beacon.getExtradatafields().size() > 0) {
                    long telemetryVersion = beacon.getExtradatafields().get(0);
                    long batteryMilliVolts = beacon.getExtradatafields().get(1);
                    long pduCount = beacon.getExtradatafields().get(3);
                    long uptime = beacon.getExtradatafields().get(4);


                }
            }

    }

    @Override
    public void onPause() {
        super.onPause();
        mBeaconManager.unbind(this);
    }
}

and didRangeBeaconsInRegion有时会给我一个beacons数组= 0。为什么呢有时候我需要等待3-4秒才能得到大小不为0的数组。

有时我需要等待一点时间才能获得一个非空的becons板,我不知道为什么会这样以及我在做什么错

解决方法

几点:

  • 未接收到100%的已发送信标。错过检测的原因包括无线电噪声和碰撞。通常,80-90%的传输是在近距离接收的(距离越远越少),而接收力弱的接收则少。
  • 虽然80%的成功率听起来很高,但平均律却意味着有时候您很长一段时间都不会被发现。这类似于掷硬币并连续10次获得正面奖励。发生了。
  • 不同的信标以不同的速率投放广告。苹果公司建议使用10 Hz的发射器,但是许多信标制造商将其降低到1Hz或更小以节省电池寿命。不幸的是,不频繁的传输将导致更频繁的问题,如此处所述。如果可以,请将信标设置为10 Hz的传输速率。如果您不知道信标的传输速率,则可以使用我的BeaconScope应用程序分析信标,并给出接收的PPS(每秒数据包)得分。注意:此应用上的PPS分数将始终比实际广告费率低一点,因为如上所述某些数据包在收据中丢失。
  • 不同的手机使用不同的“扫描窗口”进行扫描,尤其是在后台。例如,三星手机有时会在后台切换到低功耗扫描,即使该应用已告知它要不断扫描,它也会在后台每10秒扫描0.5秒。其他OEM也有类似的优化。这降低了检测频率,因为当信标发送器发送其广告时,接收器必须处于打开状态。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...