两台树莓派4通过bluetoothctl配对成功后蓝牙连接失败问题求助
我正在做一个项目,需要将一台树莓派设为BLE GATT服务器,另一台设为客户端。第一步我先尝试通过命令行测试常规蓝牙连接,但连接失败,暂时找不到故障原因。
两台设备均为树莓派4 Model B:第一台运行Raspbian Buster系统,内核版本为Linux raspberrypi 5.10.17-v7l+;第二台运行Ubuntu 20.04 Server系统,内核版本为Linux ubuntu 5.4.0-1036-raspi。
我使用bluetoothctl工具配置,先在从设备端执行agent on、discoverable on、pairable on开启可发现可配对状态,再在主设备端执行scan on扫描设备。主设备成功扫描到从设备的MAC地址后,我执行pair DC:A6:32:2C:D4:90发起配对。配对看似成功,但全程没有弹出密码输入提示:
从设备树莓派输出日志如下:
Changing discoverable on succeeded [CHG] Controller DC:A6:32:2C:D4:90 Discoverable: yes [NEW] Device DC:A6:32:FD:47:E0 ubuntu [CHG] Device DC:A6:32:FD:47:E0 Modalias: usb:v1D6Bp0246d0535 [CHG] Device DC:A6:32:FD:47:E0 UUIDs: 0000110c-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:FD:47:E0 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:FD:47:E0 UUIDs: 00001200-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:FD:47:E0 UUIDs: 00001800-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:FD:47:E0 UUIDs: 00001801-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:FD:47:E0 ServicesResolved: yes [CHG] Device DC:A6:32:FD:47:E0 Paired: yes [CHG] Device DC:A6:32:FD:47:E0 ServicesResolved: no [CHG] Device DC:A6:32:FD:47:E0 Connected: no
主设备树莓派输出日志如下:
Attempting to pair with DC:A6:32:2C:D4:90 [CHG] Device DC:A6:32:2C:D4:90 Connected: yes [CHG] Device DC:A6:32:2C:D4:90 UUIDs: 0000110c-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:2C:D4:90 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:2C:D4:90 UUIDs: 0000112d-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:2C:D4:90 UUIDs: 00001200-0000-1000-8000-00805f9b34fb [CHG] Device DC:A6:32:2C:D4:90 ServicesResolved: yes [CHG] Device DC:A6:32:2C:D4:90 Paired: yes Pairing successful [CHG] Device DC:A6:32:2C:D4:90 ServicesResolved: no [CHG] Device DC:A6:32:2C:D4:90 Connected: no
从输出可以看到,另一台运行Ubuntu系统的树莓派设备名为ubuntu,MAC地址为DC:A6:32:FD:47:E0。配对过程中连接仅能维持几秒就会自动断开,我后续在主设备端执行connect DC:A6:32:2C:D4:90主动发起连接,同样出现相同的断连问题,报错信息如下:
[CHG] Device DC:A6:32:2C:D4:90 Connected: yes [CHG] Device DC:A6:32:2C:D4:90 ServicesResolved: yes Failed to connect: org.bluez.Error.NotAvailable [CHG] Device DC:A6:32:2C:D4:90 ServicesResolved: no [CHG] Device DC:A6:32:2C:D4:90 Connected: no
我尝试过使用sudo运行bluetoothctl、将对方设备添加为信任设备,都没有解决问题。
补充:我后来在两台设备上都执行了default-agent命令,这次配对时弹出了PIN码确认提示,但确认后连接依然失败。
你遇到的是经典蓝牙和BLE混用的逻辑问题,当前测试的是经典蓝牙连接流程,但你的目标是BLE GATT通信,两者的连接逻辑完全独立,经典蓝牙连接断连不影响BLE功能使用,具体修复步骤如下:
- 第一步:清理旧配对缓存
两台设备分别执行bluetoothctl进入交互界面,执行remove <对方MAC地址>删除之前的配对记录,避免旧缓存干扰后续操作,执行完后输入quit退出。 - 第二步:修改蓝牙配置优先使用BLE模式
两台设备都编辑/etc/bluetooth/main.conf文件,修改以下参数:
修改完成后执行AutoEnable=true ControllerMode = le # 只启用BLE模式,屏蔽经典蓝牙逻辑干扰 Privacy = off # 关闭BLE地址随机化,方便固定MAC扫描连接sudo systemctl restart bluetooth重启蓝牙服务生效。 - 第三步:直接走BLE GATT连接流程,跳过经典蓝牙配对步骤
- 在作为GATT服务器的设备上进入
bluetoothctl,执行advertise on开启BLE广播 - 在客户端设备上进入
bluetoothctl,执行scan le只扫描BLE设备,确认能扫到服务器的MAC地址后执行scan off停止扫描 - 客户端直接执行
gatt.connect <服务器MAC地址>建立BLE GATT连接,不需要提前执行pair或普通connect命令
- 在作为GATT服务器的设备上进入
- 关于报错
org.bluez.Error.NotAvailable的说明:
这个报错是经典蓝牙连接触发的,原因是你两端都没有注册任何经典蓝牙服务(比如音频、串口Profile),bluez检测到没有可用服务就主动断开了连接,完全不影响BLE GATT通信,不需要针对这个报错额外处理。
内容的提问来源于stack exchange,提问作者LowRez

