1. 第一张:SMP Security Request

你看到:
SMP Security Request
Auth Req: 0x08
Bonding Disabled
MITM Disabled
SC Enabled
这是 外设发给主机的安全请求。
意思是模块在告诉手机:
我希望当前连接提升安全等级
我支持 Secure Connections
但这个 Security Request 里没有要求 Bonding
也没有要求 MITM
注意这里是模块发起的 Security Request,它只是一个"请求主机开始配对/加密"的触发信号。
这一包的原始 SMP payload 是:
0B 08
其中:
0B = Security Request 命令码
08 = AuthReq
2. 第二张:SMP Pairing Request

手机随后发送:
SMP Pairing Request Command
IO Capability: 0x04 - Keyboard Display
OOB Data: 0x00
Auth Req: 0x2D
Bonding Enabled
MITM Enabled
SC Enabled
Keypress Disabled
CT2 Enabled
Max Enc Key Size: 16
Initiator Key Distribution: 0x0B
Responder Key Distribution: 0x0B
这是 主机,也就是手机,发出的配对请求。
重点看这几个字段。
IO Capability: Keyboard Display
手机告诉模块:
我具备键盘 + 显示能力
也就是手机既能显示数字,也能输入数字。
Auth Req: 0x2D
这个很关键:
Bonding Enabled
MITM Enabled
SC Enabled
CT2 Enabled
说明手机希望:
建立绑定关系
需要 MITM 保护
使用 LE Secure Connections
支持 CT2
也就是说,虽然模块一开始的 Security Request 里显示 Bonding Disabled、MITM Disabled,但手机发起 Pairing Request 时提出了更高的安全要求。
Key Distribution: 0x0B
Initiator Key Distribution: LTK IRK LinkKey Requested
Responder Key Distribution: LTK IRK LinkKey Requested
意思是双方后面会分发密钥,主要包括:
LTK:用于后续加密
IRK:用于身份地址解析
LinkKey:和跨传输密钥有关
3. 第三张:SMP Pairing Response

模块回复:
SMP Pairing Response Command
IO Capability: 0x03 - No Input No Output
OOB Data: 0x00
Auth Req: 0x0D
Bonding Enabled
MITM Enabled
SC Enabled
Keypress Disabled
CT2 Disabled
Max Enc Key Size: 16
Initiator Key Distribution: 0x03
Responder Key Distribution: 0x03
这是模块对手机的回应。
重点:
IO Capability: No Input No Output
模块告诉手机:
我没有输入能力
我也没有显示能力
这符合很多蓝牙模块的实际情况。
Auth Req: 0x0D
模块支持:
Bonding Enabled
MITM Enabled
SC Enabled
但是:
CT2 Disabled
所以最终安全能力要按双方共同支持的能力来协商。
Key Distribution: 0x03
模块这里请求/支持分发:
LTK
IRK
这说明后面会看到身份信息和身份地址信息的交换。
4. 第二、三张之间的一个重点:最终配对方式可能不是你表面想象的"输入密码"
虽然手机的 IO Capability 是:
Keyboard Display
但是模块是:
No Input No Output
这种组合通常不能做真正的 Passkey Entry 或 Numeric Comparison。
所以即使 AuthReq 里看到 MITM Enabled,实际可达的配对方式还要看双方 IO 能力组合。
你这个模块没有输入输出能力,所以实际体验上可能更接近:
系统弹配对确认
用户点允许
底层完成 LE Secure Connections
而不是让模块显示数字、手机输入数字。
5. 第四、五张:Pairing Public Key 交换

看到手机发送:
SMP Pairing Public Key Command
Public Key X: ...
Public Key Y: ...
然后模块也发送:
SMP Pairing Public Key Command
Public Key X: ...
Public Key Y: ...
这说明双方正在走 LE Secure Connections。
LE Secure Connections 使用 ECDH,也就是椭圆曲线 Diffie-Hellman 密钥交换。
简单理解:
手机生成一对公私钥
模块生成一对公私钥
双方交换公钥
双方各自用自己的私钥 + 对方公钥
计算出相同的共享密钥
这个共享密钥后面会参与生成加密相关的 key。
所以看到 Pairing Public Key Command,可以明确判断:
这次配对不是传统 Legacy Pairing
而是 LE Secure Connections 配对
6. 第六张:Pairing Confirm

模块发:
SMP Pairing Confirm Command
Confirm Value: ...
这是配对确认值。
它的作用是:
双方先各自算出一个确认值
先交换确认值
后面再交换随机数
对方用随机数重新计算确认值
确认双方计算一致
它不是明文密码,也不是最终密钥,而是配对过程中的校验数据。
7. 第七、八张:Pairing Random

手机发送:
SMP Pairing Random Command
Random Value: ...
模块也发送:
SMP Pairing Random Command
Random Value: ...
这一步是为了配合前面的 Confirm Value 做验证。
流程大概是:
先交换 Confirm
再交换 Random
用 Random 重新计算 Confirm
验证是否匹配
如果验证失败,配对会失败。
如果验证成功,继续后续加密流程。
8. 第九、十张:DHKey Check

