低功耗蓝牙协议(BLE)

本文最后更新于 2024年6月25日 早上

1 简述

本文主要是介绍低功耗蓝牙协议,能够大致了解各个协议层的作用,不涉及到实际使用

2 协议层级

2.1 Physical Layer(PHY)

物理层用于处理无线通信介质,射频发射接收相关的特性等,决定了芯片的无线信号和功耗。

  • 调制方式
    低功耗蓝牙采用高斯频移键控(GFSK)的方式传递0和1,频移键控通过把1和0轻微升高或者降低信号频率进行编码。以中心频率为基准,超过185KHz的正向偏移待代表值为1,超过185KHz的负向偏移代表0。
  • 频段
    采用ISM频段(频率范围是2.400-2.4835 GHz),整个频带分为40份,每份的带宽为2MHz,每微秒传输1比特应用数据
  • 射频参数
    发射功率(≤ 100 毫瓦 (+20 dBm))
    接收灵敏度(
    LE 2M PHY:≤-70 dBm
    LE 1M PHY:≤-70 dBm
    LE 编码 PHY (S=2):≤-75 dBm
    LE 编码 PHY (S=8):≤-82 dBm

2.2 LinkLayer(LL)

链路层主要负责广播、扫描、建立和维护连接,以及确保数据包按照正确的方式组织、正确的计算校验值以及加密序列等。

链路层主要控制数据的收发,包含选择什么通道,什么时间发送数据、监听空中数据包、应答和重传等。

链路层信道分为广播信道和数据信道,广播信道有三个,频率不同,告知自身可被发现和可连接。数据信道有37个,由一个自适应跳频引擎控制。在数据通信中,允许一端向另一端发送数据、确认、需要时重传、还能为每个数据加密和认证。

无论是广播还是数据,基本的数据包格式相同,每个包至少80比特的地址、报头和校验信息

链路层有五种状态,等待状态、广播状态、扫描状态、初始化状态和连接状态,通过GAP层来控制。

状态 说明
Standby 初始状态,即不发送数据,也不接收数据。根据上层实体的命令(如位于host软件中GAP),可由其它任何一种状态进入,也可以切换到除Connection状态外的任意一种状态。
Advertising 可以通过广播通道发送数据的状态,由Standby状态进入。它广播的数据可以由处于Scanning或者Initiating状态的实体接收。上层实体可通过命令将Advertising状态切换回Standby状态。另外,连接成功后,也可切换为Connection状态。
Scanning 可以通过广播通道接收数据的状态,由Standby状态进入。根据Advertiser所广播的数据的类型,有些Scanner还可以主动向Advertiser请求一些额外数据。上层实体可通过命令将Scanning状态切换回Standby状态。
Initiating 和Scanning状态类似,不过是一种特殊的接收状态,由Standby状态进入,只能接收Advertiser广播的connectable的数据,并在接收到数据后,发送连接请求,以便和Advertiser建立连接。当连接成功后,Initiater和对应的Advertiser都会切换到Connection状态。
Connection 是和某个实体建立了单独通道的状态,在通道建立之后,由Initiating或者Advertising自动切换而来。通道断开后,会重新回到Standby状态。

2.3 HCI

接口层,向上层提供应用接口,一般用SPI,UART等传输协议来实现

2.4 L2CAP

逻辑链路控制与适配层,可以分割和重组数据,使其能够传输较大的报文,还能进行流量控制,协议通道复用。
该层

2.5 SM

加密管理层,实现安全的连接和数据传输。该层定义了一个简单的配对和密匙分发协议。

2.6 Attribute protocol(ATT)

2.6.1简述

数据交互协议,数据定义和数据操作,通过Attribute关键词来实现,一个属性代表了一种数据,也表示了可以进行的数据操作。设备初始化时也需要完成所以属性的存储。
可以参考json来理解,一个key(属性)对应一个值。ATT定义了6种访问本层数据的方法:Request、Response、Command、Indication、Confirmation、Notification。

2.6.2存储的数据结构

Attribute Handle Attribute Type Attribute Value Attribute Permissions
2字节长 2字节或者16字节 0~512字节
  • Handle为属性句柄,需要访问Attribute则需要通过此句柄
  • Type为属性类型,使用UUID来定义该类型,分为16为和128位两种。其中16位是使用了一种特色128位UUID来实现的。这特殊的UUID是
    0x0000xxxx-0000-1000-8000-00805F9B34FB
    而其中的xxxx就是被缩减的16位UUID了。
  • permissions权限属性:
权限 说明
Open 直接读写
No Access 禁止读写
Authentication 配对后读写
Authorization 授权读写
Signed 签名读写

2.6.3属性

属性的UUID都是唯一的,句柄则是依次递增,因为是连续的所以可以由开始句柄和接收句柄来分为一组。
属性包含服务、特征和描述三个类别。一个服务(Service)下有多个特征(Characteristic),特征下又有多个描述(Descriptor),多个服务可以组成profile。
服务仅仅是一个容器,不包含具体值,每个设备都包含两个服务:Generic Access Service和Generic Attribute Service。下图是任意连接了一个BLE设备读取的服务信息。点开后能看到服务包含的各个特征

特征则就是用来主从通讯的标识,通过它进行读数据和写数据。特征至少包含两个描述符,一个是特征声明(Characteristic Declaration)一个是存放特征的值(Characteristic Value),还有两个是可能存在,客户端特征配置(Client Characteristic Configuration),特征用户描述(Characteristic User Description)。我们在程序中使用UUID来读取数据时,实际上是最终是使用了特征中值的UUID。

2.6.4 通讯

在本层中,拥有属性的设备称为server,而读取属性值的设备称为client,两者通过ATT PDU通讯

PDU 方向 说明
Request请求 C->S
Response回应 S->C
Command命令 C->S
Indication指示 S->C
Confirmation确认 C-S>
Notification通知 S->C

通讯数据格式:

Opcode Parameter Authentication Signature
1 byte 0 – (ATT_MTU-X) byte 0 or 12 byte

Opcode:
0~5位是属性类型,6位是命令标志,7位是认证签名标志,如果为1则后面需要包含认证签名。

  • 错误处理
Opcode PDU 说明
0x01 Error Response 如果属性PDU的操作码无效,或属性句柄无效,将返回错误响应PDU。在PDU的Parameter字段中,包含了错误编码。
  • 交换MTU
Opcode PDU 说明
0X02 Exchange MTU Request 客户端设备向服务端设备发送交换MTU请求,提供客户端设备的MTU值。服务端设备获知客户端的MTU值,并返回自己的MTU值。两端设备都将设置较小的MTU值作为新的MTU值。
0X03 Exchange MTU Response 如果两端设备没有交换MTU,则使用默认的MTU值(BLE下为23)处理属性事务。
  • 查找信息
Opcode PDU 说明
0X04 Find Information Request 查找信息请求,包含两个参数:起始属性句柄和结束属性句柄,用于获取服务端设备属性句柄处于该参数区间内的属性
0X05 Find Information Response 查找信息响应,包含指定句柄区间内的属性UUID。如果区间内有多个属性,则返回多个响应。
0X06 Find By Type Value Request 按类型值查找请求,是在查找信息请求的基础上,加上了属性类型和属性值两个参数,这样能够更加精确的找到目标属性。
0X07 Find By Type Value Response 按类型值查找响应,包含了满足条件的属性句柄列表。
  • 读属性
Opcode PDU 说明
0x08 Read By Type Request 按类型读请求,包含三个参数:起始属性句柄、结束属性句柄和属性类型。
0x09 Read By Type Response 按类型读响应,包含了满足条件的属性的“句柄-值”对的列表。
0x0A Read Request 读请求,包含一个参数:属性句柄。
0x0B Read Response 读响应,返回满足条件的属性值。
0x0C Read Blob Request 读片段(blob)请求,用于读取一个长包属性的值,它包含两个参数:属性句柄和偏移量。以不同的偏移量作为参数,多次执行该请求可以读取长包属性的完整值。
0x0D Read Blob Response 读片段响应,包含了长包属性值的指定偏移量片段
0x0E Read Multiple Request 读多次请求,用于读取多个给定句柄的属性值,它包含一个参数:句柄列表。
0X0F Read Multiple Response 读多次响应,包含了多个指定句柄的属性值。
0x10 Read by Group Type Request 按组类型读请求,用于读取指定组类型的属性值,组类型是由ATT层之上的协议层设定的。它包含三个参数:起始属性句柄、结束属性句柄和属性组类型。
0x11 Read by Group Type Response 按组类型读响应,包含了满足条件的属性值列表
  • 写属性
Opcode PDU 说明
0x12 Write Request 写请求,将待写数值写入指定的属性值,包含两个参数:属性句柄和数值。
0x13 Write Response 写响应,表示写请求执行成功,不含任何参数。
0x14 Write Command 写命令,将待写数值写入指定的属性值,包含两个参数:属性句柄和数值。它不会触发一个写响应。
0x15 Signed Write Command 签名的写命令,与上面的写命令类似,指示包含了额外的参数:认证签名。典型应用是写控制点属性。
  • 队列写属性
Opcode PDU 说明
0X16 Prepare Write Request 准备写请求,用于发送一个长数据片段,它包含三个参数:属性句柄、偏移量和待写入数据。
0X17 Prepare Write Response 准备写响应,收到准备写请求以后,缓存收到的数据。
0X18 Execute Write Request 执行写请求,对前面缓存的数据执行写操作,它包含一个参数:标志位。如果标志位为1,则执行写操作,如果为0,则取消前面的缓存数据。
0X19 Execute Write Response 执行写响应,根据执行写请求的标志位,执行或取消写操作
  • 通知属性
Opcode PDU 说明
0X1B Handle Value Notification 发送数值通知,它包含两个参数:属性句柄和属性值。它不需要客户端收到后返回响应。
0X1D Handle Value Indication 发送数值指示,它包含两个参数:属性句柄和属性值。它需要客户端收到后返回确认。
0X1E Handle Value Confirmation 发送数值确认,它不包含参数,客户端发出该确认消息表示收到了数值指示。

Parameter权限:
若是Attribute Opcode中身份验证签名标记位为0,则X = 1;
若是Attribute Opcode中身份验证签名标记位为1,则X = 13;
Authentication Signature:
只有写命令才需要认证签名,其他命令不需要。此外,如果链路已经进行加密,则属性PDU中也无需额外添加认证签名。

2.7 GATT

通用属性配置(GATT),该层定义了使用ATT的服务框架和配置文件的结构,BLE中所以数据通讯都需要经过该层。如果说ATT是提供工具,那么GATT就是使用工具,它定义了上面提到的服务(
Service )和特征(Characteristic ),使其进行了分组管理。该层还定义了数据通讯流程,包括服务流程和形式,特征的发现,特征值的读写、订阅,特征的广播等。

2.7.1 profile

多个服务(server)组合起来就是一个porfile,它并不是通讯中的数据结构,只是一种定义,用它可以表示蓝牙设备所具备的功能和用途。一张流传甚广的图:

2.7.2 通讯

在设备通过GAP建立了连接后,GATT便开始工作了,它将设备分为了中心设备(client or Master)和从设备(server or Slave),所以通讯实际均是由中心设备发起,从设备进行相应。GATT的建立是独占的,从设备只能被一个中心设备所连接,连接后,它将广播广播。但一个中心设备可以连接多个从设备,并且通讯是双向的。在建立连接后,从设备将为给中心设备一个连接间隔(Connection Interval),用于根据此间隔重新连接,检查是否有新数据。

2.7.3 封包

如果想要发送一组数据data,那么首先经过GATT层,添加数据类型,设为(Dtype),数据变为了
Dtype+data
然后进入了ATT层,该层需要选择一种通讯命令,比如读/写/notify/indicate等,数据变为了
cmd + Dtype + data
接下来是L2CAP层,会添加逻辑通道编号和ATT数据长度,数据变为了
len + ch + cmd + Dtype + data
最后来到LL层,该层添加的东西就比较多了,前导码、访问地址、LL帧头字段、有效包数据长度、CRC24值,最终数据包变为了

preamble+access address+LL header+payload length+(上层的包)+ CRC24值

2.8 Generic Access Profile(GAP)

通用访问协议,向上,它是作为与应用程序和profile通讯的接口,向下,是对LL层payload(有效数据包)进行一些规范和定义。它的主要功能是广播、扫描和发起连接。

2.8.1 广播

广播方式由两种,Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复),前一种是每个设备都需要具备的,这样才能使其他设备发现它。后一种是可能具备的,回复信息包含名称等额外信息,比如你现在由手机搜索附件蓝牙设备,有一些只有个MAC地址,而有些则写了名字。
广播由两种使用方式,第一种是使其他设备发现自己,建立了GATT连接,然后再进行数据交换,另一种是直接将数据反正广播中。
广播包分别会在38,38,39三个信道上依次广播,间隔范围再20ms到10.24s,BLE链路层会在两个广播事件之间再增加一个0~10ms的随机延时,来避免重复碰撞。广播数据包最多携带31个字节数据,通常包含设备名称,设备是否可连接等信息。
广播只涉及到PHY、LL和GAP三层。

