如何让Android应用程序检测Eddystone信号?

时间:2015-11-14 11:35:29

标签: android altbeacon android-ibeacon beacon

我的项目是指https://github.com/AltBeacon/android-beacon-library-reference

通过文档和一些评论,我发现他们默认接收altBeacon信号。我想知道,我们如何个性化它以阅读其他不同的信标格式,如Eddystone和iBeacon。

由于它是开源的,我会坚持下去,然后相应地个性化(更新)。

例如,我们需要使用以下代码设置信标布局:

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

编辑:我按照答案中的建议更改了代码的setBeaconLayout部分。它还没有用。

我使用了以下代码(我指的是https://github.com/AltBeacon/android-beacon-library-reference)。我添加了那些setBeaconLayout部分来接收eddystone信号,遗憾的是,我没有收到。但如果我删除它,我可以收到altBeacon信号。

 public void onCreate() {
    super.onCreate();
    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().clear();
    beaconManager.getBeaconParsers().add(new BeaconParser().
    setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)); //for Eddystone... 
    Log.d(TAG, "setting up background monitoring for beacons and power saving");
    Region region = new Region("backgroundRegion",null, null, null);
    regionBootstrap = new RegionBootstrap(this, region);
    backgroundPowerSaver = new BackgroundPowerSaver(this);
}

任何人都可以帮助我吗?如何让我的应用程序接收eddystone信号?

P.s有人还可以为不同的信号提供样本setBeaconLayout部分的列表。我假设如果我们只改变那部分,我们就可以接收信号(对于我们设置布局的信号格式。

非常感谢提前。

3 个答案:

答案 0 :(得分:0)

最近我努力实现同样的目标,并得到了解决方案here。 您还需要通过将其置于Eddystone UUID模式来配置信标。 通过仅更改setBeaconLayout,我们将无法检测到不同的信标格式.Eg - Eddystone UID格式与iBeacon UID格式不同。 您可以使用类似的东西探索不同的信标格式 mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));

所以你的代码看起来应该是,

public class MyApplication extends Application implements BootstrapNotifier {
private static final String TAG = "MyApplication";
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;
private BeaconManager mBeaconManager;

public void onCreate() {
    super.onCreate();
    mBeaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    mBeaconManager.getBeaconParsers().clear();
     mBeaconManager.getBeaconParsers().add(new BeaconParser().
        setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
    Region region = new Region("my-beacon-region", null, null, null);

    regionBootstrap = new RegionBootstrap(this, region);

    backgroundPowerSaver = new BackgroundPowerSaver(this);
}

@Override
public void didEnterRegion(Region region) {

        Log.d("radbeacon", "Beacon detected in region");
}

@Override
public void didExitRegion(Region region) {

    Log.d("radbeacon", "Beacon out of region");
}

@Override
public void didDetermineStateForRegion(int i, Region region) {
      //Ignore
    }

}

另外,不要忘记将您的信标置于Eddystone UID模式,然后打开信标,以便您的应用可以检测到它。

答案 1 :(得分:0)

代码对我来说很好看。确保您的信标实际上正在传输Eddystone-UID帧。您可以在Google Play商店试用Beacon Locate应用吗?它基于相同的库,并使用与问题中显示的类似的代码片段。我使用具有类似代码的应用程序来成功检测Eddystone-UID信标。

如果这不起作用,请通过调用mBeaconManager.setDebug(true)打开应用中的低级调试,并粘贴LogCat的输出,如下所示:

D/BeaconParser﹕ This is not a matching Beacon advertisement. (Was expecting be ac. The bytes I see are: 0201061aff4c0002153d9d4c66fb0f11e3ab64c82a143314d68079186cb61c09426c756542617220426561636f6e20383833333134453537383038000000

这将告诉我们信标实际传输的字节数,因此我们可以看到它是否采用Eddystone-UID格式。

编辑:问题似乎是2015年11月15日之前与参考应用程序捆绑在一起的Android Beacon Library版本中的错误。有关详细信息,请参阅我的其他答案。 < / p>

答案 2 :(得分:0)

截至2015年11月15日,参考应用程序中使用的Android Beacon Library版本2.6中存在一个错误。该错误阻止使用默认区域规范检测Eddystone信标< / strong>有三个空标识符。

该错误已修复,如同2.6.1版的库一样。我在2015年11月16日将参考应用程序升级到使用版本2.7,其中包括该错误修复。

简单的解决方案是使用参考应用程序的最新副本,或修改您必须更改行的副本:

compile 'org.altbeacon:android-beacon-library:2.6@aar'

compile 'org.altbeacon:android-beacon-library:2.7@aar'