蓝牙4.0BLE协议浅析

    上一篇大致分析了下BLE的传输速率,今天给大家贴上BLE协议的详解。

    原文地址 http://blog.csdn.net/zzfenglin/article/details/51706290

    有兴趣的可以深入研究蓝牙协议:

     https://crifan.com/files/doc/docbook/bluetooth_intro/release/html/bluetooth_intro.html


蓝牙4.0BLE协议与协议栈的关系


协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发。

协议栈是协议的具体实现形式,通俗的理解为用代码实现的函数库,以便于开发人员调用。


蓝牙4.0BLE协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并提供一些应用层API,供用户调用。


注意:虽然协议是统一的,但是协议的具体实现形式是变化的,即不同厂商提供的协议栈是有区别的,例如:函数名称和参数列表可能有区别,选择协议栈以后,需要学习具体的例子,查看厂商提供的Demo演示程序、说明文档(通常,实现协议栈的厂商会提供一些API手册供用户查询)来学习各个函数的使用方式,进而快速地使用协议栈进行应用程序的开发工作。




如何使用蓝牙4.0BLE协议栈


既然蓝牙4.0BLE协议栈已经实现了蓝牙4.0BLE协议,那么用户就可以使用协议栈提供的API进行应用程序的开发,在开发过程中不必过多的关注蓝牙4.0BLE协议的具体实现细节,只需要关注一个核心的问题:应用程序数据从哪里来到哪里去。

 

至于调用协议栈中函数后,如何初始化应用进行数据发送等工作,蓝牙4.0BLE协议栈已经完成了所需要的初始化。

 

如果开发过程中确实需要或者是想要了解蓝牙4.0BLE协议,可以查看SIG提供的标准协议规范。




深入理解蓝牙4.0BLE协议栈


协议栈概述


我们以TI的CC254X系列BLE芯片为例来深入了解下蓝牙4.0BLE协议栈。TI的蓝牙4.0BLE协议栈包含两部分:主机和控制器。主机和控制器的分离要追溯到蓝牙BR/EDR设备时期,控制器和主机通常会分开实现。

 

协议栈的实现方式采用分层的思想,控制器部分包括:物理层、链路层、主机控制接口层;主机部分包括:逻辑链路控制及自适应协议层、安全管理层、属性协议层、通用访问配置文件层、通用属性配置文件层;上层可以调用下层提供的函数来实现需要的功能。


蓝牙技术联盟提供的标准规范下载链接:

https://www.bluetooth.com/zh-cn/specifications/adopted-specifications


蓝牙4.0标准规范CSDN下载链接:

点击打开下载页链接



协议栈基础


蓝牙4.0BLE协议栈的结构图如下:



详细介绍如下:

1.物理层(Physical Layer,简写 PHY):

是1Mbps自适应跳频的GFSK射频,工作于免许可证的2.4GHz ISM(工业、科学与医疗)频段。


2.链路层(Link Layer,简写 LL):

用于控制设备的射频状态,设备将处于五种状态之一:等待、广告、扫描、初始化、连接。广播设备不需要建立连接就可以发送数据,而扫描设备接收广播设备发送的数据;发起连接的设备通过发送连接请求来回应广播设备,如果广播设备接受连接请求,那么广播设备与发起连接的设备将会进入连接状态。发起连接的设备称为主机,接受连接请求的设备称为从机。


3.主机控制接口层(Host Controller Interface,简写 HCI):

为主机和控制器之间提供标准通信接口。这一层可以是软件或者硬件接口,如UART、SPI、USB等。


4.逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol,简写 L2CAP):

为上层提供数据封装服务,允许逻辑上的点对点数据通信。


5.安全管理层(Security Manager,简写 SM):

定义了配对和秘钥分配方式,并为协议栈其他层与另一个设备之间的安全连接和数据交换提供服务。


6.属性协议层(Attribute protocol,简写 ATT):

允许设备向另外一个设备展示一块特定的数据,称之为属性。在ATT环境中,展示属性的设备称为服务器,与之配对的设备称为客户端。链路层状态(主机和从机)与设备的ATT角色是相互独立的。例如:主机设备既可以是ATT服务器,也可以是ATT客户端;从机设备既可以是ATT服务器,也可以是ATT客户端。


