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

Android altBeacon有时我会在5瑞典克朗拿到一个信标,android,altbeacon,Android,Altbeacon,这是我的活动: public class MyActivity extends Activity implements BeaconConsumer, RangeNotifier { private BeaconManager mBeaconManager; @Override public void onResume() { super.onResume(); mBeaconManager = BeaconManager.getIns

这是我的活动:

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, 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);
    }
}
公共类MyActivity扩展活动实现BeaconConsumer、RangeNotifier{
私人信标管理人;
@凌驾
恢复时公开作废(){
super.onResume();
mBeaconManager=BeaconManager.getInstanceForApplication(this.getApplicationContext());
mBeaconManager.getBeaconParsers().add(新建BeaconParser()。
setBeaconLayout(BeaconParser.EDDYSTONE\u UID\u布局);
mBeaconManager.getBeaconParsers().add(新建BeaconParser()。
setBeaconLayout(BeaconParser.EDDYSTONE_TLM_LAYOUT));
mBeaconManager.Setbackground在扫描周期之间(0);
MBeAcon经理。挫折期(1100);
试一试{
mBeaconManager.updateScanPeriods();
}捕获(远程异常){
e、 printStackTrace();
}
mBeaconManager.bind(这个);
}
beacerviceconnect()上的公共无效{
区域区域=新区域(“所有信标区域”,null,null,null);
试一试{
MBeaconsistenregion(区域)Startrangbeaconregion经理;
}捕获(远程异常){
e、 printStackTrace();
}
mBeaconManager.addRangeNotifier(此);
}
@凌驾
公共无效范围信标区域(收集信标,区域){
Log.e(“beacon size”,beacons.size()+”);
用于(信标:信标){
//这是一个Eddystone UID帧
标识符namespaceId=beacon.getId1();
标识符instanceId=beacon.getId2();
Log.e(“Beacon”,Beacon.getBluetoothName()+”id:“+namespaceId+
“id2:”+实例ID+
“id3”+beacon.getId3());
//我们有遥测数据吗?
if(beacon.getExtraDataFields().size()>0){
long telemetryVersion=beacon.getExtraDataFields().get(0);
长电池毫伏=beacon.getExtraDataFields().get(1);
long pduCount=beacon.getExtraDataFields().get(3);
长期运行时间=beacon.getExtraDataFields().get(4);
}
}
}
@凌驾
公共无效暂停(){
super.onPause();
mBeaconManager.unbind(此);
}
}
一个DidRangeBeaconsisnRegion有时给我一个信标数组=0。为什么?我有时需要等待3-4秒才能获得非0大小的数组

有时我不得不等待一段时间才能得到一个非空的becons板,我不知道为什么会发生这种情况以及我做错了什么

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