BLE中GAP层中广播、扫描、连接等概念在LL层的具体实现
说明
在spec中GAP的章节里对广播、扫描、连接的概念进行了说明。但缺乏具体实现的解释。
Vol 3: Core System Package [Host volume]
Part C: Generic Access Profile
而在LL层章节中则提供了相关GAP相关数据包交互的流程。
Vol 6: Core System Package [Low Energy Controller volume]
Part B: Link Layer Specification
4 Air Interface protocol
为了更好的理解BLE中GAP协议,对LL层相关基本流程进行分析是很有意义的。这里只对GAP中的传统(Legacy)广播、扫描连接进行基本分析。扩展广播和扫描连接在另外章节做分析。为了能更好的从LL层向GAP层过度,这里我们仍采用LL层中Physical channel的定义来做分类。
Advertising physical channel 的交互
广播
广播包解析
传统广播使用的基本广播包ADV_IND PDU结构如上,该PDU被包含在LL层的封包中。PDU结构包含
-
AdvA:广播地址,即MAC地址
-
AdvData:广播数据,0-31长度,格式有相关要求。
对于其他类型的广播,PDU结构会有区别。例如定向广播还会包含主机设备地址,用于指定哪个主机允许搜到该广播信号。具体情况需查询spec中的说明。
广播流程
广播流程如上图,广播设备连续在37、38、39三个广播信道上发送广播包,作为一个广播事件周期。
扫描
扫描流程
扫描流程为主机监听广播包后,发起扫描请求和接收扫描响应的过程。具体流程如下:
-
从机设备进行广播,周期性发送广播包ADV_IND
-
当主机监听到从机设备发送的广播包后,可以向从机设备发送扫描请求包SCAN_REQ
-
但从机听到主机发送的扫描请求包后,可以进行响应并发送扫描响应包
该过程用于主机设备在不与从机设备发生连接的情况下,能获取更多的信息。
需要注意的是,广播类型可以设置为不可扫描的(Non-scannable)。这样的广播主机发送扫描请求包将得不到从机的应答。
扫描请求包
基本的扫描请求包SCAN_REQ格式如上,包含:
- ScanA:扫描设备的MAC地址
- AdvA:广播设备的MAC地址
扫描响应包
基本的扫描响应包SCAN_RSP格式如上,包含:
- AdvA:广播设备的MAC地址
- ScanRspData:扫描响应数据,0-31字节。格式要求和广播数据意义。
连接
连接建立流程
连接建立流程如下:
- 从机发送广播包
- 主机收到广播包后,向从机发送连接请求包。
- 双方根据连接请求包中的内容,同步连接参数。然后在协商好的时间点进行连接事件(交换连接数据包)
这里的流程说明比较简略。具体的流程说明和参数解释需参考开头说的spec里的章节。
连接请求包
连接请求包内如如上,包含:
- InitA:主机MAC地址
- AdvA:从机MAC地址
- LLData:连接建立参数
其中LLData中的参数包含:
-
AA:链路层的访问地址Access Address。即把LL包的AA又复制了一遍过来。
-
CRCInit:CRC校验的初始值
-
WinSize:发送窗口的大小
-
WinOffset:发送窗口的偏移
-
Interval:连接间隔
-
Latency:可以跳过的连接事件
-
Timeout:连接超时时间
-
ChM:可用连接数据信道图
-
Hop:跳频算法
-
SCA:休眠时钟精度
相关参数只做简单介绍,具体说明请参考spec。
Data Physical Channel 的交互
数据物理信道的PDU包含Header、Payload、MIC三部分。MIC为信息完整性码,只有启用数据加密鉴权功能才会有这个为。Payload为数据负载,而Header包含数据传输的应答重传控制信息。其中Header的内容如下:
- LLID:指示数据包是LL Data PDU还是LL Control PDU
- NESN:指示下一个期望的包的序列号
- SN:指示当前包的序列号,与NESN一起决定了数据包是否传输 OK,是否要进行重传和流控处理
- MD:More Data,指示后面是否跟有更多的数据,有了这个 MD 对端才会打开接收窗口继续接收数据
- CP:CTEInfo Present,指示空口包是否带CTE字段
- RFU:RESERVED FOR FUTURE USE,即预留没用的字段
- Length:指示Playload + MIC (如果有的话)的长度
- CTEinfo:指示CTE的类型和长度
这里数据物理通道的作用和GAP协议的关系已经不大了,LL Header的作用是LL层本身自己的数据应答和重传功能
连接数据(LL Data)交互
连接数据交换过程
上图为连接事件中主从数据交换的过程示意图。相关过程如果要展开来讲会涉及高层次L2CAP协议概念,这里读者只需了解它的本质只是简单的主从数据包交换即可。
连接数据PDU格式
数据交互部分的PDU内容与LL层和GAP层已经无关了,而是涉及L2CAP层概念,在L2CAP层中的PDU分为各种类型,例如上图是L2CAP中B帧类型的PDU结果。这里读者无需了解这个B帧是什么,相关会在L2CAP层协议得解析文章中再做具体分析。
要注意这里的图中的L2CAP PDU实际是LL Payload
连接控制(LL Control)交互
连接控制的交互涉及到上次许多协议的概念,例如SMP层的加密请求,PHY层的通信速率改变、GAP层的连接参数更新等。这些行为具象化到LL层就是连接控制交互的各种PDU。由于本文只关注LL层和GAP层的联系,因此只以连接参数更新为例进行介绍,其他请参考spec。
PDU基本结构
连接控制PDU基本结构如上,其中:
-
Opcode:为operation码,指示是何种操作,在上一篇PDU总结中对所有的控制PDU都进行了总结,详情情况上一篇博客。
-
CtrData:具体操作内容。
连接参数更新
连接参数更新的流程如上图。详细说明参考spec如下章节
Vol 6: Core System Package [Low Energy Controller volume]
Part B: Link Layer Specification
5 Link Layer control
5.1 Link Layer control procedures
连接参数更新请求包
连接参数更新请求包的Opcode为0x00,即LL_CONNECTION_UPDATE_IND。CtrData中包含连接参数,具体内容和连接请求包一样。
总结
LL层作为支撑,将上层协议的各种概念都具象化为一种种PDU,然后组成包发到空中。通过对PDU的内容结构,PDU的交互方式进行分析了解,才能更好的明白上次协议的各种概念。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现