我想将自定义数据(如用户ID)放入iBeacon数据包的advdata中。可能吗?如果是这样,我该如何获取数据。 CLBeaconRegion似乎没有advdata属性。
请看下面的iBeacon样本。 https://github.com/suwa-yuki/BeaconSample/blob/master/BeaconSender/BeaconSender/BSViewController.m
据我所见,我可以将自定义的measuredPower放入广告数据中。我可以将此属性用作自定义变量吗?我的意思是我想将UserId放入measuredPower属性。它会影响RSSI或其他事情吗?
谢谢,
答案 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进行范围调整,您将获得范围更新,告诉您Major
和Minor
值对于每个,您可以编码所需的这些字段中的任何数据。要访问这些,只需阅读如下所示的值:
-(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标识符(ProximityUUID
,Major
,Minor
)绑定到数据字段。此查找表可以嵌入到您的应用中,也可以使用Radius Networks的ProximityKit等网络服务自动执行此操作。
完全披露:我是Radius Networks的总工程师。