【问题标题】:iBeacon: how to distinguish between iBeacons with the same minor and major valueiBeacon:如何区分具有相同次要值和主要值的 iBeacon
【发布时间】:2015-10-05 15:26:15
【问题描述】:

iBeacon specifications 说:

UUID、主要和次要值提供识别信息 用于 iBeacon。

主要次要值用于区分区域内的产品或元素。 Apple 文档非常清楚如何做到这一点,商店示例也非常好。

然而,所有这些只有在每个区域(或子区域)有一个元素类别时才能正常工作,但如果我们希望 APP 能够区分,它就不能很好地工作在同一区域内具有相同小调和大调的元素之间

是否有其他一些与 iBeacon 相关联的唯一标识符可以被监视/检测,以便我可以区分具有相同次要值和主要值的 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 的 App 的屏幕截图(没有其他可以配置的字段):

我想知道蓝牙信号中是否有某种唯一标识符来识别每个硬件。

【问题讨论】:

    标签: ios bluetooth-lowenergy hardware uuid ibeacon


    【解决方案1】:

    这实际上是一个常见问题,而且很难解决。虽然最佳实践通常说不同的信标不应共享相同的 ProximityUUID/major/minor,但有时也有合法的多个信标在同一个地方传输相同标识符的极端情况。(例如,在 Radius Networks,我们将默认标识符放入我们的信标中,因此如果您订购其中两个,它们最初将具有相同的标识符,直到您更改它们。)

    使用 CoreLocation API,具有相同标识符的两个不同信标将在 didRangeBeacons:InRegion: 回调中显示为两个信标。这是因为在内部,iOS 使用硬件地址来保持唯一性。不幸的是,CoreLocation 不会公开硬件 mac 地址或任何其他指示具有相同标识符的信标是哪个。

    在前台使用 CoreBluetooth API,您可以获得每个看到的 iBeacon 的回调。虽然您无法获取它们的硬件 MAC 地址,但 iOS 确实为它们中的每一个分配了一个唯一标识符(可能基于 MAC 地址的哈希),因此您可以将它们区分开来。不幸的是,iOS 不允许您使用 CoreBluetooth 读取广告内容,因此您无法读取 iBeacon 标识符。您真正能做的就是计算周围有多少不同的蓝牙 LE,它们可能是也可能不是 iBeacons。

    可以通过使用设备出现时间的时间戳和它们的 RSSI 读数来尝试和关联来自 CoreBluetooth 和 CoreLocation 的信息。但是,当周围有许多信标时,这些技巧并不是非常可靠并且容易失败。

    【讨论】:

    • 感谢您详尽的回复。我检查了 CoreBluetooth 并找到了 CBUUID 类参考,其中没有提到“iOS 使用硬件地址保持唯一性”。您能否分享一些文档/参考,以便我更好地了解我需要查看哪些属性和类?谢谢!
    • PS:从 CLBeacon 获取 CoreBluetooth 数据会很棒,这样关联就很容易了。这可能吗?
    • 不,很遗憾,您无法从 CLBeacon 获取 CBPeripheral 对象。使用我上面描述的不完美的技巧将两者关联起来是你能做的最好的事情。另外,请参阅我写的这篇博文:developer.radiusnetworks.com/2013/10/21/…
    【解决方案2】:

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

    【讨论】:

    • 谢谢。所以可能对于我认为的用例来说并不理想。您认为 iOS 应用程序在配置时可以覆盖主要和次要值吗?我认为用户可以将每个硬件与 APP 相关联,而 APP 本身会创造一个新的次要和主要价值.. 这有意义吗?因此 UUID 是在生产时创建的,并且始终相同,但主要和次要由 APP 定义,这样组合始终是唯一的。
    【解决方案3】:

    您希望“能够区分同一区域内具有相同次要和主要的元素”的声明没有意义,因为 UUID、主要和次要的组合是您可以获得的最具体的组合。

    如果您需要获得更大的地理覆盖范围,您可以拥有多个具有相同 UUID/主要/次要的信标,但这些信标将无法相互区分。

    如何将含义应用于主要和次要值完全取决于您 - 如果您需要区分两个位置,则只需应用不同的次要值。

    【讨论】:

    • 我看到一些制造商(如 Estimate)提供了一个 SDK 来覆盖 iBeacon 的主要和次要值。这样,当存在多个具有相同主/次组合的 iBeacon 时,APP 可以通过覆盖主要/次要值来唯一标识每个 iBeacon:community.estimote.com/hc/en-us/articles/…
    • 这只是他们提供的用于配置信标的 API。所有信标都有一些方法来更改它们的主要和次要(通常也是 UUID)——这就是你如何给它们你希望它们拥有的值。当您更改主要/次要时,您并没有区分具有相同主要/次要的信标,您只是将信标更改为具有不同的主要/次要。
    猜你喜欢
    • 1970-01-01
    • 2015-08-29
    • 2014-11-12
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多