6.0 KiB
6.0 KiB
BLE 配对关键参数说明
本文档面向通用 BLE 场景,概述配对(Pairing)过程中最关键的参数与含义。配对由 SMP(Security Manager Protocol)执行,结果是双方生成并分发密钥,进而建立加密链路和(可选)长期绑定(Bonding)。文末附上本项目“已配对/可连接从机”的关键参数,便于其他客户端(如 ESP-IDF/ESP32)复用连接。
1) 角色与流程层级
- 角色
- Central(中心/主机)与 Peripheral(外设/从机)均可发起配对,但在 SMP 中仍以“发起方/响应方”区分。
- GATT Client/Server 是应用层角色;SMP 只关心链路安全,不直接关心 GATT 读写。
- 安全版本
- Legacy Pairing(蓝牙 4.0+)
- LE Secure Connections(LESC,蓝牙 4.2+,更强的密钥协商)
2) 配对方法(由 IO 能力与安全需求决定)
- Just Works:无交互,防 MITM 能力弱。
- Passkey Entry:一端显示 6 位码,另一端输入。
- Numeric Comparison:双方显示 6 位码,用户确认一致。
- OOB(Out of Band):通过 NFC/二维码等带外信道交换信息,安全性高。
决定因素:设备 IO 能力 + 是否要求 MITM 防护 + 是否使用 LESC。
3) 配对请求/响应的关键字段(SMP Pairing Request/Response)
这些字段决定配对方式、密钥类型和安全等级,是“配对关键参数”的核心。
- IO Capability
- DisplayOnly, DisplayYesNo, KeyboardOnly, NoInputNoOutput, KeyboardDisplay
- 影响是否可用 Passkey / Numeric Comparison
- OOB Data Flag
- 指示是否有 OOB 数据可用于配对
- AuthReq(Authentication Requirements)
- Bonding(是否保存长期密钥)
- MITM(是否要求防中间人)
- SC(是否要求 LE Secure Connections)
- Keypress(是否支持按键通知)
- Max Encryption Key Size
- 7~16 字节,通常为 16
- Key Distribution
- EncKey(LTK 等加密相关)
- IdKey(IRK/Identity Address)
- Sign(CSRK,用于数据签名)
- LinkKey(用于 BR/EDR 互通,LE 通常不用)
4) 关键密钥与作用
- LTK(Long Term Key)
- 用于后续重连时的链路加密
- IRK(Identity Resolving Key)
- 用于解析可解析私有地址(RPA),实现隐私保护
- CSRK(Connection Signature Resolving Key)
- 用于数据签名,较少使用
- STK(Short Term Key)
- Legacy Pairing 中临时加密用(非长期)
5) 地址与隐私相关参数
- 地址类型
- Public Address / Random Address
- Random 又分 Static / Non-Resolvable / Resolvable(RPA)
- 隐私开关
- 使用 RPA + IRK 可隐藏真实地址,提升隐私与安全
6) 安全等级(常见分级)
- LE Security Mode 1
- Level 1:无加密
- Level 2:加密(Legacy)
- Level 3:加密 + MITM(Legacy)
- Level 4:加密 + MITM(LESC)
- LE Security Mode 2
- Level 1:数据签名(无加密)
- Level 2:数据签名 + MITM
7) 连接参数(与配对间接相关)
这类参数不属于配对协议,但会影响配对体验与稳定性:
- Connection Interval(连接间隔)
- Slave Latency(从机延迟)
- Supervision Timeout(监督超时)
注:若连接不稳定或超时过短,可能导致配对失败或断连。
8) 实际排查时常关注的“关键参数清单”
- 是否启用 LESC(SC 位)
- 是否要求 MITM(AuthReq)
- IO Capability 是否允许所需配对方式
- Key Size 是否为 16
- Key Distribution 是否双方一致
- 是否使用 RPA/IRK(隐私)
- 是否允许 Bonding(长期记忆配对)
9) 本项目 BLE 从机的关键参数(供其他客户端复用)
以下信息基于当前 Android 代码实现,目标是让其他设备/程序连接到同一台 BLE 从机(打印机)。相关代码位置:
app/src/main/java/com/example/electronicScale/MainActivity.javaapp/src/main/java/com/example/electronicScale/ECBLE.javaapp/src/main/java/com/example/electronicScale/BlueHandler.java
9.1 角色与连接方式
- Android App 作为 Central / GATT Client
- BLE 从机为打印机(由广播名过滤判断)
9.2 设备发现与识别参数
- 广播设备名:
lyfPrinter(忽略大小写、忽略首尾空格) - 设备地址:扫描得到的 MAC 地址,连接时会去掉冒号作为内部 id
- 扫描方式:使用
BluetoothAdapter.startLeScan()(Legacy 扫描)
9.3 GATT 关键参数
- Notify 特征 UUID:
0000fff1-0000-1000-8000-00805f9b34fb - Write 特征 UUID:
0000fff2-0000-1000-8000-00805f9b34fb - 服务 UUID:代码未硬编码服务 UUID,靠服务发现后遍历特征匹配
- 通知开启方式:
setCharacteristicNotification(true)+ 写 CCCD(0x2902)=0x0001 - 写入方式:
WRITE_TYPE_NO_RESPONSE - MTU:连接后请求
247
9.4 数据编码/格式
- 默认字符集:GBK(
ECBLE.setChineseTypeGBK()) - 写入支持 Hex 字符串转字节:
writeBLECharacteristicValue(data, true) - 实际指令帧为自定义协议,参考
BlueHandler中的命令/打包逻辑
9.5 安全/配对相关
- 代码未调用
createBond()或设置 PIN/LESC - 未显式要求加密或 MITM
- 推测从机允许无配对/Just Works直连
- 若固件强制安全配对,需要补充:IO Capability、AuthReq、Key Size、Key Distribution 等
9.6 连接限制提示
- 多数 BLE 从机同时只允许一个 Central 连接
- 若 Android App 已连接,ESP32 可能无法同时连接(除非从机支持多连接)
10) ESP-IDF 侧接入要点(简版清单)
- 扫描广播,优先匹配设备名
lyfPrinter(或直接使用已知 MAC) - 连接后进行服务发现,查找
fff1/fff2特征 - 启用
fff1通知(写 CCCD = 0x0001) - 向
fff2以 Write Without Response 方式写数据 - 协商 MTU 为 247
- 按自定义协议发送帧(参考
BlueHandler/DataConvertTool)
如果你需要,我可以把 ESP-IDF 的具体 GATT 客户端代码框架按这些参数整理出来,或者补齐“自定义指令协议”的字段与示例帧。