跳转至

BLE Protocol

Bluetooth Low Energy

低功耗蓝牙BLE是一种2.4G无线技术,始于4.0版本,旨在实现低功耗和短距离的通信。

实战:选择一款芯片对照SDK Demo开发。重点关注 GATT/GAP/ATT。重点理解 广播 - 连接 - 服务/特征 - UUID

深化:研究开源栈(Zephyr/NimBLE)源码,理解协议栈实现细节

核心开发逻辑:初始化蓝牙协议栈 - 配置广播(GAP) - 服务、特征、数据收发回调函数(GATT) - 低功耗管理


所谓开发蓝牙应用程序,其实就是开发 service 和 characteristic。通过API,添加自己需要的characteristic 和 service,一个蓝牙设备就诞生了。

Function of Layer

GATT(通用属性配置文件)

BLE5协议定义了一些标准的配置文件(Profile),配置文件描述了在某个应用场景中低功耗蓝牙设备应具有什么功能、执行什么工作的每个配置文件中都会包含一个或多个服务(Service)。可以将配置文件理解为一种规范或一种标准的通信协议,只要遵守该规范,不同厂家的低功耗蓝牙设备就可以相互连接与通信。

通俗地说,配置文件是指从机应具有的数据或者特性,在从机中添加配置文件后,从机可作为GATT的服务器,主机可作为GATT的客户端。配置文件包含一个或者多个服务,每个服务又都包含一个或者多个特性(Characteristic).主机可以发现和获取从机的服务及特性,然后与从机通信。例如,主机可主动向从机写数据或向从机读数据,从机也可主动向主机通知数据。特性(Characteristic)是主从通信的最小单元。

通用属性概要(GATT)基于属性表中保存的属性定义了更高级的数据类型。这些数据类型称为 “服务”、“特征”、“描述符”。它还定义了通过属性协议(ATT)使用这些数据类型所涉及的一系列程序。应用程序通常会使用与这些程序相对应的平台 API 来进行操作。

  • Services(服务):提供特定上下文的分组机制,用于使用其包含的特征,并具有明确的类型。通常,服务对应于设备的一项主要功能或能力。标准服务是由BLE协议定义的服务,BLE5协议规定了这些服务的UUID和数据交互格式,规范了有相同需求的产品,提高了不同设备之间的互通性。由于协议的制定相对于应用有一定的滞后性,即标准服务不能完全满足应用需求,因此很多低功耗蓝牙的应用都是基于私有服务来实现的。

  • Characteristics(特征):BLE5中,数据是通过特征来封装的,而一个或多个特征组成了一个服务的服务可以看成一个独立的单元或者一个基本的低功耗蓝牙应用。主机和从机之间的通信是通过特征来实现的,可以将特征看成一个标签,主机或者从机可以通过这个标签来获取或者写入想要的内容。例如,当前的电池电量是80%,会通过电池电量的特征保存在从机的配置文件中,这样主机就可以通过该特征来读取电池电量的数据。

  • Descriptors(描述符):属于某些特征,可以包含元数据,例如特征的文本描述,或提供控制特征的方式。每个特征可附加零个或多个描述符。例如,GATT 定义了一个名为“特征值通知”(characteristic value notification)的操作,即设备以异步方式向连接的对端发送包含特征值的 ATT PDU,且无需对方设备作出响应。如果某个特征支持通知,则通常在特征值发生变化时或通过定时器定期发送通知。但只有当对端设备请求了通知时,才会发送通知。这一请求通过设置一种特定类型的描述符——客户端特征配置描述符(Client Client Characteristic Configuration Descriptor)中的标志位来实现。该特征必须具备此描述符才能支持通知功能。

UUID

UUID即统一识别码,每一个服务和特性都需要一个唯一的UUID来标识

一些服务、特征和描述符是由蓝牙SIG定义的,并且具有标识其类型的16位UUID值。每种定义类型的蓝牙SIG列表可从规格/分配号码中获得。实现者可以购买16位uid和其他类型的分配号码

