148 lines
6.0 KiB
Markdown
148 lines
6.0 KiB
Markdown
# 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.java`
|
||
- `app/src/main/java/com/example/electronicScale/ECBLE.java`
|
||
- `app/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 客户端代码框架**按这些参数整理出来,或者补齐“自定义指令协议”的字段与示例帧。
|