协议定义的是一系列的通信标准, 通信双方需要共同按照这一标准进行正常的数据收发; 协议栈是协议的具体实现形式, 就是用代码实现的函数库, 以便于开发人员调用。
BLE 协议栈将各个层定义的协议都集合在一起, 以函数库的形式实现, 并给用户提供一些应用层 API, 供用户调用。
协议栈的每个例程都不是单独存在的, 蓝牙是为了能够通信, 想要通信就必须遵守一定的规则, Profile 就可以理解为相互约定的规则, 因为每个协议栈demo 都 会 有 一 个 Profile 与 之 对应, 例如SimpleBLExxx 对应的就是simpleGATTprofile, 大多数 profile 都是蓝牙组织 SIG 规定好的, 但是, 如果我们的项目不涉及到跟第三方的设备进行互联, 那么我 们 完 全 可 以 自 定 义 profile , 例 如 , TI 的 SimpleBLEPeripheral 从 机 和SimpleBLECentral主机工程, 就是自定义的profile , 0xfff1~0xfff5。
一、BLE 协议栈的构成
协议栈的实现方式采用分层的思想, 控制器部分包括: 物理层、 链路层, 控制接口层,主机部分包括: 裸机链路控制及自适应协议层、 安全管理层、 属性协议层、 通用访问配置文件层(GAP), 通用属性配置文件层(GATT)。 BLE 协议的构成如下图所示:
1.1、PHY层
物理层(PHY) RF 规格特性:
运行在 2.4GHz ISM band (此频段主要是开放给工业、 科学、 医学三个主要机构使用, 属于Free License, 无需授权许可, 只需要遵守一定的发射功率(一般低于1W), 并且不要对其它频段造成干扰即可)
GFSK 调制方式(高斯频移键控)
40 频道 2MHz 的通道间隙
3 个固定的广播通道
37 个自适应自动调频数据通道
1.2、LL 层
RF 控制层, 控制芯片工作在 standby(准备)、 advertising(广播)、 scanning(监听/扫描), initiating(发起连接)、 connected(已连接) 这五个状态中的一种。 五种状态的切换描述为: advertising(广播) 不需要连接就可以发送数据(告诉所有人, 我来了), scanning(监听/扫描) 来自广播的数据, initiator(发起人) 将携带 connection request(连接请求) 来响应广播者, 如果 advertiser(广播者) 同意该请求, 那么广播这和发起者都会进入已连接状态, 发起连接的设备变为 master(主机), 接收连接请求的设备变为 slave(从机)。
1.3、HCI 层
通信层, 向 host 和 controller 提供一个标准化的接口。 该层可以由软件 api 实现或者使用硬件接口 uart、 spi、 usb 来控制。
1.4、L2CAP 层
相当于快递, 将数据打包, 可以让客户点对点的通信。
1.5、SM 层
安全服务层, 提供配对和密钥的分发, 实现安全连接和数据交换。
1.6、ATT 层
ATT 环境中, 允许设备向另外一个设备展示一块特定的数据, 称之为“属性”, 展示“属性” 的设备称为服务器, 与之配对的设备称为客户端。 链路层状态(主机和从机) 与设备的 ATT 角色是相互独立的, 也就是说, 主机设备可以是 ATT 服务器, 也可以是 ATT客户端。 从机也一样。
1.7、GATT 层
从名字就能看出, GATT 是在 ATT 上面的一层结构, 定义了使用 ATT 的服务框架,GATT 规定了配置文件(鼎鼎有名的 profile) 的结构, 在 BLE 中, 所有被 profile 或者服务用到的数据块都称为“特性, characteristic” 两个建立连接的设备之间的所有数据通信都是通过 GATT 子程序处理, 应用程序和 profile 直接使用 GATT 层, 在后面具体的代码中, 我们会经常见到 GATT, 数据交互也是再GATT层。
以上各层, 全部封装在 lib 库中, 对外提供接口函数。 函数库的OSAL、 HAL、 Profile、APPS 等均是源码的形式提供。