Android在Linux上找到使用Bluez创建的信标

时间:2017-05-20 04:34:57

标签: android linux raspberry-pi beacon eddystone

您好我正在尝试将Android应用程序连接到我在RaspberryPi 3上使用Bluez 5.23创建的Eddystone UID Beacon。

使用以下命令创建信标:

sudo hciconfig hci0 up
sudo hciconfig hci0 leadv 3
sudo hcitool -i hci0 cmd 0x08 0x0008 1F 02 01 06 03 03 AA FE 17 16 AA FE 00 E7 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 00 00

此灯塔显然工作正常,因为我可以使用某些商店应用Beacon Toy在Android设备中看到它。

我在主要活动中使用以下代码以发现信标:

public class MainActivity extends AppCompatActivity implements BeaconConsumer, MonitorNotifier {
...
@Override
public void onResume() {
    super.onResume();
    beaconManager = BeaconManager.getInstanceForApplication(this.getApplicationContext());
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
    beaconManager.bind(this);
}

@Override
public void onBeaconServiceConnect() {
    Region region = new Region("my-beacon-region", null, null, null);
    beaconManager.addMonitorNotifier(this);
    try {
        beaconManager.startMonitoringBeaconsInRegion(region);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

public void didEnterRegion(Region region) {
    Log.d(TAG, "I detected a beacon in the region with namespace id " + region.getId1() +
            " and instance id: " + region.getId2());
}
}

任何人都知道可能会发生什么?永远不会调用方法didEnterRegion。我还在类中放了一个'didDetermineStateForRegion'方法,但我总是在状态参数中收到OUTSIDE,这意味着我不在该区域。

1 个答案:

答案 0 :(得分:1)

我猜您没有请求或不批准您的应用程序的蓝牙和位置权限。请看:https://altbeacon.github.io/android-beacon-library/requesting_permission.html

如果您拥有正确的权限,那么很少有问题可以确定:
灯塔玩具应用程序将灯塔识别为 Eddystone UID 吗? 是onBeaconServiceConnect吗?

一个小提示:我建议你在onCreate方法而不是onResume中初始化BeaconManager。您正在立即恢复应用程序时添加新的解析器。我实际上是在应用程序对象中执行此操作,因为即使onCreate of activity也可以多次调用。