可以定义自定义服务、特征和描述符。自定义服务、特征和描述符可以由实现者分配的128位UUID值标识,也可以由实现者从蓝牙SIG购买16位UUID值。16位UUID也有一个等价的128位值,格式为0000XXXX-0000-1000-8000-00805F9B34FB,其中XXXX是16位UUID值。实现者不能在这个范围内使用UUID,除非UUID是从蓝牙SIG购买的。

图示为一个GATT服务器,它混合了蓝牙SIG定义的GATT属性和包含单个自定义特性的单个自定义服务。该自定义服务称为近距离监控服务,UUID类型标识值为0x 3E099910-293F-11E4-93BD-AFD0FE6D1DFD。其特性称为客户端邻近特性,UUID值为0x 3E099911-293F-11E4-93BD-AFD0FE6D1DFD。

参考资料

一文带你认识蓝牙 GATT 协议

BLE中GATT的服务和特征发现机制

GAP(通用访问配置文件)

广播是低功耗蓝牙通信的基础,低功耗蓝牙设备通过广播表明自身的存在,并等待被连接。两个低功耗蓝牙设备想要建立连接,首先由从机向外发送广播,然后山主机搜索并接收到广播后发起连接请求。从机广播的数据包中包含了设备的相关信息,如设备名称(即广播名称)、设备的服务UUID等。

  1. 广播数据包。BLE广播数据包是通过广播频道(第37、38、39个频道)发送的,广播数据包最大长度为37B,其中设备地址占用了6B,因此广数据包最多能携带31B的数据。

  2. 扫描回应数据包。在主机主动扫描的情况下,可向从机发送扫描请求,从机返回扫描回应数据包。扫描回应数据包的数据格式和广播数据包的格式一样,最多能携带31B的数据。

  3. 广播间隔。低功耗蓝牙设备在广播时,会依次在第37、38、39个频道发送相同的广播数据包。广播数据包称为一个广播事件,每个广播事件的间隔称为广播间隔,广播间隔通常为20ms10.24s。低功耗蓝牙的链路层会在两个广播事件之间添加一个0~10ms的随机延时,从而保证在多个设备广播时,不会一貞发生广播碰撞的情况。也就是说,设置100ms的广播间隔,实际上两次广播事件的时间间隔可能是100110ms之间的任意时间。

广播包格式

其中AD Structure中的Type可以具体参考 —— Assigned_Numbers - 2.3 CommonDataTypes

发现模式

广播设备或外围设备要么处于不可发现模式,要么处于 GAP 定义的两种可发现模式之一。在不可发现模式下进行广播时,传输的数据包会在空中可见(这并非一项安全功能),但执行通用可发现流程或有限可发现流程的扫描设备将忽略这些数据包。

可发现设备可以处于 “一般可发现模式” 或 “有限可发现模式”。当处于一般可发现模式时,设备可被发现的时间不确定,而在有限可发现模式下,设备可被发现的时间最多为三分钟。当中心设备或观察者设备试图发现其他设备时,它可以使用被动扫描或主动扫描。两者中的哪一种被允许取决于设备是试图以一般可发现模式还是有限可发现模式发现设备。

广播扫描

扫描是主机监听从机广播数据包和发送扫描请求的过程,主机通过扫描,可以获取到从机的广播数据包和扫描回应数据包,主机可以对己扫到的从机发起连接请求,从而连接从机并进行通信。

扫描有两个重要的时间参数:扫描窗口和扫描间隔,如果扫描窗口等于扫描间隔,那么主机将一直处于扫描状态之中,持续监听从机的广播数据包

扫描的原理就是一定的广播间隔在3个频道上扫描。如果从机在主机扫描的频道中进行广播,那么主机就能获取从机的广播数据包。低功耗蓝牙广播包分为广播数据包和扫描回应数据包。主动扫描和被动扫招的区别在于.主动扫描可以获得广播数据包和扫描回应数据包;而被动扫描只能获得广播数据包,不能获得扫描回应数据包。

设备连接

广播是一对多的单向通信,没有应答机制。由于广播间隔的原因,使用广播交换数据时有较高的延时。如果需要进行点对点的可靠通信,就必须在主机和从机之间建立基于连接的双向通信

