基于BlueZ的蓝牙Just Work模式配对失败:确认值错误
BlueZ Just Work模式配对失败:Confirm value failed (0x04) 排查方案
环境信息
- 内核:板载Linux 4.9.84 armv7l
- BlueZ版本:5.65
- 配对设备:Android 12、iOS 16.6
操作配置
- 蓝牙参数配置(通过
btmgmt):btmgmt power off btmgmt connectable on btmgmt pairable on btmgmt power on btmgmt le on btmgmt io-cap 0x3 # 设置IO能力为NoInputNoOutput btmgmt ssp on # 启用Secure Simple Pairing - L2CAP套接字与特征配置:
- 将L2CAP套接字的
BT_SECURITY设为low - 为BLE特征添加加密访问要求
- 将L2CAP套接字的
问题现象
未通过bluetoothctl手动创建指定IO能力的Agent,当手机访问带加密要求的特征时,协议栈自动创建Agent处理配对。通过btmon日志可见,配对确认阶段板端返回错误:
Reason: Confirm value failed (0x04)
随后蓝牙连接被断开。同版本BlueZ在Ubuntu虚拟机环境下可正常完成配对。
排查与修复建议
结合环境对比结果,重点排查板载内核的蓝牙相关配置及驱动问题:
1. 内核SSP核心配置检查
Just Work模式属于Secure Simple Pairing(SSP)的子模式,必须确保内核开启以下配置:
CONFIG_BT_SSP:SSP核心支持,缺失会导致配对确认值计算逻辑异常CONFIG_BT_LE:BLE功能支持,需与btmgmt le on配置匹配CONFIG_BT_BREDR:若涉及经典蓝牙与BLE混合配对,需开启该选项
2. 蓝牙地址字节序验证
配对确认值的计算依赖蓝牙设备地址的字节序,部分ARM板卡的驱动可能存在地址字节序反转问题:
- 通过
hciconfig hci0查看板端蓝牙地址,对比控制器硬件规格书标注的实际地址字节序 - 检查内核蓝牙驱动中对地址的解析、传递逻辑,确保与手机端使用一致的字节序参与计算
3. 加密算法支持检查
确认值计算依赖AES-CBC加密,需确保内核开启:
CONFIG_CRYPTO_AES:AES加密算法核心支持CONFIG_CRYPTO_CBC:CBC模式支持,SSP配对流程需该模式完成加密运算
4. 蓝牙驱动兼容性排查
Linux 4.9的部分老旧蓝牙驱动(如hci_uart)存在SSP配对的兼容性bug:
- 尝试更新板载蓝牙驱动至适配Linux 4.9的最新稳定版本
- 对比Ubuntu虚拟机使用的蓝牙驱动版本,排查驱动实现差异
5. 手动Agent验证
跳过自动Agent创建逻辑,手动创建指定IO能力的Agent测试配对:
bluetoothctl agent NoInputNoOutput default-agent
若手动创建Agent后配对成功,说明自动Agent创建流程存在异常,需检查BlueZ在板端的编译配置(是否启用自动Agent相关模块)
内容的提问来源于stack exchange,提问作者ayezang
相关产品推荐
相关产品推荐

