AltBeacon didEnterRegion()/ didExitRegion与PiBeacon无法正常工作。随机调用方法

时间:2016-05-19 21:07:28

标签: android ibeacon ibeacon-android altbeacon

我是Android开发和蓝牙LE的新手。在发布之前我已经研究了很多。我相当肯定,我做错了什么,我无法理解。

我希望我的Android应用程序在某个Beacon(带蓝牙加密狗的RaspberryPi)的指定范围内执行某些代码。

这是我在RPi上用来开始发射的命令:

sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39
     F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00

我编辑了BeaconLayout以检测iBeacons:

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

除自定义区域外,代码来自AltBeacon文档。

Region region1 = new Region("RaspberryPi", Identifier.parse("E20A39F4-73F5-4BC4-A12F-17D1AD07A961"), null, null);

beaconManager.setMonitorNotifier(new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {
            Log.i(TAG, "I just saw a beacon for the first time!");
        }

        @Override
        public void didExitRegion(Region region) {
            Log.i(TAG, "I no longer see a beacon");
        }

        @Override
        public void didDetermineStateForRegion(int state, Region region) {
            Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+ state);
        }
    });

try {
    beaconManager.startMonitoringBeaconsInRegion(region1);
} catch (RemoteException e) {      }

现在这是我得到的日志的一部分。在此期间,灯塔没有离开该地区。除了在我运行应用程序时随机发生的那些调用之外,这些方法永远不会再被调用:

05-19 23:18:52.487 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
05-19 23:18:53.952 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
05-19 23:18:55.195 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
05-19 23:18:56.570 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
05-19 23:18:57.742 31204-31219/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
05-19 23:18:57.782 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 0
05-19 23:18:57.782 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I no longer see a beacon
05-19 23:18:57.790 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 0
05-19 23:18:57.790 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I no longer see a beacon
05-19 23:18:57.790 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 0
05-19 23:18:57.790 31204-32016/com.daniellazarov.tempapp I/MonitoringActivity: I no longer see a beacon
05-19 23:18:58.933 31204-31219/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
05-19 23:19:00.098 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
05-19 23:19:01.287 31204-31220/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
05-19 23:19:01.537 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 1
05-19 23:19:01.537 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I just saw a beacon for the first time!
05-19 23:19:01.538 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 1
05-19 23:19:01.538 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I just saw a beacon for the first time!
05-19 23:19:01.539 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I have just switched from seeing/not seeing beacons: 1
05-19 23:19:01.539 31204-32140/com.daniellazarov.tempapp I/MonitoringActivity: I just saw a beacon for the first time!
05-19 23:19:02.629 31204-31219/com.daniellazarov.tempapp D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5

我认为它与Raspberry Pi的传输速率有关,但我无法将其更改为有效的方式。

1 个答案:

答案 0 :(得分:0)

干得好!一切似乎都在起作用。 (除了为每条不同的日志消息看到三条日志行之外的奇怪例外 - 不确定为什么会发生这种情况。)

日志显示您在信标检测中有一个辍学导致退出事件发生在05-19 23:18:57.782,然后另一个进入事件发生在05-19 23:19:01.537。虽然这个时间段看起来很短(约4秒),但辍学率必须明显长于此时间。默认情况下,Android Beacon Library不会发送区域退出事件,直到它没有看到与区域定义匹配10秒的信标。这意味着有14秒的时间,您的Android设备没有看到来自Raspberry Pi的传输。

来自信标的某些传输通常不会被Android设备接收。在近距离范围内,可能正确地接收了80%的分组,其余分组由于无线电噪声,冲突,信道问题或其他低级蓝牙因素而丢失。如果你真的很不走运,你可能会连续错过几次传输。但是连续丢失超过两三次传输应该是非常罕见的。

这意味着两件事之一是错误的:

  • 你的Raspberry Pi不是经常发布广告(也许每5秒只播放一次,如果连续错过两个数据包会导致区域退出)。

    < / LI>
  • 您的Android设备丢失了大量数据包。这有时可能是由于已知干扰问题的设备(如Nexus 7,Nexus 4,Moto G和Moto X。

要弄清楚哪一个尝试以下内容:

  1. 关闭Android设备上的WiFi。这样可以解决问题吗?

  2. 提高Raspberry Pi BlueZ的传输速率。您可以在我的回答here.

  3. 中查看如何执行此操作