连接中,可以通过跳频方案使两个设备在特定时间、特定频道上传输数据。这些设备在约定的时间、在新频道相遇(由协议栈的链路层实现频道的切换),继续传输数据。用于传输数据的事件称为连接事件。如果没有要传输的数据,则由交换链路层数据来保持连接

连接间隔(Connection Interval):两个连接事件之间的时间间隔称为连接间隔,连接间隔的单位是上1.25ms,连接间隔的范围是7.5ms~4.0s。连接间隔约定了主机和从机之间交互数据的间隔,即使应用层没有需要交互的数据,链路层也会交互空包。

从机延时(Slave Latency):表示从机可以跳过多个连接事件的能力,这种能力给从机提供了更多的灵活性。如果从机没有要发送的数据,则可以跳过连接事件,继续保持休眠状态以节省电量。从机延时定义了允许交互空包的次数。

监管超时(SupervisionTime-out):如果在两次成功连接事件之间的最长时间内没有成功的连接事件,则终止连接并返回到未连接状态,监管超时的单位是10ms,其范围是用10(100ms)~3200(32.0s),监管超时必须大于有效的连接间隔。监管超时的意义是当主机和从机超过一定时间没有进行空包交互时,就可以认定链路不可靠,并断开主机和从机的连接。

在主机和从机连接时,连接参数是由主机在发起连接时提供的。如果从机对连接参数有自己的要求,如要求更低的功耗或更高的通信速率等,则可以向主机发送连接参数更新请求。从机可以在连接后的任何时候发起连接参数更新请求,但最好不要在刚刚建立连接时就发起连接参数更新请求,建议延时5s左右再发起连接参数更新请求。

传统广播类型 Legacy

  • ADV_IND(可连接可扫描非定向广播)

    主要用于等待被连接的设备(如蓝牙手环、串口模块),一旦被其他设备发起连接,广播会立即停止,无法持续传输数据,仅作为连接前的信息附带。

  • ADV_DIRECT_IND(可连接可扫描定向广播)

    仅用于和已配对设备的快速重连,几乎不携带业务数据,完全不适合广播数据传输。

  • ADV_SCAN_IND(不可连接、可扫描、非定向广播)

    不可连接,但支持响应扫描器的SCAN_REQ请求,额外回复 1 个SCAN_RSP扫描响应包。

  • ADV_NONCONN_IND(不可连接、不可扫描、非定向广播)

    纯单向广播,不响应任何扫描请求,也不接受连接请求;每个广播事件仅发送 1 个广播包,无额外交互。

扩展广播类型 Extended

BLE4.x的广播数据包最大为31B,BLE5.x的扩展广播数据包最大为255B提升了8倍多。由于BLE5使用了更多的广播频道,因此多个设备在上报数据时的抗频道干扰能力得到了提升。

在BLE4.x的PDU(包括ADV_IND、ADV_DIRECT_IND、ADV_NONCONN_IND和ADV_SCAN_IND等命令,称为Legacy PDU)的基础上,BLE5.x扩展了PDU(包括ADV_EXT_IND、AUX_ADV_IND、AUX_SYNC_IND和AUX_CHAIN_IND等命令,称为Extended Advertising PDU)

BLE5不仅可以将第37、38和39个频道作为广播频道(主广播频道,Primary Advertising Channel)还允许将其他37个频道作为广播频道(次广播频道,Secondary Advertising Channel)

  • ADV_EXT_IND

  • AUX_ADV_IND

  • AUX_SYNC_IND

  • AUX_CHAIN_IND

GAP 角色

  • Broadcaster

    一种通过某种形式的广告方式在无连接状态下传输数据的设备。这包括传统广告、扩展广告和周期性广告。广播器还可传输同步广播流。广播器必须具备发射器,但可选择是否配备接收器。广播器不接受中央设备的连接(除非同时承担外设角色)。

  • Observer

    观察者接收广告数据包或广播的同步流数据包。它不与其他设备连接,包含一个接收器,可能包含也可能不包含发送器。观察者能够以无连接方式接收广播数据。

  • Peripheral

    外设(从机)可通过中央设备连接,它包含一个发射器和一个接收器。

  • Central

    中央设备(主机)能够启动与外设设备建立连接,它同时包含发射器和接收器。

