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

问题描述

我正在使用应扫描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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...