如何让 make android app 检测到 Eddystone 信号?

How to make make android app detect Eddystone signal?

我指的是 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 部分列表吗?我假设如果我们只改变那部分,我们就可以接收信号(对于我们设置布局的信号格式。

非常感谢。

最近我也在努力实现同样的目标,并找到了解决方案 。 您还需要通过将信标置于 Eddystone UUID 模式来配置信标。 通过仅更改 setBeaconLayout 我们将无法检测到不同的信标格式。例如 - 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 模式,然后打开信标,以便您的应用可以检测到它。

我觉得代码不错。确保您的信标实际传输的是 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 信标库版本中的错误。请参阅我的其他答案了解详情。

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

该错误已在库的 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'