问题描述
这是我的活动:
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也有类似的优化。这降低了检测频率,因为当信标发送器发送其广告时,接收器必须处于打开状态。