2014年,许多组织开始着力开发蓝牙beacon试点项目,到2015年,已经有许多公司开始尝试利用部署好的蓝牙beacon探索新的服务模式。据市场研究机构(ABI Research)预测,预计到2019年,beacon将有6千万的市场占有量。
在大多数应用场景中,蓝牙beacon主要用于室内定位。不论在商场,机场,办公室,还是博物馆,都可以利用这些位置信息来提供服务。在这些案例中,通过将蓝牙beacon安装在特定位置,然后利用智能手机上的APP与之交互,就可以达到定位的效果。有趣的是,目前市场上还出现了一种新的beacon应用,它们并不需要安装在固定位置。未来我们还会看到更多涉及移动可穿戴beeacon的解决方案,例如Lighthouse,这是一种可穿戴beacon设备,可以用来定位有特殊需要的学生,并确保他们的安全。
蓝牙beacon使用了蓝牙BLE技术,是蓝牙BLE的诸多应用之一。
如上图所示,市面上已经出现了许多蓝牙beacon产品,它们具有不同的形状和大小,但都使用了蓝牙BLE技术,并实现同样的目的。
BLE协议栈采用了分层结构,其中有一层称为GAP(Generic Access Profile),该层负责设备间的广播,搜寻以及连接。搜寻过程涉及广播设备和扫描设备。广播设备以固定的间隔向外广播数据包,这些数据包中的信息可以帮助扫描设备确定该设备是否是其感兴趣的设备。
Beacon设备也进行广播,但是其它设备不需要与其进行连接。我们可以称其为广播者(BLE规范中广播者只广播不接受连接请求)。手机应用只需要利用广播包中的相关信息就可以实现定位的目的,因此不需要与beacon设备进行连接。下面我们将介绍beacon设备发出的广播包所包含的详细信息。
广播数据包最多仅可以包含31字节数据,所以设计者必须慎重选择需要包含的数据。蓝牙SIG组织在Core Specification Supplement (CSS)文件中将这31个字节数据分成多个AD Type结构,每个AD Type都有相同的结构,分别为长度字节,类型字节以及数据域。
Beacon设备可以在一个或多个标准广播数据包中编码数据,传递信息。但是编码原理可能有所差异,即帧格式不同。目前主流的三种帧格式分别为苹果公司的iBeacon,Radius Networks公司的AltBeacon以及谷歌公司的Eddystone。
因此为了与不同的beacon设备进行交互,应用开发者在开发beacon应用时需要了解对应设备的帧格式。
在上述三种帧格式中,最广为人知的当属苹果公司的iBeacon。iBeacon使用了称为厂商数据字段的标准AD Type结构。如下图所示,为iBeacon的广播包,按AD Type结构进行分割如下:
厂商数据字段的类型值为0xFF,应用只要对其包含的信息进行解析,就可获得需要的信息。
厂商数据字段的数据域前2字节为公司识别码。由蓝牙SIG组织分配给各公司,指示后续数据的解码方式。在上图中,0x004C为苹果公司的ID。0x02指明该设备为“proximity beacon”,该值在iBeacon设备中均为0x02。UUID指明拥有该beacon设备的机构。主次字段用来编码位置信息,通常主字段指明某个建筑,而次字段指明在这栋建筑中的特定位置。例如“伦敦中心商场,运动产品区”。发送功率字段帮助应用进行距离估算。有关iBeacon的详细内容可以参考Getting started with iBeacon
AltBeacon帧格式与iBeacon类似,如下图所示,更多详细内容可以访问AltBeacon:
谷歌公司的Eddystone与iBeacon及AltBeacon有所不同。它没用使用所谓的厂商数据字段,而是使用16位服务UUID字段以及服务数据字段。Eddystone还定义了如下图所示的子类型,具体内容可以参考eddystone:
这个问题的回答有多种方式,确切的说,这个问题应该说成“beacon在哪里?”我们可以用确切的GPS位置回答,也可以用描述性的语言如“伦敦中心商场运动产品区” 来回答。或者使用“在霸王龙旁边”之类的语言。
iBeacon和AltBeacon不直接向外发送位置信息。应用需要以某种方式将UUID/Major/Minor (iBeacon) 或UUID/Beacon Code (AltBeacon)映射到本地数据。为此我们可以使用多种方式,最简单的几种方式是:
估算用户与某个beacon设备距离的标准方法是计算该beacon设备的信号强度,然后进行路径损耗计算。信号强度称为RSSI,即接收信号强度标识。利用RSSI以及广播包中的Tx功率值进行路径损耗计算,并给出距离beacon设备一米的信号强度值。维基百科对此计算过程给出了更详细解释path loss calculations。
上述方法只能对距离进行粗略的估计,因为环境条件对距离计算有显著影响。如果需要更精确的距离计算可以使用射频指纹技术。这种方法将位置与射频信号特征相结合,从而获取更好的测量结果。国际计算机研究中心对此给出了相关介绍Radio Fingerprinting。
Beacon应用会进行周期性地扫描并进行过滤,从而获取感兴趣的设备信息。扫描过程功耗较高,因此开发者需要避免进行长时间的扫描。扫描过程主要涉及两个不同的参数配置。“扫描窗口”指明每次扫描持续时间,“扫描间隔”即为两次扫描间的时间。不同的平台对此提供的API不同,但都可以概括为这两种。
为了确定以上两个参数的大小,我们需要考虑beacon设备的广播间隔。如果beacon设备2000毫秒广播一次,那么每100毫秒进行一次持续500毫秒的扫描是没有意义的。因为有时beacon设备并没有发送广播,此时进行扫描当然就白白浪费了。需要注意的一点是,从蓝牙4.2开始,蓝牙广播就不再是确定的了,将会加入随机延时以避免持续冲撞,因此开发者需要采用合适的方法同步扫描与广播时序。
每次应用扫描的时候都会检测到0至多个beacon设备,应用可能会连续多次扫描到同一个设备,因为用户要走出某一特定beacon设备的范围,所花的时间要比广播间隔长得多,广播间隔往往只有几百毫秒。
当到达某一位置时,某个beacon设备会消失在搜索结果中,此时你的应用需要对此作出响应。应用可以认为用户已经走出该beacon设备的覆盖范围,但是这样可能会出错。因为扫描不到某个beacon设备可能有多个原因,几次扫描不到也并不意味着下次也扫描不到。也可能用户走到某个障碍物后面导致信号衰减较大,从而扫描不到设备。当用户走出障碍物附近时就可以再次接收到beacon设备信号。简言之,用户会一直在beacon设备附近,即使短时间内收不到广播数据包。
应用需要维护一个活动beacon列表,保存接近用户的beacon设备。应用可以选择在最近一次扫描不到设备时就将其移除活动列表或者在连续多次扫描不到设备时才将其移除,又或者在扫描不到设备一段时间后将其移除。上述方法可以获得更好的用户体验。
从beacon设备获取位置信息后该怎么做?这些都是与特定应用相关的。应用可以与用户进行信息交互,例如展示附近的博物馆展品信息。
如果你确实想要与用户交互,你就需要获取用户信息,但是不要经常这样做。因为信息很容易激怒用户,他们知道如何卸载应用程序!
应用可以在后台默默地工作,例如在机场追踪用户位置,帮助用户获取航班信息。我们需要尊重用户隐私,只在用户允许的范围内与之交互。
用户想要的东西因人而异。例如当一家人逛商场时,他们可能并不希望手机向其通知什么商场特殊优惠活动,如果是一个人逛商场那他可能就需要了。应用开发者需要考虑到这一点,允许用户关闭应用通知,获得最优的用户体验。
扫一眼穿戴式设备如智能手表比从口袋里拿出手机要方便的多。智能手表可以安装许多有趣的beacon应用。
开发者需要对其应用进行测试,这意味着在他们的测试环境中需要安装beacon设备。开发者需要使用与其应用相对应的beacon设备,但是在此之前,为了开发更加方便高效,我们最好使用可编程设备作为测试beacon。例如使用树莓派或者Intel Edison,它们可以达到与蓝牙芯片商或模块商所开发的专业蓝牙开发板同样的效果,编程和修改参数都非常方便。例如德州仪器开发的SensorTag可以很容易变成一台beacon设备,而且不需要做任何复杂编程操作,同时它也提供了丰富的功能用于专业的蓝牙开发。
未来beacon将部署在各种环境中,在物联网时代,开发者通过了解它们的工作原理以及学习如何利用它们,将会受益良多!
来源:蓝牙beacon入门教程