参考资料

BLE 蓝牙空中报文格式与解析(广播包)

Assigned Numbers

ATT(属性协议)

属性协议定义了两种角色:服务器(Server)和客户端(Client)

服务器(Server):提供数据的蓝牙设备。客户端(Client):需要数据的蓝牙设备。

简单来说,属性协议就是用于在服务器和客户端之间进行通信的协议。服务器保存了一个类似“属性数据库”的索引列表——属性表(attribute_table),其中包含了一系列的属性及其特性而客户端可以通过属性协议从服务器获取这些属性。

再具体一些,客户端可以查询(Discover)、读取(Read)甚至配置(Write)服务器中保存的属性。在配置之后,服务器可以实时地眚知客户端属性值的变化。通知可以是无须客户端应答的(notification),也可以是需要客户端响应的(indication)

低功耗蓝牙把所有事物、状态抽象成属性,属性是一条公开的带有标签的、可被寻址的数据实体,包含标识符、句柄、数据内容、访问权限、安全等。

每个属性(attribute)包含一个句柄(attribute_handle)、一个值(attribute_value)、一组权限(attribute_permission)和一个通用唯一标识符(UUID)。

(1)属性类型(AttributeType).可以被公开的数据有许多类型,如温度、压强、体积、距离、功率、时间、充电状态、开关状态、状态机的状态等。为了区分如此多的数据类型,低功耗蓝牙采用一串128bit的识别码来标识属性类型。这个从时间尺度和空间尺度都具有唯一性的识别码称为UUID(UniversallyUniqueIdentifier),该识别码〔数字串)在全球范围内不会重复,并且在可预见的未来也不会重复。

由于128bit的UUID相当长,设备间为了识别数据的类型需要发送16B的数据。为了提高传输效率,蓝牙技术联盟(SIG)定义了一个称为蓝牙基础UUID的128bit的通用唯一识别码,可结合一个较短的16bit数字串使用.蓝牙基础UUID和16bit的数字串仍然遵循通用唯一识别码的分配规则,不过在设备间传输常用的UUID时,可以只发送16bit的数字串,接收方收到后补上蓝牙基础UUID即可

(2)属性句柄。属性句柄犹如指向属性实体的指针,对端设备可通过属性句柄来访问该属性。属性句柄是一个2B的数字串,有效范围为0x0001~0xFFFF。0x0000表示无效句柄,不能用于寻址属性。属性句柄为有序排列,后面的值会大于前面的值,通常下一个属性句柄的值是当前属性句柄的值加1

(3)属性值(AttributeValue)是一个8bit的字节数组,属性值的长度不包含在PDU中,所以需要从PDU的长度间接推算属性值的长度。属性值通常在一个PDU中发送,如果属性值太长,则可以通过多个PDU发送

(4)属性许可(AttributePermissions).属性许可仅仅是对属性值的一种保护,对属性句柄和属性类型没有影响。也就是说,对方设备(对端)对这个属性许可的操作具有什么样的权限,也就规定了这个属性许可的安全级别。例如,读写是否需要认证或者需要授权。注意.属性许可是不能通过属性发现协议获取到的,只能在获取对方某个属性时,如果需要什么权限·对方就会发一个状态过来,根据状态进行下一步操作

客户端使用ATT来发现服务器中属性表的详细信息,包括感兴趣的属性或属性类型的句柄值。当句柄值已知时,它们可以与某些PDU类型一起使用,以识别表中的特定属性,然后对其进行操作。例如,ATT_READ_BY_GROUP_TYPE_REQ 可用于查找主服务定义中所有属性的句柄和UUID。

Attribute PDU

请求(Requests),客户端发送给服务端,要求服务端回复

响应(Responses),客户端发送了一个请求,服务端用此响应

命令(Command),客户端发送给服务端,不要求服务端回复

