iBeacon:我如何将自定义数据放入advdata?

时间:2014-03-22 14:33:25

标签: ios ibeacon

我想将自定义数据(如用户ID)放入iBeacon数据包的advdata中。可能吗?如果是这样,我该如何获取数据。 CLBeaconRegion似乎没有advdata属性。

请看下面的iBeacon样本。 https://github.com/suwa-yuki/BeaconSample/blob/master/BeaconSender/BeaconSender/BSViewController.m

据我所见,我可以将自定义的measuredPower放入广告数据中。我可以将此属性用作自定义变量吗?我的意思是我想将UserId放入measuredPower属性。它会影响RSSI或其他事情吗?

谢谢,

1 个答案:

答案 0 :(得分:7)

您可以将任何字节放入您希望的iBeacon广告中,但iOS严格限制您可以读取的这些字节中的哪一个。如果您需要使用iOS来读取这些数据,那么您只能使用可以更改的四个字节的蓝牙数据,这些数据将被iOS读取。如果你只关心用其他操作系统(OSX Mavericks,Android,Linux)读取字节,那么这不是问题。

为了解释iOS的限制,有助于查看典型iBeacon广告的advdata,如下所示:

4C 00 # Company identifier code (0x004C == Apple)
02 15 # iBeacon advertisement indicator
e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # ProximityUUID
00 00 # Major 
00 00 # Minor 
c5 # The 2's complement of the MeasuredPower

iOS不允许您使用其CoreBluetooth API访问上面显示的advdata的原始字节。 (有关详细信息,请参阅here。)如果使用CoreLocation的iBeacon测距函数,则可以读取ProximityUUID(16字节),Major(2字节)和advdata中的Minor(2个字节)。您提到的代码示例中设置的MeasuredPower在iOS中可以直接读取 NOT 。它仅用作用于估计距RSSI的距离的算法的输入。 (有关详细信息,请参阅here。)更改广告中的MeasuredPower会影响此距离估算值,但您无法可靠地确定实际的MeasuredPower值。因此,您不能将其用作自定义变量。

如上所述,iBeacon广告还包括16字节ProximityUUID。但是,除非您事先指定匹配的CoreLocation,否则iOS ProximityUUID API不允许您查看任何iBeacon广告。所以它实际上并没有用作自定义变量。

您可以将哪些用作自定义变量?您可以用于自定义变量的两个值是Major字段和Minor字段。这些中的每一个都是两个字节,如果您告诉iOS CoreLocation对所有具有给定ProximityUUID的iBeacon进行范围调整,您将获得范围更新,告诉您MajorMinor值对于每个,您可以编码所需的这些字段中的任何数据。要访问这些,只需阅读如下所示的值:

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    for (CLBeacon *iBeacon in iBeacons) {
        // write code here to do something with iBeacon.major and iBeacon.minor
        // which each will have values from 0-65535
    }        
}

以上所有内容仅限iOS。通过其他平台,您可以查看advdata的完整字节,因此您可以将所需的任何字节用作自定义变量。但是,如果您仍然希望将它们识别为iBeacons,则应单独留下后两个字节(iBeacon广告指示符)。

对于自定义变量,最佳做法是使用查找表将标准iBeacon标识符(ProximityUUIDMajorMinor)绑定到数据字段。此查找表可以嵌入到您的应用中,也可以使用Radius Networks的ProximityKit等网络服务自动执行此操作。

完全披露:我是Radius Networks的总工程师。