作者: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. 【C++学习之路】派生类的构造函数(三)

    三.多层继承的派生类 1.多层继承的派生类只需在构造函数的初始化列表中写出直接基类的构造函数即可 class student { public: student(int n, string nam) ...

  2. 在linux下用tomcat部署java web项目的过程与注意事项(转)

    一.安装JDK到http://www.oracle.com/technetwork/java/javase/downloads/index.html下载Java SE 6 Update 27根据操作系 ...

  3. webApi项目中的问题

    1.场景:客户端调用API获取所有品牌列表,使用redis存储,第一次是获取全部,之后会增量获取,通过lasttime参数 出现的问题:redis连接超时,网络流量太大 原因:这个借口没做本地缓存,每 ...

  4. PowerShell: 如何解决File **.ps1 cannot be loaded because the execution of scripts is disabled on this sy

    PowerShell 默认不允许执行*.ps1脚本文件.运行ps1文件会得到下面的错误: File C:\Temp\Test.ps1 cannot be loaded because the exec ...

  5. Python文件处理之文件读取方式(二)

    Python的open文件的读取方式有以下几种方法: read([size]):读取文件,如果传了size参数,则读取size字节,否则读取全部 readline([size]):读取一行 readl ...

  6. Python文件处理之文件打开方式(一)

    Python中打开一个文件是同过open函数来打开的,并返回一个文件对象,以下为open函数的参数: open(name[, mode[buf]]) name:文件路径 mode:打开方式 buf:缓 ...

  7. monogdb笔记1

    :db.collection.remove()与db.collection.drop()的比较 插入100万条测试数据 ;i<;i++){ db.tester.insert({-i}) } 进行 ...

  8. MetaData元数据

    一.基础 定义:数据库.表.列相关信息的描述.    何时使用:想取得对数据库的信息时使用.    一]数据库元数据——通过DataBaseMetaData            DataBaseMe ...

  9. Altium designer PCB中过孔铺地连接的设置

    在Altium designer 6及更高版本如Altium Designer Winter 9.altium designer summer 9都会有这样的问题,在Altium DXP2004里面是 ...

  10. 用DIV+Css+Jquery 实现的旧版微信飞机大战。

    用jquery 实现的旧版微信飞机大战. 以前一直都是做后台和业务逻辑,前端很少去做, 现在个小游戏. 方向键控制方向,Ctrl 键 放炸弹(当然你的有炸弹,哈哈)! 主要都是用div+Css实现的, ...