通知(Notifications),服务端发给客户端的数据,不要求客户端回复

指示(Indications),服务端发给客户端的数据,要求客户端回复

确认(Confirmations),服务端发给客户端的数据,客户端用此进行回复

  1. Commands

  2. Requests and Responses

    ATT请求PDU由客户端发送给服务器。服务器应该在30秒内回复一个相应类型的响应PDU或一个错误响应PDU (ATT_ERROR_RSP)。未能在30秒内响应将构成超时。

  3. Notifications

    通知是由服务器发送给客户机的类型为ATT_HANDLE_VALUE_NTF的未经请求的pdu。没有定义应答PDU。

  4. Indications and Confirmations

    ATT指示PDU由服务器发送给客户端。客户端应在30秒内回复一个相应类型的确认PDU或一个错误响应PDU (ATT_ERROR_RSP)。未能在30秒内响应将构成超时。

参考资料

SMP(安全管理协议)

在执行安全过程(如配对)期间使用的一种协议。

安全管理器协议(SMP)是堆栈的安全管理器组件的一部分。它支持执行与安全相关的过程,如配对、绑定和密钥分发。

安全管理器组件为其他层可以使用的安全功能提供了一个加密工具箱,并定义了配对算法。

配对与绑定

安全是低功耗蓝牙的首要关注问题,配对(Paring)和绑定(Bonding)是实现低功耗蓝牙安全的一种机制。配对和绑定功能的数据进行特殊处理安全有两种选项:加密或者签名,目前的大多数应用都选择加密。

对于低功耗蓝牙来说,配对和绑定是两种不同的机制。简单来说,配对是指低功耗蓝牙主从机交换加密特性,并创建临时密钥;绑定则是指在配对之后交换并保存长期密钥,用于之后的快速连接。

配对和绑定实现了低功耗蓝牙的安全,对应用来说该过程是完全透明的,无须对添加了配对和绑定功能的数据进行特殊处理。

除了可以采用配对和绑定来实现低功耗蓝牙的安全,开发者也可以在应用层来实现低功耗蓝牙的安全,两者在功能和安全性上没有本质的区别。如果在应用层实现低功耗蓝牙的安全,则需要完成密码算法、密钥生成、密钥交换等过程,会增加大量的工作。如果开发者不是安全方面的专家,则应用就有可能存在安全漏洞。

  • 配对

    配对是加密特性的交换,包括IO能力、是否需要中间保护等。配对是由客户端发起的,一旦配对成功,就会确定主从机之间的加密机制并使该机制生效。

    配对完成后,一个临时的密钥就被生成和交换,连接会被加密,但配对仅使用一个临时的加密密钥。在加密的连接中·会生成长期密钥.长期密钥类似于一个数字签名,具体交换哪些密钥、密钥的长短,取决于配对双方所支持的加密特性。

    配对包括配对能力交换、设备认证、密钥生成、连接加密和秘密信息分发等过程,配对的目的有三个,分别是加密连接、认证设备和生成密钥。

  • 绑定

    绑定才真正意味着在加密特性交換和连接加密后(配对完成),完成了双方长期密钥的交换,双方己经存储并将在下次连接时使用该长期密钥。长期密钥可以通过绑定程序来交换,但如果长期密钥没有被成功存储和使用,则不能认为绑定己成功。

    如果一个设备和另一个设备己经成功绑定,如一个用于心率监测的手环和一部手机,则两个设备无须交换密钥就可实现加密连接,在手机向手环发起连接时仅需要请求手坏开启加密,双方就可以使用已经存储的密钥进行通信。这样可以防止第三方在密钥交换的过程中窃取密钥,因为在配对时己经完成了密钥交换并存储了密钥。

L2CAP(逻辑链路控制协议)

L2CAP负责协议多路复用、流量控制、业务数据单元sdu的分段和重组