空中包数据格式为:

前导码 访问地址 LL帧头字段 有效数据长度 广播设备地址 广播数据 CRC24值

2.8.2 扫描

扫描也即主动监听周围的广播包,包含两个参数,扫描窗口和扫描时长,两者时间均不能大于10.24s,两次扫描的间隔时间=扫描时长-扫描窗口

2.8.3 连接

连接首先是两个设备的物理信道达成一致,然后进行时间同步。中心设备会以connection interval为间隔向设备B发送数据包,而从设备也会以此为间隔周期打开射频接收窗口。在从设备接收到中心设备数据的150us后将切换回发送模式,将自己的数据发送给中心设备。

3 其他

  • GATT必须向经过GAP协议,在使用蓝牙的时,可以直接通过MAC地址发起连接,看似是没有经过扫描,但其实是在底层已经进行了,连接过程总是向扫描,然后扫描到后再连接的。
  • 低功耗蓝牙BLE和传统蓝牙硬件是不同的,我们手上既能连接BLE也能连接传统蓝牙的设备通常是具备双模的。

4 信息来源

CC2549 Bluetooth Low Energy
BLE 5协议栈-属性协议层(ATT)
BLE技术揭秘
蜂窝科技
蓝牙官网

5 补充(2022年2月17日)

5.1 设备角色

在属性协议层上存在两种角色,客户端和服务器,服务器负责保存数据,客户端负责向其发送请求以获取数据。
广播者负责周期发送短消息,使其自身得以被发现,是传输数据包的设备。扫描者是接收广播数据的设备
主设备负责完成微微网的定时,自适应调频集合设置,加密以及一些其他复杂操作,从设备只需要完成相应的操作即可。
扫描者、主设备,客户端适合拥有较多资源的设备来担当;广播者,从设备,服务器适合资源受限的设备


低功耗蓝牙协议(BLE)
https://blog.kala.love/posts/777e1d7e/
作者
久远·卡拉
发布于
2021年9月10日
许可协议