# 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 客户端代码框架**按这些参数整理出来,或者补齐“自定义指令协议”的字段与示例帧。