问题描述
我正在使用应扫描Ibeacon格式设备的应用程序。 起初,我使用了startMonitoringBeaconsInRegion。如我所知,我无法访问ibeacons的uuid。在不删除startMonitoringBeaconsInRegion的情况下,我添加了startRangingBeaconsInRegion。所以我的问题解决了。那么我需要我的应用程序只用指定的uuid过滤信标。
我遇到了新问题。例如,我在一个地方有很多3或4个信标。像这样
00000000-0000-0000-0000-000000000001
00000000-0000-0000-0000-000000000002
00000000-0000-0000-0000-000000000003
00000000-0000-0000-0000-000000000004
我写了beaconParser.setBeaconLayout:
beaconManager!!.beaconParsers.add(BeaconParser().setBeaconLayout("m:2-3=0215,i:4-7,i:4-19,i:20-21,i:22-23,p:24-24"))
和该区域:
val region = Region("myBeaons",Identifier.parse("0x00000000"),null,null)
我需要myapp过滤掉与4个第一个字节0x00000000匹配的所有信标。它正在工作,但是在接下来的一次我想获得每个信标的完整uuid的时候,它只返回我在区域中写的第4个字节。我需要每个信标的完整UUID才能发送到我的服务器。
beaconManager!!.removeAllRangeNotifiers()
beaconManager!!.addRangeNotifier(object : RangeNotifier {
override fun didRangeBeaconsInRegion(p0: MutableCollection<Beacon>?,p1: Region?) {
beaconManager!!.stopRangingBeaconsInRegion(region)
if (p0!!.size > 0) {
Log.d(
"Ranging","didRangeBeaconsInRegion called with beacon count: " + p0.size
)
for (beacon in p0) {
Log.d("Ranging","uuid: " + beacon.id1)
}
progress.visibility = View.GONE
homeRelative2.visibility = View.VISIBLE
} else if (p0.size == 0) {
progress.visibility = View.GONE
homeRelative2.visibility = View.VISIBLE
}
}
})
}
beacon.id1仅返回0x00000000。我该怎么办?
此外,我还搜索了很多有关在region变量中设置range(regex)的信息。但没有发现。
主要目标是我希望应用程序仅过滤我指定的远程uuid ibeacon设备,然后将它们发送到服务器。
解决方法
流行的Android库(受iOS Core Location标准启发)定义的信标区域不能那样工作-没有部分标识符匹配。整个标识符必须匹配。
最简单的解决方案是为每个要匹配的UUID创建一个区域,并像这样监视每个UUID:
val region1 = Region("region1",Identifier.parse("00000000-0000-0000-0000-000000000001"),null,null)
val region2 = Region("region2",Identifier.parse("00000000-0000-0000-0000-000000000002"),null)
val region3 = Region("region3",Identifier.parse("00000000-0000-0000-0000-000000000003"),null)
val region4 = Region("region4",Identifier.parse("00000000-0000-0000-0000-000000000004"),null)
beaconManager.startRangingBeaconsInRegion(region1);
beaconManager.startRangingBeaconsInRegion(region2);
beaconManager.startRangingBeaconsInRegion(region3);
beaconManager.startRangingBeaconsInRegion(region4);
第二个但更复杂的选项是重新定义信标布局表达式,以将id1分解为至少两个标识符,因此最终得到id1,id2,id3和id4。这样,您可以在全零前缀上进行匹配。但是,这种方法有点不标准,很难设置。如果您继续需要像这样的论坛提供帮助,则可能会引起麻烦,因为几乎没有其他人以这种方式进行编程。这种替代方法的另一个缺点是,它将阻止您将解决方案移植到不支持这种部分标识符前缀的iOS。