我想将自定义数据(如用户ID)放入iBeacon数据包的advdata中.可能吗?如果是这样,我该如何获取数据.CLBeaconRegion似乎没有advdata属性.
请看下面的iBeacon样本.https://github.com/suwa-yuki/BeaconSample/blob/master/BeaconSender/BeaconSender/BSViewController.m
据我所见,我可以将自定义measuredPower放入广告数据中.我可以将此属性用作自定义变量吗?我的意思是我想将UserId放入measuredPower属性.它会影响RSSI或其他东西吗?
谢谢,
您可以将任何字节放入您希望的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测距,你将获得测距更新,告诉你每个的值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
}
}
Run Code Online (Sandbox Code Playgroud)
以上所有内容仅限iOS.通过其他平台,您可以查看advdata的完整字节,因此您可以将所需的任何字节用作自定义变量.但是,如果您仍希望将它们识别为iBeacons,则应单独留下后两个字节(iBeacon广告指示符).
对于自定义变量,最好的做法是使用查找表来配合标准iBeacon显示标识符(ProximityUUID,Major,Minor),以数据字段.此查找表可以嵌入到您的应用程序中,也可以使用Radius Networks的ProximityKit等Web服务自动执行此操作.
完全披露:我是Radius Networks的总工程师.
| 归档时间: |
|
| 查看次数: |
2832 次 |
| 最近记录: |