Beacon浅析
作者: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/
https://www.zhihu.com/question/37290469
Beacon浅析的更多相关文章
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- netty5 HTTP协议栈浅析与实践
一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- 从源码浅析MVC的MvcRouteHandler、MvcHandler和MvcHttpHandler
熟悉WebForm开发的朋友一定都知道,Page类必须实现一个接口,就是IHttpHandler.HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- word-break|overflow-wrap|word-wrap——CSS英文断句浅析
---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结 ...
随机推荐
- java加载配置文件
有时候一些变量可能会变,但直接写在程序代码中不好,因为有时候需要改的时候要改动源代码,这时候可以使用配置文件来管理.比如数据库中的端口和密码. 1. 把.properties配置文件放在src目录下. ...
- Yandex 2013Q(Atoms: There and Back Again-贪心+模拟+List)
Atoms: There and Back Again Time limit 2 seconds Memory limit 256Mb Input stdin Output stdout Legend ...
- startActivityForResult
Activity提供了startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Ac ...
- phpCMS V9 自定义添加 全局变量{SKIN_PATH}方法
前言:目前v9版本新增{js_path},{css_path},{img_path}三个全局变量,代替2008版本中{skin_path},样式图片脚本分开路径,确实达到了一定在后台管理方便的目的,但 ...
- WordPress社会化评论插件多说、有言、灯鹭、评论啦
社会化登录是指网站的用户通过使用QQ.人人网.腾讯微博.新浪微博等社会化媒体账号登录该网站,并让用户能够使用社会化媒体账号进行允许的操作,如评论.分享等.经过简单的代码整合,社会化媒体账号可以在第三方 ...
- php cgi 与 cli 区别
以CGI方式运行时,web server将用户请求以消息的方式转交给PHP独立进程,PHP与web服务之间无从属关系:CLI则是命令行接口,用于在操作系统命令行模式下执行PHP,比如可以直接在win的 ...
- 重定位表 IMAGE_BASE_RELOCATION
typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD TypeOffset[ ...
- 学习微信小程序之css17clearfix原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Spark 资源调度及任务调度
1. 资源分配 通过SparkSubmit进行提交应用后,首先会创建Client将应用程序(字节码文件.class)包装成Driver,并将其注册到Master.Master收到Client的注册请 ...
- Entity Framework with MySQL 学习笔记一(查询)
参考 : http://msdn.microsoft.com/en-us/data/jj574232.aspx EF 查询基本上有3中 默认是 Lazy Loading 特色是只有在需要数据的时候EF ...