蓝牙之二十三-beacon

来源:互联网 发布:js object 添加对象 编辑:程序博客网 时间:2024/06/05 14:16

本文基于Bluetooth SIG group资料。

Beacon 2014年推出,ABI预测到2019年预计有2019将有6千万台设备。

beacon用于个人定位,这些场景如百货商场,机场,办公室,博物馆等。这些场景中,beacon安装在固定的位置,手机上的API知道beacon的位置。


BLE协议栈包括一个称为GAP(Generic Access Profile),GAP的负责设备发现和连接。发现过程包括advertising和scanning。Advertising设备以等间隔广播小数据包,这些数据包包含了设备类型,这种类型有利于对设备进行区别选择。

Beacon设备广播,其它设备并不向他们连接。Beacon被称为“GAP广播”。

Beacon帧格式

广播包可以包括少量不同类型的数据域。数据长度是31字节,因此产品开发者需要选择广播包支持哪些类型的数据域。这些数据域中有一些由SIG定义的称为AD类型。所有的AD类型有相同的包括三个字段的结构。第一个字段是字节长度,第二个字段是类型,第三个字段是值。

Beacon编码格式目前有三种“帧格式”,它们是Apple的iBeacon,Radius Network的AltBeacon以及谷歌的Eddystone。

应用开发者需要知道如何解析这三种格式数据。

Frame Format:IBeacon

采用了标准的AD类型,即值为0xFF的Manufacturer 数据域,一个示例如下:

图2:iBeacon广播数据包

应用程序需要解析的有用信息在manufacturer数据域,如下是上面字段的划分。

Manufacturer数据字段以两字节的公司ID码开始。SIG将这些ID码发放给公司,并且能知道应用程序如何解析这些字段。上图的0x004C就是apple公司的ID。

iBeacon type指明了其类型是“proximity beacon”,即0x02.IBeacon长度字段描述了剩下的字段的长度。

UUID字段描述的是拥有该beacon的组织。

Major和Minor字段包含了位置信息,Major字段通常指示了建筑物,Minor指示的是建筑物里的位置信息。

Tx Power字段用于估计用户和beacon之间的距离。

详细见:

https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf

AltBeacon

AltBeacon和iBeacon较为相似,二者之间的比较如上图。

AltBeacon帧的Company ID是Radius Network公司的。其定义了Beacon Code。AltBeacon使用四个字节而不是Major和Minor两个部分。

http://altbeacon.org/

Eddystone

Google的Beacon实现方式是Eddystone。其广播包并不包括Manufacturer 数据域。其使用“Complete List of 16-bit Service UUID 。具体来说,值为0xFEAA的服务UUID在服务UUID集合里,服务数据在其后面。

See https://github.com/google/eddystone

Beacon 应用程序

开发者有两大类的API可以选择。一种是使用平台提供的原生BLE API去周期扫描和捕获感兴趣的从beacon发送来的广播包。另一类是使用beacon厂商或者帧格式定义者提供的beacon API。

Radius Network提供基于Android的AltBeacon API。

距离估计

通过信号强度和路径损耗估计计算和beacon的距离。信号强度称为RSSI(Received Signal Strength Indication)。

路径损耗计算方式见维基百科https://en.wikipedia.org/wiki/Free-space_path_loss

Android Beacon Application

该应用程序显示扫描到的beacon的如下信息:

  • manufacturerUUID(Beacon ID的前16个字节)
  • 其它数据(BEACON ID的后4个字节)
  • 当前的RSSI以及参考RSSI。

设置应用程序权限

    <uses-permission android:name="android.permission.BLUETOOTH" />    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />


测试用例的log如下:

示例代码下载地址:


0 0
原创粉丝点击