7.通用属性配置文件层(Generic Attribute profile,简写 GATT):

定义了使用ATT的服务框架。GATT规定配置文件(profile)的结构。在BLE中,所有被profile或者服务用到的数据块称为特性,两个建立连接的设备之间的所有数据通信都是通过GATT子程序处理。GATT层用于已连接的蓝牙设备之间的数据通信,应用程序和profile直接使用GATT层。


当两个设备建立连接之后,它们就处于下面两种角色之一:

GATT服务器:为GATT客户端提供数据服务的设备。

GATT客户端:从GATT服务器读写应用数据的设备。


注意:GATT角色中的客户端和服务器的概念与链路层的主机和从机的概念完全独立,与GAP层角色中的外设和集中器的概念也是完全独立。 主机既可以是GATT客户端也可以是GATT服务器;从机既可以是GATT客户端也可以是GATT服务器。


一个GATT服务器中可包含一个或多个GATT服务,GATT服务是完成特定功能的一系列数据的集合。每一个应用工程大致包含下列三种服务:

(1)强制的GAP服务。这一服务包含了设备和访问信息。例如,设备、设备供应商和产品标示。它是协议栈的一部分,是BLE规范对每一个BLE设备的强制要求。这部分没有提供源代码,而是直接编译到协议栈库文件中了。

(2)强制的GATT服务。这一服务包含了GATT服务器的信息,是协议栈的一部分,同样也是BLE规范对每一个BLE设备的要求。这部分同样没有提供源代码而是直接编译到协议栈库文件中了。

(3)自定义服务。这部分服务包含应用数据的信息,与应用数据的传递密切相关,我们可以按照特定的格式编写自己的GATT服务。


特性(Characteristic)是服务用到的值,以及其内容和配置信息。GATT定义了在BLE连接中发现、读取和写入属性的子过程。GATT服务器上的特性值及其内容和配置信息(称为描述符)存储于属性表中。属性表是一个数据库,包含了成为属性的小块数据,除了值本身,每个属性都包含下列属性:  

(1)句柄:属性在表中的地址,每个属性有唯一的句柄。

(2)类型:表示数据代表的事物,通常是蓝牙技术联盟规定或用户自定义的UUID(Universally Unique Identifier)。

(3)权限:规定了GATT客户端设备对属性的访问权限,包括是否能访问和怎样访问。


GATT定义了若干在GATT服务器和客户端之间的通信的子过程:

(1)读特性值:客户端设备请求读取句柄处的特性值,服务器将此值回应给客户端(假定属性有读权限)。

(2)使用特性的UUID读:客户端请求读基于一个特定类型的所有特性值,服务器将所有与指定类型匹配的特性的句柄和值回应给客户端设备(假设属性有读权限)。  

(3)读多个特性值:客户端一次请求中读取几个句柄的特性值,服务器将这些特性值回应给客户端(假设属性有读权限),客户端需要知道如何解析这些不同的特性值数据。

(4)读特性描述符:客户端请求读特定句柄处的特性描述符,服务器将特性描述符的值回应给客户端设备(假设属性有读权限)。  

(5)使用UUID发现特性:客户端通过发送特性的类型UUID来请求发现这个特性的句柄。服务器将这个”特性”的声明回应给客户端设备,其中包括特性值的句柄以及特性的权限。

(6)写特性值:客户端设备请求向服务器特定的句柄处写入特性值,服务器将数据是否写入成功的信息反馈给客户端(假设特性有写权限,另外有一种特殊的写类型是不需要服务器来反馈是否写入成功的信息的,使用的时候根据具体应用来具体分析使用)。

(7)写特性描述符:客户端设备请求向服务器特定的句柄处写入特性描述符,服务器将特性描述符是否写入成功的信息反馈给客户端(假设特性描述有写权限)。  

(8)特性值通知:服务器将一个特性值通知给客户端,客户端设备不需要向服务器请求这个数据,客户端收到这个数据时,不需要属性协议层确认特性值是否被成功接收。

