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秒,即使应用程序要求它不断扫描。其他原始设备制造商也有类似的优化。这降低了检测频率,因为当信标发射器发送其广告时,接收器必须打开