first commit

This commit is contained in:
2026-02-10 17:11:06 +08:00
commit 12f4fb81b8
32 changed files with 2958 additions and 0 deletions

147
BLE_PAIRING_PARAMETERS.md Normal file
View File

@@ -0,0 +1,147 @@
# BLE 配对关键参数说明
本文档面向通用 BLE 场景概述配对Pairing过程中最关键的参数与含义。配对由 SMPSecurity Manager Protocol执行结果是双方生成并分发密钥进而建立加密链路和可选长期绑定Bonding。文末附上本项目“已配对/可连接从机”的关键参数,便于其他客户端(如 ESP-IDF/ESP32复用连接。
## 1) 角色与流程层级
- 角色
- Central中心/主机)与 Peripheral外设/从机)均可发起配对,但在 SMP 中仍以“发起方/响应方”区分。
- GATT Client/Server 是应用层角色SMP 只关心链路安全,不直接关心 GATT 读写。
- 安全版本
- Legacy Pairing蓝牙 4.0+
- LE Secure ConnectionsLESC蓝牙 4.2+,更强的密钥协商)
## 2) 配对方法(由 IO 能力与安全需求决定)
- Just Works无交互防 MITM 能力弱。
- Passkey Entry一端显示 6 位码,另一端输入。
- Numeric Comparison双方显示 6 位码,用户确认一致。
- OOBOut 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 数据可用于配对
- AuthReqAuthentication Requirements
- Bonding是否保存长期密钥
- MITM是否要求防中间人
- SC是否要求 LE Secure Connections
- Keypress是否支持按键通知
- Max Encryption Key Size
- 7~16 字节,通常为 16
- Key Distribution
- EncKeyLTK 等加密相关)
- IdKeyIRK/Identity Address
- SignCSRK用于数据签名
- LinkKey用于 BR/EDR 互通LE 通常不用)
## 4) 关键密钥与作用
- LTKLong Term Key
- 用于后续重连时的链路加密
- IRKIdentity Resolving Key
- 用于解析可解析私有地址RPA实现隐私保护
- CSRKConnection Signature Resolving Key
- 用于数据签名,较少使用
- STKShort Term Key
- Legacy Pairing 中临时加密用(非长期)
## 5) 地址与隐私相关参数
- 地址类型
- Public Address / Random Address
- Random 又分 Static / Non-Resolvable / ResolvableRPA
- 隐私开关
- 使用 RPA + IRK 可隐藏真实地址,提升隐私与安全
## 6) 安全等级(常见分级)
- LE Security Mode 1
- Level 1无加密
- Level 2加密Legacy
- Level 3加密 + MITMLegacy
- Level 4加密 + MITMLESC
- LE Security Mode 2
- Level 1数据签名无加密
- Level 2数据签名 + MITM
## 7) 连接参数(与配对间接相关)
这类参数不属于配对协议,但会影响配对体验与稳定性:
- Connection Interval连接间隔
- Slave Latency从机延迟
- Supervision Timeout监督超时
注:若连接不稳定或超时过短,可能导致配对失败或断连。
## 8) 实际排查时常关注的“关键参数清单”
- 是否启用 LESCSC 位)
- 是否要求 MITMAuthReq
- 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 客户端代码框架**按这些参数整理出来,或者补齐“自定义指令协议”的字段与示例帧。