Study of iBeacon

因工作需要研究了一下iBeacon,简单总结一下。

技术概要

Apple 的iBeacon 技术规范里规定iBeacon 的信号广播频率为100ms 一次,即1秒10次。而Apple 提供的SDK里对iBeacon 监听回调函数由系统每隔一秒通知一次。这两个频率相关的内容是无法更改的。

Apple 提供的SDK 里,系统回调通知检测到的iBeacon 是封装到一个CLBeacon 类里的。这个类十分简单,用C语言可以描述为下面的结构体:

1
2
3
4
5
6
7
8
9
struct CLBeacon {
NSUUID *proximityUUID;
long int major;
long int minor;
CLProximity proximity;
double accuracy;
long int rssi;
}

其中,前三个字段用于描述该Beacon,着重看后三个:

  • proximity 是系统根据接收到的信号强度经过计算得出的一个距离上的“阶段”值,是一个enum,具体为Immediate(最近)、Near(近)、Far(远)、Unknown(检测到的信号极弱,可理解为非常远)

  • accuracy 是一个经统计计算后得出的精度值

  • rssi 是信号强度的平均值。

这三个值里,proximity 是用accuracy 得出的,而accuracy 又是根据rssi 算出来的。

文档里对proximity 的各个case 值没有明确指出数值范围,经实测,Immediate 大概要在0.5m 范围内,Near 则在0.5~2m,Far 为2~70m 左右。但这些数值有可能会发生变化,所以仅供参考。

accuracy

需要特别记录一下accuracy。这个值官方文档描述为:

Indicates the one sigma horizontal accuracy in meters. Use this property to differentiate between beacons with the same proximity value. Do not use it to identify a precise location for the beacon. Accuracy values may fluctuate due to RF interference.

个人理解:该值表示水平方向上取一个sigma 上的精度值,单位为米。仅使用该值区分同一proximity 值时的beacon 的远近,而不要用于精确定位。

首先需要明确一点,这个值不是一个实时的值,而是经过统计分析后算出的,所以被描述为“一个sigma 上的”,简单翻了翻误差统计,貌似这一个sigma 的范围内得出的值的可信度在95%,所以这个值可以作为一个参考值,但很明显不能作为精确值使用。
结合技术概要里信号频率的描述,可以推测是系统1秒内把收到的10次Beacon 信号做了统计分析,然后得出了accuracy 的值。

顺便提一下那个rssi,官网文档说:

This value is the average RSSI value of the samples received since the range of the beacon was last reported to your app.

所以这个rssi 也是10次取值后的平均值了。

关于accuracy 的计算,简单了解了一下,在Beacon 发出的信号里包含有一个叫Tx Power 的值,这个值表示在距离这个Beacon 1m 时测到的信号强度,是Beacon 厂商计算好的(有的Beacon 厂商提供修改该值的方法,从而达到控制Beacon 信号广播范围的目的)。于是系统会以这个值为基准,结合收到的信号强度(也就是rssi),算出一个距离值accuracy。
Tx Power 并非一个真正的信号强度值,硬件的信号强度这些默认是不改变的,除非厂商提供直接修改的办法。这个值仅仅用来给系统测量距离,所以把它改的越大(表示需要收到这么强的信号才能认为距离1m),则系统计算出的距离就变的越远(因为实际距离1m 时根本收不到这么强的信号)。