充当Host Layer的协议多路复用器,确保协议由适当的主机组件提供服务。在L2CAP上下层之间对 PDU/SDU 进行分段和重组。

  1. Protocol Multiplexing 协议复用

    L2CAP之上的层使用不同的协议,如属性协议(ATT)和安全管理协议(SMP)。L2CAP协议多路复用确保将sdu从堆栈向上传递到适当的层进行处理。

  2. Flow Control 流量控制

    流量控制关注的是确保堆栈中的一层产生数据包的速率不超过同一堆栈中的另一层或远程设备上处理这些数据包的速率。(即控制入栈速度小于出栈速度,避免溢出)如果没有流量控制,就有出现缓冲区溢出等问题的风险。

  3. Segmentation and Reassembly 分段和重组

    L2CAP以上和以下的层都受最大传输单元(Maximum Transmission Unit, MTU)大小的限制,该大小规定了该层创建的PDU类型所允许的最大大小。例如,ATT_MTU参数定义了ATT PDU的最大大小。

    L2CAP本身和它上面或下面的层在堆栈中可能有不同的MTU大小,因此,可能有必要将一些 pdu / sdu分成一系列相邻层可以处理的较小的部分,或者相反,将一系列相关的较小的部分重新组装成完整的 pdu / sdu

HCI(主机控制器接口)

为主机组件和控制器之间的命令和数据的双向通信提供定义良好的功能接口。

HCI表示Host与Controller之间的逻辑接口,但不是物理组件。就底层物理传输而言,HCI可以以多种不同的方式实现,但逻辑或功能接口总是相同的。

值得注意的是,蓝牙LE栈跨越了OSI参考模型的所有层,而许多其他无线系统只跨越了OSI层的一个子集,例如物理层和数据链路层。作为全栈通信系统,蓝牙技术的一个优势是不依赖于其他标准体。这种依赖关系会限制技术的发展。

LL(链路层)

PHY(物理层)

调制方式

  • GFSK 高斯频移键控

  • ASK 幅移键控

PHY模式

  • LE 1M PHY

    LE 1M PHY是BLE4.0中使用的PHY,在BLE5中也会使用到的。BLE5和BLE4.2的数据包类型是一样的,有效载荷均为255B,因此当BLE5.x使用LE 1M PHY时,传输速率、功耗、通信距离等参数和BLE4.2是一样的。相对于BLE4.0/4.1的LE PHY部分,BLE5.x的数据包长度是BLE4.0/4.1的8倍,可在Mesh网络及其他网络中传播更多的数据量,为面向非连接的应用提供了更多的灵活性力

  • LE 2M PHY

    LE 2M PHY是BLE5.x新增的PHY,在不改变数据包类型的情况下,将原来的发送数据包和接收数据包所需的时间缩短为原来的一半。在不考虑数据包间隔时间的情况下,BLE5.x将理论传输速率提高到了BLE4.0的2倍,可支持LE Audio等高级音频应用和图像传输应用。

  • LE Coded PHY

    BLE5.x是依靠LE Coded PHY来实现长距离通信的。要增加通信距离,就要保证可以在更长的通信距离处实现和原来相同的可容忍误码率。BLE5.x在增加通信距离的同时并没有增加发射功率,而是增加了新的错误检测和处理机制,即在数据包中额外添加了前向纠错(FEC)编码,从而实现了更长的通信距离。

    BLE5.x的LE Coded PHY又分为LE Coded S=2和LE Coded S=8两种编码方案。在LE Coded S=2编码方案中,FEC编码使用卷积编码器,通过1/2的码率输出数据位,即用2个编码位代替原来1个数据位,这种编码方案下,有效数据的理论传输速率降低为500kbps,但由于加强了纠错能力,提高了灵敏度,通信距离可以达到低功耗蓝牙4的2倍。在LE Coded S=8编码方案中,卷积编码器以1/8的码率输出数据,即用8个编码位代替原来1个数据位,有效数据的理论传输速率为125kbps,但纠错能力和抗十扰能力得到了极大的加强。LE Coded S=8编码方案与改进的搜索模式相关性接收器相配合,能够提供12dB的编码增益,可以有效提高接收器的灵敏度,并且理论上可以将通信距离提高到BLE4.x的4倍

本篇参考资料