作者: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. zepto源码研究 - fx_methods.js

    简要:依赖fx.js,主要是针对show,hide,fadeIn,fadeOut的封装. 源码如下: // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zept ...

  2. (三)Knockout - ViewModel 的使用2 - select、list 应用

    select下拉菜单 <select>常用的data-bind参数: •options : 指向数组或ko.observableArray(),KO会将数组元素转换为下拉选项.如果是ko. ...

  3. 托盘图标、气泡以及任务栏崩溃后的自动添加——Shell_NotifyIcon

    托盘图标使用函数 Shell_NotifyIcon 创建.修改和删除,参数主要使用 NOTIFYICONDATA 结构. 任务栏启动时会给所有顶层窗口发送 TaskbarCreated 消息,由于不同 ...

  4. 基于jQuery编写的页面跳转简单的小插件

    其实这个很简单,就是一个脚本函数和两个参数(url,jupetime), 开始实现步骤: 1.像页面引用一个jquery工具包 2.在javascript脚本编写自定义方法: 方法声明: $.exte ...

  5. 学习笔记之AJAX无刷新分页

    利用AJAX实现无刷新分页技术原理: 其主要是利用AJAX的异步处理机制,实现数据的异步传递,它隐藏了客户端向服务端请求数据的状态,在客户端表现为无刷新的显示状态. 实现分页的步骤: 1.客服端点击页 ...

  6. eclips常用快捷键

    本文取自:Eclipse中常用快捷键 - yizhang88的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/yizhang88/article/details/2 ...

  7. jdk8永久代从方法区移除的验证

    /*** 测试使用jdk8中是否仍然可以使用永久代* jvm options * -Xms20m -Xmx20m -Xmn10m -XX:PermSize=10m -XX:MaxPermSize=10 ...

  8. Android之GPS应用开发

    LocationManager--------------->Context.LOCATION_SERVICE LocationProvider--------------->Locati ...

  9. LeetCode_ Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. / ...

  10. POJ 3723 Conscription

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6325   Accepted: 2184 Desc ...