一、BLE协议栈架构
BLE 协议栈(简称“协议”)由两部分组成: 控制器 和 主机。控制器与主机分离的形式来自标准的蓝牙 BR / EDR设备,这两个部分通常分别描述。任何 profiles(配置文件)和应用程序都是使用 GAP 与 GATT 层协议栈来编写程序。
1.1 控制器部分(Controller)
1.1.1 物理层(PHY)
物理层 负责数据和语音的发送和接收,特点是短距离、低功耗。是一种带宽自适应跳频 GFSK(高斯频移键控),工作在免费的工业频段2.4GHz。
1.1.2 链路层(LL)
链路层 控制设备的射频状态,有五个设备状态:待机、广告、扫描、初始化和连接。
广播为广播数据包,而扫描则是监听广播。
初始化状态发送连接请求包,如果广播者接受连接请求,则广播者和连接发起者将进入连接状态。当一个设备处于连接时,它将是以下两个角色中的一个:
主机(master)或从机(slave)。发起连接的设备变成了主机(master),接受连接请求的广播者设备变成了从机(slave)。且同一次连接中主机和从机角色不能切换。
1.1.3 主机控制接口(HCI)
主机控制接口层 向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口。该层可以通过一个可编程接口来实现,该可编程接口可以是 UART,SPI 或 USB。标准的 HCI 命令和事件在《Bluetooth Core Spec [14]》中描述。TI 有该应用的使用指南《 Vendor Specific Guide [1]》。
1.2 主机部分(Host)
1.2.1 链路逻辑控制和适配协议(L2CAP)
链路逻辑控制和适配协议层 提供数据封装服务,该层允许的端到端的数据通信。基于包的协议,将包传输到HCI,对于无主机系统,就将包传给链路管理器LM。支持多路复用,包的分割和重组,以及向上层协议提交服务质量信息。
1.2.2 安全管理(SM)
安全管理层 定义了配对和密钥分配的方法,并提供了为了安全地连接与交换数据的功能。
See section 5.4 for more information on Texas Instruments’ implementation of the SM layer.
1.2.3 属性协议(ATT)
属性协议层 负责数据检索,允许一个设备暴露一些数据块给其他设备,其他设备称之为“属性”。
在ATT环境中,展示属性的设备称之为服务器,与它配对的设备称之为客户端。链路层的主机从机和这里的服务器、客服端是两种概念,主设备既可以是服务器,也可以是客户端。从设备毅然。
1.2.4 通用访问协议(GAP)
通用访问协议层 是应用程配置文件的接口,用于 处理设备的发现和连接 相关的服务。GAP 还有处理安全连接等特征。GAP给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。
See section 5.1 for more information on Texas Instruments’implementation of the GAP layer.
1.2.4 通用属性协议(GATT)
通用属性协议层 使用 ATT 的服务框架和配置文件(profiles)的结构。BLE 中所有的数据通信都需要经过GATT。
它定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。GATT 就是使用了 ATT 协议,ATT 协议把 Service, Characteristic遗迹对应的数据保存在一个查找表中,次查找表使用 16 bit ID 作为每一项的索引。
See section 5.3 for more information on Texas Instruments’ implementation of the ATT and GATT layers.
二、GAP协议
GAP(Generic Access Profile)的缩写,中文是通用访问协议,它在用来控制设备连接和广播;
GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互;
例如:Beacon 设备就只是向外广播,不支持连接,小米手环就等设备就可以与中心设备连接。
2.1 GAP广播数据
在 GAP 中外围设备通过两种方式向外广播数据:
Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复);
每种数据最长可以包含 31 byte。这里广播数据是必需的,因为外设必需不停的向外广播,让中心设备知道它的存在;
扫描回复是可选的,中心设备可以向外设请求扫描回复,这里包含一些设备额外的信息,例如:设备的名字。
2.2 GAP广播的网络拓扑
大部分情况下外围设备通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换;
也有些情况是不需要连接的,只要外设广播自己的数据即可,用这种方式主要目的是让外围设备,把自己的信息发送给多个中心设备;
因为基于 GATT 连接的方式的,只能是一个外设连接一个中心设备,使用广播这种方式最典型的应用就是苹果的 iBeacon。
2.3 GAP通信中角色
GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral - 从机 - 服务端)和 中心设备(Central - 主机 - 客户端)。
外围设备 - 从机:
这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备,例如小米手环;
中心设备 - 主机:
中心设备相对比较强大,用来连接其他外围设备。例如手机等;
三、GATT协议
GATT(Generic Attributes Profile)的缩写,中文是通用属性协议,是已连接的低功耗蓝牙设备之间进行通信的协议。
一旦两个设备建立起了连接,GATT 就开始起作用了,这也意味着,你必需完成前面的GAP协议。
GATT使用了 ATT(Attribute Protocol)协议,ATT 协议把 Service,Characteristic 对应的数据保存在一个查找表中,查找表使用 16bit ID 作为每一项的索引。
GATT定义的多层数据结构简要概括起来就是 服务(Service) 可以包含多个 特征(Characteristic),每个特征包含 属性(Properties) 和 值(Value),还可以包含多个 描述(Descriptor)。
3.1 GATT结构
3.1.1 Profile(规范)
profile 可以理解为一种规范,一个标准的通信协议,它存在于蓝牙从机中(服务端);
蓝牙组织规定了一些标准的 profile,例如 HID OVER GATT,防丢器,心率计等;
每个 profile 中会包含多个 service,每个 service 代表从机的一种能力。
3.1.2 Service(服务)
service 可以理解为一个服务,在 BLE 从机中有多个服务,例如:电量信息服务、系统信息服务等;
每个 service 中又包含多个 characteristic 特征值;
每个具体的 characteristic 特征值才是 BLE 通信的主题,比如当前的电量是 80%,电量的 characteristic 特征值存在从机的 profile 里,这样主机就可以通过这个 characteristic 来读取 80% 这个数据。
3.1.3 Characteristic(特征)
characteristic 特征,BLE 主从机的通信均是通过 characteristic 来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
3.1.4 UUID(通用唯一识别码)
uuid 通用唯一识别码,我们刚才提到的 service 和 characteristic 都需要一个唯一的 uuid 来标识;
每个从机都会有一个 profile,不管是自定义的 simpleprofile,还是标准的防丢器 profile,他们都是由一些 service 组成,每个 service 又包含了多个 characteristic,主机和从机之间的通信,均是通过characteristic来实现。
3.2 GATT连接的网络拓扑
一个外围设备(从机)只能连接一个中心设备(主机),而一个中心设备(主机)可以连接多个外围设备(从机),一旦建立起了连接,通信就是双向的了,对比前面的 GAP 广播的网络拓扑,GAP 通信是单向的,如果你要让两个设备外围设备(从机)之间能够通信,就只能通过中心设备(主机)中转。
3.3 GATT通信中角色
从GATT的角度来看,处于连接状态时的两个设备,它们各自充当两种角色中的一种:
服务端(Server)
包含被GATT客户端读取或写入的特征数据的设备。
客户端(Client)
从GATT服务器中读取数据或向GATT服务器写入数据的设备。
外围设备(从机)作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义;
客户端和服务器的GATT角色独立于外围设备和中央设备的GAP角色。外围设备可以是GATT客户端或GATT服务器,中心可以是GATT客户端或GATT服务器;
一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据;
但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙。
四、TI BLE顶层软件体系架构
在顶层,CC2640 软件环境包括三个部分:实时操作系统(RTOS),应用和协议栈。
TI-RTOS 是一个实时的操作系统,具备多线程操作和任务同步等功能。
APP 应用和 BLE 协议栈作为单独的任务存在于 RTOS 中,BLE 协议栈具有最高优先级。间接访问(ICall)的消息框架被用于线程的同步和栈的通信:
协议栈:这包括低层的 BLE 协议栈链路层(LL)到 GAP 与 GAPP 的通信,如图1所示。大多数的 BLE 协议栈代码作为库提供。
应用:这包括相关的配置文件,应用程序,驱动程序,和 ICall 模块。
4.1 标准项目任务层次
所有的项目都会包含至少三个实时操作系统的任务 Task。例如 simplebleperipheral 项目,这些任务是以及他们的任务优先级为:
5: BLE 协议栈的任务
3:GapRole 任务(从机角色)
1:应用任务(simplebleperipheral)
4.2 ICall
ICall(Indirect Call Framework)的调用可以实现应用程序的与 BLE 协议栈的通信(例如,线程同步)。
ICall 模块的源代码被包含在 IDE 的 应用工程的 “ICall” 与 “ICallBLE” 文件夹内。 IAR 如下(CCS 类似):
4.2.1 ICall BLE 协议栈的服务
如图6的所示,ICall 可以监听协议栈(服务端)与应用程序(客户端)间的消息,注意不要把 ICall 的框架结构 与 BLE 中的 GATT 的 S/C 结构混淆,这样做的原因是为了方便应用软件与 RTOS 操作系统的升级,而不会互相耦合影响, 并且更方便把 CC254x 的代码已知道 CC2640 系列芯片上来。
本质上,当应用程序调用 BLE 协议栈的 API 函数时,由 ICall 发指令给 BLE 协议栈,反过来,协议栈发出来的消息也是 ICall 来传递的。
因为 ICall 模块是应用程序项目的一部分,应用程序可以直接访问 ICall 的函数。请注意,由于 BLE 协议栈具有最高优先级,因此应用程序任务将阻塞直到收到响应。应用程序阻塞期间,BLE 协议栈也可以异步地通过 ICall 通知应用程序某个消息(例如,事件更新)。
• 由 Leung 写于 2018 年 12 月 18 日
• 参考:cc2640蓝牙软件开发指南(阿莫翻译中文版-11.25)[7z5z]
通用属性配置文件(GATT) - BLE-Stack用户指南[fbrh]
GATT协议及蓝牙核心系统结构
【IoT】蓝牙 GAP 和 GATT 协议简析