iBeacon: 如何区分具有相同minor和major值的iBeacons

3

iBeacon规格说:

UUID、major和minor值提供了iBeacon的识别信息。

Majorminor值用于区分同一区域内的产品或元素。苹果文档对如何实现这一点非常清晰,商店示例也很好。

然而,所有这些只有在每个区域(或子区域)仅有一个元素类别时才能正常工作,但如果我们希望APP能够在同一区域内区分具有相同minor和major的元素,则无法正常工作。

是否存在其他与iBeacon关联的唯一标识符,可以监测/检测,以便我可以区分具有相同minor和major值的iBeacon?


编辑:额外信息

为了测试这个,我创建了两个具有相同UUID和主要值和次要值的iBeacon,然后开始监视我指定的UUID内的iBeacon。

我为区域中的iBeacons实现的回调代码如下:

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {

    NSLog(@"Did range %lu beacon in region %@", (unsigned long)[beacons count], region.identifier);

    for (int i=0; i<[beacons count]; i++) {
        CLBeacon *beacon = [beacons objectAtIndex:i]; 
        // <- breakpoint!
        NSString *_cnt = [[NSString alloc] initWithFormat:@"Number of beacons is : %lu and the current one %i is %f away from you %@",(unsigned long)[beacons count], i, beacon.accuracy, beacon.description];
        }
   }

当我在信标行添加断点时,我发现检测到的两个CLBeacon对象具有相同的信息:
CLBeacon (uuid:<__NSConcreteUUID 0x17003d8e0> 74278BDA-B644-4520-8F0C-720EAF059935, major:20, minor:0, proximity:1 +/- 0.17m, rssi:-42)
CLBeacon (uuid:<__NSConcreteUUID 0x17003e840> 74278BDA-B644-4520-8F0C-720EAF059935, major:20, minor:0, proximity:2 +/- 0.28m, rssi:-47)

目前我无法区分它们,除非我指定主要值和次要值。

这是我用来配置iBeacons的应用程序的屏幕截图(没有其他可配置的字段):

enter image description here

我想知道是否在蓝牙信号中有一种唯一标识符,可以识别每个硬件设备。
3个回答

6
这其实是一个常见的问题,而且很难解决。虽然最佳实践通常说不同的信标不应该共享相同的ProximityUUID/major/minor,但有时会存在合法的边缘情况,在同一位置上多个信标传输相同的标识符。(例如,在Radius Networks,我们将默认标识符放入我们的信标中,因此如果您订购两个信标,则它们最初将具有相同的标识符,直到您更改它们。)
使用CoreLocation API,具有相同标识符的两个不同信标会在“didRangeBeacons:InRegion”回调中显示为两个信标。这是因为在内部,iOS使用硬件地址来保持唯一性。不幸的是,CoreLocation没有公开硬件MAC地址或任何其他指示哪个具有相同标识符的信标是哪个的指示。
在前台使用CoreBluetooth API,您可以获取每个iBeacon看到的回调。虽然您无法获得它们的硬件MAC地址,但iOS会为每个iBeacon分配一个唯一标识符(可能基于MAC地址的哈希),因此您可以区分它们。不幸的是,iOS不允许您使用CoreBluetooth读取广告内容,因此您无法读取iBeacon标识符。您真正能做的就是计算周围可能是iBeacons或可能不是的不同蓝牙LE数量。
使用时间戳和RSSI读数的技巧可以尝试从CoreBluetooth和CoreLocation中协调信息,但这些技巧不是非常可靠,并且在周围存在许多信标时容易失败。

感谢您的详尽回复。我已经检查了CoreBluetooth并找到了CBUUID类引用,但没有提到“iOS使用硬件地址维护唯一性”。您能否分享一些文档/参考资料,以便我更好地了解需要查看哪些属性和类?谢谢! - mm24
PS:如果能从CLBeacon获取CoreBluetooth数据,那么相关性就很容易了。这可行吗? - mm24
不幸的是,您无法从 CLBeacon 获取 CBPeripheral 对象。使用我上面描述的不完美的技巧来关联这两个对象是您能做到的最好的方法。此外,可以参考我写的这篇博客文章:http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html - davidgyoung

3

UUID、major和minor的组合应该是唯一的。不应该有两个具有相同组合的信标,这就是信标识别符!


谢谢。所以,对于我考虑的用例来说,这可能不是理想的选择。您认为在配置时间内,iOS应用程序可以覆盖主要值和次要值吗?我想用户可以将每个硬件与应用程序关联起来,应用程序本身创建一个新的次要和主要值..这有意义吗?因此,UUID是在生产时创建的,并且始终保持相同,但是主要和次要值由应用程序定义,在这种方式下,组合始终是唯一的。 - mm24

1
您说想要“能够在同一区域内区分具有相同次要和主要元素的元素”的陈述没有意义,因为UUID、major和minor的组合是最具体的。
如果需要获得更大的地理覆盖范围,则可以使用具有相同UUID/major/minor的多个信标,但这些信标将无法彼此区分。
如何给major和minor值赋予含义完全取决于您 - 如果您需要区分两个位置,则只需应用不同的minor值。

我看到一些制造商(例如Estimate)提供了一个SDK来覆盖iBeacon的主要和次要值。通过覆盖主/次要值,APP可以在有多个具有相同主/次要组合的iBeacon时唯一地识别每个iBeacon:https://community.estimote.com/hc/en-us/articles/200868188-How-do-I-modify-UUID-major-and-minor-values- - mm24
这只是他们提供的用于配置信标的API。所有信标都有一些方法来更改它们的major和minor(通常也包括UUID)- 这就是您赋予它们所需值的方式。当您更改major/minor时,并不是在区分具有相同major/minor的信标,而只是将信标更改为具有不同的major/minor。 - Paulw11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接