Android 为什么我能';使用altBeacon库中的区域时无法获得完整的uuid?

Android 为什么我能';使用altBeacon库中的区域时无法获得完整的uuid?,android,bluetooth-lowenergy,altbeacon,Android,Bluetooth Lowenergy,Altbeacon,我正在使用我的应用程序扫描Ibeacon格式的设备。 起初,我使用StartMonitoringBeaconsis区域。我发现,我无法访问ibeacons的UUID。在没有删除StartMonitoringBeaConsincinRegion的情况下,我添加了StartTransingBeaConsincinRegion。所以我的问题解决了。然后我需要我的应用程序用指定的uuid过滤我的信标 我面临着新的问题。例如,我在一个地方有很多例如3或4个iBeacon。像这样, 00000000-000

我正在使用我的应用程序扫描Ibeacon格式的设备。 起初,我使用StartMonitoringBeaconsis区域。我发现,我无法访问ibeacons的UUID。在没有删除StartMonitoringBeaConsincinRegion的情况下,我添加了StartTransingBeaConsincinRegion。所以我的问题解决了。然后我需要我的应用程序用指定的uuid过滤我的信标

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

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
                }

            }
   })
}
beaconManager!!。removeAllRangeNotifiers()
beaconManager!!。addRangeNotifier(对象:RangeNotifier{
覆盖区域(p0:MutableCollection?,p1:Region?){
beaconManager!!.stoprangingbeaconregion(区域)
如果(p0!!.size>0){
对数d(
“测距”,
使用信标计数调用的DidRangeBeanConsincin区域:“+p0.size”
)
用于(p0中的信标){
Log.d(“测距”、“uuid:+beacon.id1”)
}
progress.visibility=View.GONE
homeRelative2.visibility=View.VISIBLE
}否则如果(p0.size==0){
progress.visibility=View.GONE
homeRelative2.visibility=View.VISIBLE
}
}
})
}
beacon.id1仅返回0x00000000。我做错了什么

此外,我还搜索了很多关于在区域变量中设置范围(regex)的信息。但什么都没有发现


我希望应用程序只过滤出我指定的uuid ibeacon设备,然后将它们发送到服务器。

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

最简单的解决方案是为要匹配的每个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, null)
val region3 = Region("region3", Identifier.parse("00000000-0000-0000-0000-000000000003"), null, null)
val region4 = 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。

谢谢David。你说得对。我认为这个库的工作方式适合于开发具有特定静态uuid的应用程序和只针对特定企业或公司的应用程序。我正在考虑为ibeacon开发一个UUID未知的应用程序。假设有一个应用程序可以大规模工作,并且应该检测具有特定uuid格式的所有信标。我们无法直接在应用程序中插入它们。因为他们太多了。我认为我们应该使用“Null”表示区域,并使用addRangeNotifier和StarTrangBeaconRegion。然后将它们全部发送到服务器。我考虑从服务器读取所有UUID列表,并将它们作为arrayList传递给region。构造函数接收ArrayList的对象。但我担心从长远来看,这个程序会变得繁重,而且不是标准的。为了获得最大的灵活性,只需使用一个通配符区域(三个空值),它可以检测任何信标,而不考虑标识符。然后,您可以在DidRangeBeanConsincin区域中添加自己的筛选,忽略您不关心的标识符模式。了解区域匹配只是一个工具,在引擎盖下做同样的事情。如果它对你来说不够灵活,那就使用你自己的过滤吧!