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

zon*_*ono 1 ios ibeacon

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

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

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

谢谢,

dav*_*ung 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
Run Code Online (Sandbox Code Playgroud)

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

如上所述,iBeacon广告还包括16字节ProximityUUID.但CoreLocation除非您指定匹配的ProximityUUID前端,否则iOS API不允许您查看任何iBeacon广告.所以它真的不是用作自定义变量.

你可以用什么作为自定义变量?用于自定义变量的两个值是Major字段和Minor字段.这些中的每一个都是两个字节,如果你告诉iOS CoreLocation对所有给定的iBeacon进行ProximityUUID测距,你将获得测距更新,告诉你每个的值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
    }        
}
Run Code Online (Sandbox Code Playgroud)

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

对于自定义变量,最好的做法是使用查找表来配合标准iBeacon显示标识符(ProximityUUID,Major,Minor),以数据字段.此查找表可以嵌入到您的应用程序中,也可以使用Radius Networks的ProximityKit等Web服务自动执行此操作.

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