使用AltBeacon解析Estimote Nearable
我正在尝试使用Altbeacon解析Estimote Nearable数据包格式: 我有IBeacon的参考资料:使用AltBeacon解析Estimote Nearable,altbeacon,estimote,beacon,Altbeacon,Estimote,Beacon,我正在尝试使用Altbeacon解析Estimote Nearable数据包格式: 我有IBeacon的参考资料: // Apple iBeacon beaconManager.getBeaconParsers().add(new BeaconParser() .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 下面是我用hci转储工具捕获的十六进制示例: 04 3E 2A 02 01 03 0
// Apple iBeacon
beaconManager.getBeaconParsers().add(new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
下面是我用hci转储工具捕获的十六进制示例:
04 3E 2A 02 01 03 01 47 CC 3B D4 23 DF 1E 02 01 04 1A FF 4C
00 02 15 D0 D3 FA 86 CA 76 45 EC 9B D9 6A F4 49 78 49 E0 E7
74 4D 13 BF BD
您可以清楚地看到与该信标格式匹配的02 15字节
现在,我正在尝试匹配Estimote Nearable:
数据包格式:
04 3E 2B 02 01 03 01 47 50 19 A9 6E DF 1F 02 01 04 03 03 0F
18 17 FF 5D 01 01 49 78 49 E0 E7 74 4D 13 04 01 90 61 AF FF
01 41 46 00 57 B9
但我无法使用此代码获取任何内容:
beaconManager.getBeaconParsers().add(new BeaconParser()
.setBeaconLayout("s:4-5=5d01,m:6-6=01,i:7-15,p:25-25,d:15-26"));
我使用此资源了解数据包格式:
有人能指出我的Beacon Lahyout有什么问题吗?尝试以下解析器表达式:
new BeaconParser()
.setBeaconLayout("m0-2=5d0101,i=3-11,d=12,d=13,d=14-15,d=16,d=17,d=18,d=19,d=20,p=21")
new BeaconParser()
.setBeaconLayout("m1-2=0101,i=3-11,d=12-12,d=13-13,d=14-15,d=16-16,d=17-17,d=18-18,d=19-19,d=20-20,p=21-21")
编辑:根据下面的评论,我修改了这里的表达:
new BeaconParser()
.setBeaconLayout("m2-6=02155d0101,i=7-14,d=16-16,d=17-17,d=18-19,d=20-20,d=21-21,d=22-22,d=23-23,d=24-24,p=25-25")
编辑2:基于注释中报告的此字节序列:
020104030F1817FF5D01018FC81EBFBEBB57D30482855135FF00BD580157
尝试以下表达式:
new BeaconParser()
.setBeaconLayout("m0-2=5d0101,i=3-11,d=12,d=13,d=14-15,d=16,d=17,d=18,d=19,d=20,p=21")
new BeaconParser()
.setBeaconLayout("m1-2=0101,i=3-11,d=12-12,d=13-13,d=14-15,d=16-16,d=17-17,d=18-18,d=19-19,d=20-20,p=21-21")
这可能有效,也可能无效。以上假设问题()中提供的链接中定义的数据包格式是正确的,我已将其转换为偏移表:
0-1: 5d01 (Bluetooth SIG manufacturer id for Estimote)
2: 01 (nearable protocol version)
3-11: identifier
12: firmware version
15: temperature
14-15: battery and moving indicator
16: acceleration x
17: acceleration y
18: acceleration z
19: current motion state duration
20: previous motion state duration
21: power and firmware state
上面定义的布局将返回一个带有单个标识符字段和8个数据字段的信标实例,这些字段映射到:
Data Field # Meaning
1 firmware version
2 temperature
3 battery and moving indicator
4 acceleration x
5 acceleration y
6 acceleration z
7 current motion state duration
8 previous motion state duration
您必须根据从数据包中解析出来的原始值正确解码数据字段的含义
上面的解析器可能无法正确估计距离,因为功率校准字段(p=21)似乎不是标准格式(如AltBeacon、iBeacon和Eddystone使用的格式),库将在开箱即用。我做的是反编译估计的Android SDK并查看普通源代码(他们没有费心去最小化或混淆)来查看Nearable是如何解析的。不幸的是,广播的数据非常不一致(几个字节的偏移量用于不同的字段…)而且解析的正确性有点糟糕。抱歉,我的意思是,由于字段重叠,解析永远不会正确。但是祝你好运!你好,谢谢你的回答。你给出的表达式抛出了一个无法解析的异常。这是我的工作异常:((“m:0-2=5d0101,I:3-11,d:12,d=13:20,p:21-21”);但如果我查看转储,我可以看到IBeacon的m:2-3=0215,而估计值5D01的延迟更大:m:4-5。我是否遗漏了什么?我不关心数据的正确解码,我可以稍后再做,但我根本无法匹配数据包……请参阅对我答案的编辑中的修订布局建议。表达式仍然与任何信标都不匹配s、 …我不确定这部分:"m2-6=02155d0101。为什么要匹配iBeacon的开头?不应该是m:4-6=5d0101吗?另外,对于m:4-6=5d0101,altbeacon不匹配任何内容…抱歉,我没有任何一个信标,所以我在这里有点盲目。如果你能为我做以下操作,我可能会提供更多帮助。在你的代码中添加一行设置
beaconManager.setDebug(true);
然后在扫描信标时捕获一个LogCat输出。查找如下所示的行:D/BeaconParser(11355):这不是匹配的信标公告。(应该是ac。我看到的字节是:0201061AFF4C00021507701D2FA844B429C161417DABC159D00010001C20000000000000000000000000000000
,然后在你的问题中粘贴其中一个。所以我收到这样的消息:04-24 12:30:41.467 22170-22449/org.altbeacon.beaconreference D/BeaconParser:这不是matching Beacon广告。在偏移量11处期待5d 01,在偏移量13处期待01。我看到的字节是:020104030F1817FF5D01018FC81EBFBEBB57D30482855135FF00BD5801570000000000000000000000000000000000000000'你能确认中的解析是准确的吗?特别是功率解析,我似乎不理解,并且在我的实现中,我得到的是8 dBm,而不是4 dBm……在我看来,它与Estimote SDK中的Java代码几乎完全对应。如果您认为您的实现中存在错误,但Estimote应用程序显示了正确的信息,我的建议是非常仔细地检查您是如何解析位的。Java以其位方式而臭名昭著操作处理(例如算术移位与二进制移位、字节与整数之间的有符号转换等)。