(9)特性值指示:服务器将一个特性值指示给客户端,客户端设备同样不需要向服务器请求这个数据,但是跟通知不一样的是,客户端收到这个数据之后,属性协议层必须确认特性值被成功接收。


通知与指示功能的流程如下:





何时发送通知或指示的条件可以在配置文件中设置,也可以通过应用来设置。要想使能通知和指示功能,需要分别在相应的句柄特性描述符写入0x00010x0002,如下表所示:



每个Profile初始化其相应的服务并内在的通过设备的GATT服务器来注册服务。GATT服务器将整个服务加到属性表中,并为每个属性分配唯一句柄。GATT属性表中有一些特殊的属性类型,其值由蓝牙技术联盟定义:

(1)GATT_PRIMARY_SERVICE_UUID:表示新服务的起始和提供的服务类型。

(2)GATT_CHARACTER_UUID:称为特性声明,紧随其后的是GATT特性值。

(3)GATT_CLIENT_CHAR_CFG_UUID:这一属性代表特性描述符,它与属性表中它前面最近的句柄处的特性值相关,它允许GATT客户端设备使能特性值通知或者指示。

(4)GATT_CHAR_USER_DESC_UUID:这一属性代表描述符,它与属性表中它前面最近的句柄处的特性值相关,包含一个ASCII字符串,是对相关特性的描述。


8.通用访问配置文件层(Generic Access Profile,简写 GAP):

负责处理设备访问模式和程序,包括设备发现、建立连接、终止连接、初始化安全特性和设备配置。


GAP层总是作为下面四种角色之一:

(1)广播者:不可连接的广播设备。

(2)观察者:扫描设备,但不发起建立连接。

(3)外部设备:可连接的广播设备,可以在单个链路层连接中作为从机。

(4)集中器:扫描广播设备并发起连接,可以在单个链路层连接中作为主机。


外部设备广播特定的数据使集中器知道它是一个可以连接的设备。广播内容包括设备地址以及一些额外的数据,如设备名等,当然也可以是自定义的数据,只要满足广播数据中广告的格式即可。集中器收到广播数据后向外部设备发送扫描请求,然后外部设备将特定的数据回应给集中器,称为扫描回应。集中器收到扫描回应后便知道这是一个可以建立连接的外部设备。这就是设备发现的全过程。此时集中器可以向外部设备发起建立连接的请求。连接请求包括一些链接参数。关于蓝牙4.0BLE的广播和连接,请参看下面几篇博文:


蓝牙BLE报文:

http://blog.csdn.net/zzfenglin/article/details/51165093


蓝牙BLE广播:

http://blog.csdn.net/zzfenglin/article/details/51165543

http://blog.csdn.net/zzfenglin/article/details/51166830


蓝牙BLE连接:

http://blog.csdn.net/zzfenglin/article/details/51303211

http://blog.csdn.net/zzfenglin/article/details/51304084



GAP层也处理BLE连接中安全特征的初始化。只有在已认证的连接中特定的数据才能被读写,一旦连接建立,两个设备进行配对,当配对完成后,形成加密链接的密钥。典型应用中外设请求集中器提供密钥来完成配对工作,密钥可以是一个固定的值,如000000,也可以随机生成一个数据提供给使用者,集中器设备发送正确的密钥后,两设备交换安全密钥并加密认证链接。


在许多情况下,同一对外设和集中器会不定时地连接和断开,BLE的安全机制中有一项特性允许两个设备之间建立长期的安全密钥信息,这种特性称为绑定,它允许两设备重新连接时快速地完成加密认证,而不需要每次连接时执行配对的完整过程。




蓝牙4.0BLE协议栈分层思想的优点


蓝牙4.0BLE协议栈采用分层思路的最大优点是:将服务、接口和协议这三个概念明确的区分开来。服务说明某一层为上一层提供了一些什么样的功能;接口说明上一层如何使用下一层的服务;而协议涉及到如何实现本层的服务。这样,各层之间就具有很强的独立性,当协议的一部分发送变化时,只需对与此相关的分层进行修改即可,其他分层不需要改变。



猜你喜欢

转载自blog.csdn.net/fang_chuan/article/details/79394659