作者: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浅析的更多相关文章

  1. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  2. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  3. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  4. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  5. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  6. 从源码浅析MVC的MvcRouteHandler、MvcHandler和MvcHttpHandler

    熟悉WebForm开发的朋友一定都知道,Page类必须实现一个接口,就是IHttpHandler.HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

  7. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  9. word-break|overflow-wrap|word-wrap——CSS英文断句浅析

    ---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结 ...

随机推荐

  1. 洛谷 P1316 丢瓶盖

    P1316 丢瓶盖 题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以 ...

  2. 关于keil单片机编程中的data,idata,xdata,pdata,code数据类型

    从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...

  3. 你好,C++(16)用表达式表达我们的设计意图——4.1 用操作符对数据进行运算

    第4章    将语句编织成程序 学过C++中的各种数据类型, 就知道如何使用各种数据类型定义变量来描述现实世界中的各种事物了.现在,我们可以将一个工资统计程序大致写成下面这个样子: // 工资统计程序 ...

  4. Java中的List(转)

    List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型,所以Li ...

  5. trident教程

      (一)理论基础更多理论以后再补充,或者参考书籍1.trident是什么?Trident is a high-level abstraction for doing realtime computi ...

  6. jquery判断页面滚动条(scroll)是上滚还是下滚

    单纯判断滚动条方向 function scroll( fn ) { var beforeScrollTop = document.body.scrollTop, fn = fn || function ...

  7. html5 利用canvas实现简单的人物走动

    最近在学习html5,其中涉及到很关键的元素canvas-画布,在网上下载了一些游戏源代码,虽然能看懂,但是想单独地针对某个功能提取出来还是有难处的,于是乎自己又上网查找了一些例子,才将超级玛丽简单的 ...

  8. Js判断密码强度并显示提示信息

    用javascipt实现的Ajax判断密码强弱的功能,大多数有用户注册功能的网站,都会有这么一个功能,作为WEB程序员,应该会写这种小模块哦,不懂的就看下这个例子,觉得挺简单,当初帮助了不少人学会了密 ...

  9. 使用django+mysql+scrapy制作的一个小说网站

    小说网站用的程序都是千篇一律的,jieqi + guanguang,无聊时间学习python+django,也做了一个小说网站,下面说一说做这个网站一些过程, 制作这种采集站,最要紧的是要有一个好的采 ...

  10. [转] c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别

    如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...