手机发送:
SMP Pairing DHKey Check Command
DHKey Check: ...
模块也发送:
SMP Pairing DHKey Check Command
DHKey Check: ...
这也是 LE Secure Connections 的关键步骤。
它用于确认双方基于 ECDH 算出来的共享密钥一致,并且配对参数没有被篡改。
看到这个,进一步确认:
当前配对流程是 LE Secure Connections
而不是 Legacy Pairing
9. 第十一张:LE Start Encryption

看到:
HCI Command
LE Start Encryption
Connection Handle: 0x0040
Random Number: 0000000000000000
Encrypted Diversifier: 0000
Long Term Key: ...
这是主机控制器开始加密链路。
意思是手机让蓝牙控制器对当前 BLE 连接启用加密。
这里出现:
Long Term Key
说明经过前面的配对过程后,双方已经得到了可用于链路加密的 LTK。
10. 第十二张:Encryption Change Complete

看到:
HCI Event
Encryption Change Complete - Encryption Enabled
Status: 0x00 - Success
Encryption Enable: 0x01
这是非常关键的结果。
它说明:
加密启用成功
当前 BLE 链路已经进入加密状态
所以到这里为止,可以认为:
SMP 配对关键流程完成
链路已经加密
后续可以访问要求加密的 GATT 特征/描述符
如果某些 Characteristic 或 Descriptor 要求加密读写,一般要等到这个阶段之后才更稳。
11. 第十三、十四张:模块发送 Identity Information 和 Identity Address Information

模块发:
SMP Identity Information Command
IRK: ...
接着发:
SMP Identity Address Information Command
Address Type: 0x00
Address: ...
这是模块在分发身份信息。
IRK 是什么?
IRK = Identity Resolving Key。
它用于解析设备身份,尤其是设备使用随机地址、隐私地址时,主机可以用 IRK 判断:
这个随机地址背后是不是之前绑定过的同一个设备
Identity Address 是什么?
模块还把自己的身份地址发给手机。
这里你截图中能看到地址。这个地址有识别度,后续不要公开。
这一步的意义是:
手机保存模块的身份信息
以后模块重连时,手机可以识别它是同一个已绑定设备
这就和"模块重新上电后系统自动重连"有关。
12. 第十五、十六张:手机发送自己的 Identity Information 和 Identity Address Information

手机也发送:
SMP Identity Information Command
IRK: ...
以及:
SMP Identity Address Information Command
Address Type: 0x00
Address: ...
这说明手机也把自己的身份信息分发给模块。
所以双方都保存对方身份信息。
这就是 Bonding 的一部分。
后续重连时,不需要完整重新配对,可以通过保存的密钥和身份信息恢复安全连接。
13. 整体时序总结
- 模块 → 手机:Security Request
模块请求提升安全等级,支持 Secure Connections。
- 手机 → 模块:Pairing Request
手机发起配对,请求 Bonding、MITM、SC,最大密钥长度 16。
- 模块 → 手机:Pairing Response
模块接受配对,声明自己 No Input No Output,支持 Bonding、MITM、SC。
- 手机 ↔ 模块:Pairing Public Key
双方交换 ECDH 公钥,说明使用 LE Secure Connections。
- 模块 → 手机:Pairing Confirm
发送确认值。
- 手机 ↔ 模块:Pairing Random
双方交换随机数,用于验证 Confirm。
- 手机 ↔ 模块:DHKey Check
双方验证 ECDH 计算结果和配对参数。
- 手机 → 控制器:LE Start Encryption
手机启动 BLE 链路加密。
- 控制器 → 手机:Encryption Change Complete
加密启用成功。
- 模块 → 手机:Identity Information
模块分发 IRK。
- 模块 → 手机:Identity Address Information
模块分发身份地址。
- 手机 → 模块:Identity Information
手机分发 IRK。
- 手机 → 模块:Identity Address Information
手机分发身份地址。
14. 这组日志说明了什么?
它说明了几个重要结论。
第一,这不是简单的普通 BLE 明文连接。
当前连接触发了 SMP 配对流程。
第二,这次配对使用了 LE Secure Connections。
证据是:
Pairing Public Key
DHKey Check
SC Enabled
第三,最终链路加密成功。
证据是:
Encryption Change Complete - Encryption Enabled
Status: Success
第四,双方完成了身份信息分发。
证据是:
Identity Information
Identity Address Information
IRK
Address
第五,这次连接具备 Bonding 行为。
证据是:
Pairing Request: Bonding Enabled
Pairing Response: Bonding Enabled
后续发生 IRK / Identity Address 分发
第六,后续自动重连和系统记住设备是有基础的。
因为双方已经交换并保存了密钥和身份信息。