提问者:小点点

为什么在altBeacon库中使用region时不能获得完整的uuid?


我的应用程序应该扫描Ibeacon格式设备。一开始我用的是startmonitoringbeaconsinregion。我发现,我无法访问iBeacons的UUID。在没有删除startMonitoringBeaconsInRegion的情况下,我添加了StartTrangingBeaconsInRegion。所以我的问题解决了。然后我需要我的应用程序用指定的UUID过滤我的信标。

我面临着新的问题。例如,我在一个地方有很多,例如3或4个iBeacon。像这样,

00000000-0000-0000-0000-0000-000000000001

00000000-0000-0000-0000-0000-000000000002

00000000-0000-0000-0000-0000-000000000003

00000000-0000-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时,它只返回我在region中写的第一个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设备,我把他们发送到服务器。


共1个答案

匿名用户

流行的Android库(受iOS核心位置标准启发)定义的信标区域不是这样工作的--没有部分标识符匹配。整个标识符必须匹配。

最简单的解决方案是为您想要匹配的每个UUID创建一个区域,并对它们进行如下监视:

val region1 = Region("region1", Identifier.parse("00000000-0000-0000-0000-000000000001"), null, null)
val region1 = Region("region2", Identifier.parse("00000000-0000-0000-0000-000000000002"), null, null)
val region1 = Region("region3", Identifier.parse("00000000-0000-0000-0000-000000000003"), null, null)
val region1 = Region("region4", Identifier.parse("00000000-0000-0000-0000-000000000004"), null, null)
beaconManager.startRangingBeaconsInRegion(region1);
beaconManager.startRangingBeaconsInRegion(region2);
beaconManager.startRangingBeaconsInRegion(region3);
beaconManager.startRangingBeaconsInRegion(region4);

第二个但更复杂的选项是重新定义信标布局表达式,将id1分解为至少两个标识符,从而最终得到id1,id2,id3和ID4。这样,您就可以在前缀全为零的情况下提交匹配。但是,这种方法有点不标准,而且很难设置。如果你继续需要这样的论坛的帮助,因为几乎没有其他人以这种方式编程,这将可能造成麻烦。这种替代方法还有一个缺点,即它会阻止您将解决方案移植到不支持这种部分标识符前缀的iOS。