作者:hongbosun
一、Beacon简介
Beacon是基于BLE技术实现的物理设备。BLE(全称Bluetooth Low Energy)是蓝牙4.0技术规范的一部分。它起源于Nokia的Wibree技术,但最终被整合进了蓝牙。这是一组与传统蓝牙不同的协议,被称之为BLE低功耗协议。BLE以超低功耗的特点被熟知,具有很大的应用价值。目前在较新的智能终端同时支持传统蓝牙和BLE模式的设备。由于BLE的低功耗特点,Beacon只靠一颗纽扣电池就能运行很长时间。(当然一般情况下这种电池是不可拆卸的,耗尽电量之后就需要更换新的Beacon了。)
二、Beacon工作原理
Beacon的工作原理是怎样的呢?
官方:Beacon设备使用BLE技术向周围发送自己“特有的ID”,接收到该ID的应用软件会根据接收到的ID和信号源产生互动。不同功率的BLE设备的信号范围在10m~100m不等,当手机进入信号范围时,能接收到信号源广播的ID(UUID+Major+Minor), App通过解析接收到的ID向用户推送通知或者其它资讯。
“特有的ID”是什么?
先介绍下 BLE发送的信号结构:
在BLE规范下,有两种类型的信号波,我们分别叫做广播报文和数据报文(网络中交换传输数据的单元,我们一般称之为报文)。
数据报文只能被连接中的两个主、从设备所理解,广播报文则可以广播给多个侦听设备或者只发送给某个特定的设备。广播报文是间断性发射信号的,这个时间间隔可以配置。
Beacon使用的就是广播报文。
图1 广播报文
图2 传输实际信息数据格式
在Beacon的广播报文里,是以iBeacon+UUID+Major+Minor+TX power格式传输实际信息数据,如上图。(UUID+Major+Minor) 组合作为唯一标识来区分beacon,也就是上文所说的“特有ID”的组成。举个例子,海底捞连锁部署beacon,那么所有门店将使用同一个UUID,各门店通过不同的Major值区分,店内的beacon如果位置不同则Minor 不同。
Beacon的广播报文里的TX power字段,用于确定你和beacon之间距离有多近。根据这个值不但可以获得粗略的信息(比如靠近/远离/不在范围内等),也可以获取精确到米的距离(当然你也可以转换为以步为单位的距离)。实现方法如下:
TX power(比如为0xC5=197,根据2的补码测得256-197=-59dBm)是距离设备1米测得的信号强度值(RSSI接收到的信号强弱指标)。假如接收到的信号强度减弱了,那么我们可能在远离。只要知道1米距离的RSSI,以及当前的RSSI(我们可以从接收到的信号中一块获取到这些信息),那么计算出当前的距离是可能的。IOS已经实现了个这个功能,对于其它平台需要自己手动编码计算。这也解释了使用Beacon定位功能的原理。
苹果家的i系列iBeacon正是Beacon的一种,iBeacon只能发送(UUID+Major+Minor)组合类型的广播报文。
Google推出的Eddystone也是Beacon的一种,不过Eddystone相较iBeacon的优势在于它是开源并且还支持发送其他组合类型的广播报文。有更丰富的利用价值。
由于较新智能终端一般都支持BLE模式,所以iPhone/Android/MacBook/其它笔记本/树莓派等设备都可以转换成Beacon模拟器。
三、BLE协议栈
协议栈是协议的具体实现形式,通俗的理解为用代码实现的函数库,以便于开发人员调用。
Beacon是基于BLE技术实现的物理设备,那么Beacon开发主要是学习BLE开发。而BLE开发的重点就是学习BLE协议栈。整个BLE协议栈以lib库的形式提供,BLE协议栈中的重点则是与具体蓝牙应用相关的GAP和GATT,这两层直接与应用程序打交道。
BLE协议栈简单了解,后面重点说一下GAP和GATT(以Android设备与BLE设备交互为例)。
图3 BLE协议栈
3.1、Physical Layer:任何一个通信系统,首先要确定的就是通信介质,BLE也不例外。在BLE协议中,“通信介质”的定义是由物理层Physical Layer(其它通信协议也类似)负责。
3.2、Link Layer:负责在这些物理介质上收发数据,与此同时,控制物理介质收发相关的参数。可在两个设备之间建立用于点对点通信的Logical Channel。
3.3、HCI:定义Host和Controller之间的通信协议.
3.4、L2CAP:一个介于应用程序(Profile、Application等)和Link Layer之间的协议。可以将Logical Channel换分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。
3.5、ATT
3.5.1、了解ATT前先了解下物联网
物联网中传输的数据和传统的互联网有什么区别呢?抛开其它不谈,物联网中最重要、最广泛的一类应用是:信息的采集。
这些信息往往都很简单,如温度、湿度、速度、位置信息、电量、水压、等等。
3.5.2、ATT协议将这些“信息”以“Attribute”的形式抽象出来,并提供一些方法,供远端设备读取、修改这些属性的值(Attribute value)。
3.6、GAP:GAP定义了蓝牙设备如何发现和建立与其他设备的安全或不安全的连接,其中具体包括:设备发现,创建连接,终止连接,安全结构的初始化和设备连接参数配置等。
图4 android中BLE设备的连接流程
在Android中对BLE设备操作实际上是对BluetoothGatt的操作,所以我们首先要想办法获取到BluetoothGatt。
如图经历以下步骤获取到BluetoothGatt。
扫描设备->建立连接
通过BluetoothManager的getAdapter()方法获得BluetoothAdapter,然后再通过BluetoothAdapter的startSacn( LeScanCallback)的方法开始扫描设备。我们还需要实现LeScanCallback的回调方法。
在其回调方法中会有这样一个函数,onLeScan(BluetoothDevice, rssi, byte[])。当中的bluetoothDevice就是我们扫描的设备;rssi是int类型,代表设备的信号强度,是负的,数值越大代表信号强度越大;byte[]这个byte数组就是设备广播的相关数据。
3.7、GATT是一个在蓝牙连接之上的发送和接收数据的通用规范。
图5 GATT(Generic Attribute Profile)
GATT是一个profile(更准确的说是profile framework)。
“Profile”是基于GATT所派生出的真正的Profile,位于GATT Profile hierarchy的最顶层,由一个或者多个和某一应用场景有关的Service组成。
一个Service包含一个或者多个Characteristic(特征),也可以通过Include的方式,包含其它Service。
Characteristic则是GATT profile中最基本的数据单位,由一个Properties、一个Value、一个或者多个Descriptor组成。
Characteristic Properties定义了characteristic的Value如何被使用,以及characteristic的Descriptor如何被访问。
Characteristic Value是特征的实际值,例如一个温度特征,其Characteristic Value就是温度值就。
Characteristic Descriptor则保存了一些和Characteristic Value相关的信息(比较抽象,后续文章会根据实例做进一步的理解)。
以上除“Profile”外的每一个定义,Service、Characteristic、Characteristic Properties、Characteristic Value、Characteristic Descriptor等等,都是作为一个Attribute存在的。
四、总结
Beacon作为一种新型的位置感知技术,前景巨大。我们期盼着新技术未来的发展。
最后,分享一个 个人觉得较好的文章:微信摇一摇和Beacon http://www.jianshu.com/p/df31b81280ad
参考链接:
https://developers.google.com/beacons/
https://github.com/Estimote/Android-SDK
https://github.com/AltBeacon/android-beacon-library
http://estimote.github.io/Android-SDK/JavaDocs/com/estimote/sdk/eddystone/Eddystone.html
http://www.seekcy.com/wd5.html
http://www.tuicool.com/articles/JJbMZf
http://www.voidcn.com/blog/cwcwj3069/article/p-5775010.html
http://blog.csdn.net/zzfenglin/article/details/51706290
http://www.cnblogs.com/tracy-e/p/3495227.html
http://www.prnasia.com/story/147109-1.shtml
http://www.jianshu.com/p/13e55d2517b5
http://bupojung.github.io/blog/2015/12/04/ibeaconyuan-li-he-ying-yong/