使用 altBeacon 参考让 XYFind iBeacon 与 Android 一起工作

Getting XYFind iBeacon to work with Android using altBeacon Reference

我有一个来自 XYFindit 的 iBeacon。需要让 Samsung Galaxy S4 Mini 运行ning KitKat 检测到它。

我 运行 来自 Radius 网络的定位应用程序,它似乎可以很好地找到信标。

截图如下: 但是当我 运行 AltBeacon Reference 程序时,屏幕上什么也看不到。我点击 "Start Ranging" 按钮,出现空白屏幕,什么也没有出现。

查看日志,我看到了这个:

D/BluetoothAdapter﹕ startLeScan(): null
D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=5
D/BluetoothAdapter﹕ onScanResult() - Device=00:EA:20:00:12:80 RSSI=-87
D/BluetoothAdapter﹕ stopLeScan()
D/BluetoothAdapter﹕ startLeScan(): null
D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=5
D/BluetoothAdapter﹕ stopLeScan()
D/BluetoothAdapter﹕ startLeScan(): null
D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=5
D/BluetoothAdapter﹕ onScanResult() - Device=00:EA:20:00:12:80 RSSI=-90
D/BluetoothAdapter﹕ stopLeScan()

那么,它似乎是在寻找设备的 MAC 地址,但除此之外什么都没有?我查看了@davidgyoung 给出的一些答案,但那里尝试过的东西似乎对我不起作用。

Radius Network 的 Locate App 有什么功能而 Reference App 没有?

了解默认情况下,Android Beacon 库及其参考应用程序默认仅检测 AltBeacon。如果你想像屏幕截图中显示的那样检测专有信标,你必须添加一个特殊的信标解析器表达式。这是一个简单的一行代码添加。

不幸的是,这是必要的,因为信标布局是专有的,不能在开源项目中发布。

要找到要添加的正确代码行,请尝试 Google 搜索 "getBeaconParsers"

万一其他人来这里试图解决这个问题,当然 @davidgyoung 关于解析器是正确的。但是,如果您正在寻找适用于 XYFindit 信标的布局,我在 SO 上找到了这个:

Is This The Correct Layout?

它对我有用。

修改后的class(如果要参考例子)其实就是

BeaconReferenceApplication

修改后是这样的:

public void onCreate()
{
    super.onCreate();
    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));

    Log.d(TAG, "setting up background monitoring for beacons and power saving");
    // wake up the app when a beacon is seen
    Region region = new Region("backgroundRegion",
            null, null, null);
    regionBootstrap = new RegionBootstrap(this, region);

    // simply constructing this class and holding a reference to it in your custom Application
    // class will automatically cause the BeaconLibrary to save battery whenever the application
    // is not visible.  This reduces bluetooth power usage by about 60%
    backgroundPowerSaver = new BackgroundPowerSaver(this);

    // If you wish to test beacon detection in the Android Emulator, you can use code like this:
    // BeaconManager.setBeaconSimulator(new TimedBeaconSimulator() );
    // ((TimedBeaconSimulator) BeaconManager.getBeaconSimulator()).createTimedSimulatedBeacons();
}