BLE框架

    最近一直在看关于低功耗蓝牙(BLE-bluetooth low energy)的书,在这里写下学习笔记,希望这个笔记也可以帮助到在学习BLE的同学吧。


    首先我先介绍一下BLE的由来。BLE指的是在蓝牙4.0规范下的LE(low energy)蓝牙,这个蓝牙可以使用更少的能耗实现传输少量数据,而其他蓝牙规范如下:蓝牙1.0为基本码率(Basic Rate,BR),物理层数据速率为1Mbps;蓝牙2.0为增强码率(Enhanced Data Rate,EDR),物理层数据速率增加到3Mbps;蓝牙3.0版本引入Alternative MAC PHY(AMP,交替射频技术),它利用了IEEE 802.11实现几百M的物理层数据速率。我们的蓝牙工作在ISM(Industrial Scientific Medical)频段,这是一个全世界都免费的频段。这是关于BLE的一些概述。


     接下来我先介绍一个BLE的整个框架,任何一个新知识的学习都离不开对这个新知识从宏观的角度入手,这样在后面的学习会起到事半功倍的作用。要不然一进来就死磕细节的东西,你会觉得越来越无趣,没有继续学下去的理由。

BLE框架_第1张图片


物理层:这一层的作用是把上层来的数据发送出去和接受数据。打个比方,这个物理层就相当于你从广州到北京的交通工具,它不管里面坐的是什么人,就负责把人送过去。这层涉及到一些无线电方面的知识,如调制方式、接收机和发射机的特性、抗干扰的能力、功率问题等,我们可以不用管。我们在物理层发送的数据,只要是符合这个发射频率的接收机都能接受到这些数据,就像你在大街上喊了一句普通话,只要懂普通话的人都懂你在说啥,而外国人就不懂了。所以在后面就会有对数据进行一些加密等操作。

链路层:这层定义了两个设备如何利用无线电传输信息。它包含了报文、广播、数据信道的详细定义、也规定了发现其他设备的流程、广播的数据、连接的建立、连接的管理以及数据的传输。在这层有一个链路层的状态机,这个状态机有五个状态:就绪态、广播态、扫描态、发起态、连接态。其状态图如下:

BLE框架_第2张图片

蓝牙上电之后默认在就绪态,直到接到主机的命令才会改变状态。接下来说一下报文,报文是有一定格式的一段数据,这段数据会保存一些数据,如:接收者和发送者。链路层还具有加密功能,前面已经说过物理层只是发数据,没有什么加密可言,所以在链路层就可以对数据进行加密。这层还有管理连接的功能,如:功能交换、版本交换、自适应调频等;低功耗优化,如:高比特率、短报文。

主机/控制器接口:这层就负责一个通道的功能,负责把数据从主机发到控制器和把数据从控制器发到主机。

逻辑链路控制和适配协议(L2CAP):Logical Link Control and Adaptation Protocol也称为逻辑链路控制和适配协议,是蓝牙系统中的核心协议,负责将基带的数据分组交换以便于高层应用的数据分组格式,并提供复用和服务质量交换的功能。它屏蔽了低层协议中的很多特性,把低层看成是一个黑盒子。

属性协议:属性(Attribute protocol,ATT),用于发现、读取和写入对端设备上的属性规范。属性代表着有标签可以寻址的数据,就像图书馆中每本书的标签一样。在属性协议中由三种数值组成:属性句柄、属性类型、属性值、属性权限(许可)。

在现实生活中数据有很多种类型,如:温度、湿度、长度等。这些不同的类型就是属性类型。属性句柄是用来区分同一种类型中不懂的数据,例如:你有两个温度值,一个室内温度、一个室外温度,但是都是温度属性,那么属性句柄就可以用来区分这两个温度值了。属性句柄的范围为0x001~0xFFFF。属性值用于表示设备公开的状态(属性值对属性协议本身没有作用,但是对于上层来说就有作用了),它有唯一的标识码,长度可以从0字节到512字节。对于某些属性值来说长度是固定的。属性权限可分为三类:使用许可、认证许可、授权许可。使用许可有分为:可读、可写、可读写;认证许可又可分为需要认证、不需要认证;授权许可分为:需要授权、不需要授权。

说起属性那么不能不说UUID(Universally Unique Identifier,通用唯一标识符),UUID有16位的和128位的,128位的UUID是蓝牙的基础(Bluetooth_Base_UUID),但是实际上为了减少数据的传输会使用16位的UUID。有这样一条公式:UUID(128b)= UUID(16b)*2^96+Bluetooth_Base_UUID,说白了就是就是使用16b的UUID替换0000****-0000-1000-8000-00805F9B34FB中“*”的内容。为了增加人工调试的可读性BLE的UUID可分为下列几组:

0x1800~0x26FF用作服务类统一唯一标识符码

0x2700~0x27FF用于标识计量单位

0x2800~0x28FF用于区分属性类型

0x2900~0x29FF用于特征描述

0x2A00~0x7FFF用于区分特征类型

安全服务规范:安全服务规范就是为了蓝牙之间传输数据时不被监听的一些双方规定的处理。

通用服务规范(Generic Attribute Profile,GATT):该协议是构建在ATT之上的,用于定义服务的流程、格式和所包含的特征。GATT和ATT对于BLE来说是强制配置的。如果把ATT比作一个公司的人数,那么GATT就是把这公司的人数按照不同的部门来进行划分。GATT根据不同的规范Profile、服务Service、特征Characteristic对不同的属性进行划分。规范、服务、属性的关系如下图所示:

BLE框架_第3张图片

从上图可以看出一个规范包含多个服务,一个服务包含多个特征。

属性协议定义了客户端与服务器如何发送符合标准的消息,而GATT规程则定义了如何发现与使用服务、特征与描述符的标准方法。这就好比你在市场上买了一条鱼,鱼档只是给你提供了一条鱼,可是你怎么做就是你的事了,当中的鱼档就是ATT,买鱼的人就是GATT。GATT规程可以分为三种基本的类型:发现规程、客户端发起规程、服务器发起规程。

通用访问规范(Generic Access Profile,GAP):它定义了两个设备之间如何能发现对方、与对方协作以及不断找到对方彼此连接。GAP是强制安装在蓝牙设备上的,它的存在有助于确保来自不同厂商生产的蓝牙设备相互操作。GAP还规定了单模、双模蓝牙所支持的蓝牙版本。GAP定义了4种BLE的角色:传播角色、观察角色、外围角色、中心角色。

传播角色是用来发送广播事件的设备,传播对象通常是一些处于观察者角色的设备,且只能使用非链接的广播事件去广播数据。

观察角色是为接收类应用程序进行优化,作为传播设备的互补设备接受广播事件中包含的数据,也是不支持链接操作。观察角色一定要有接收装置却不一定有发射装置。

中心角色是和所有外围角色建立链接的发起者,必须同时具有发射和接收装置,一旦链接成功,它将成为主设备。

外围角色使用可链接的广播事件去建立链路层的链接,必须同时具有发射和接收装置,一旦链接成功,它将成为从设备。

总结:无论是BLE还是其他的协议,它们都是设计用来完成某些任务的,为了完成这些任务,设计者都是采用分工合作的思路来进行设计,只要是协议用具有相同的功能(层级)的协议才会识别或者说理解到这个功能(层级)的功能。就好比现实生活中公司的层级那样,你不到那个者职位是不会干那个职位的工作的,这是分工合作给我们带来的效率提升,方便设计和实现。如发现此文有错,欢迎指出。

你可能感兴趣的:(Bluetooth,BLE)