在 Linux 系统上,如果同时存在内置蓝牙控制器和 USB 蓝牙控制器,蓝牙设备管理会变得复杂,尤其在涉及自动断开设备、切换控制器等需求时,常会遇到意想不到的情况。此文记录一次针对蓝牙手写板的调试过程,作为参考。
背景
需要使用脚本自动断开蓝牙设备(例如手写板),脚本中使用 bluetoothctl info 命令配合 expect 自动化交互流程。然而,在接入 USB 蓝牙控制器后,系统默认仍然使用内置控制器,导致脚本无法正常识别目标设备。
初步现象
执行 bluetoothctl info 时,输出的设备信息中,Device 行并不包含 (random) 或 (public) 标记。例如:
Device AA:BB:CC:DD:EE:FF Generic Pen Tablet
Name: Generic Pen Tablet
Connected: yes
脚本中原本使用的正则表达式如下:
regexp {Device ([A-F0-9:]+) \(random\)} $output match mac
由于缺少括号标记,这条正则无法成功提取 MAC 地址。
修改正则
修订后的正则表达式改为不依赖括号标记,仅提取 MAC 地址:
regexp {Device ([A-F0-9:]+)} $output match mac
这样可兼容所有情况,无论 Device 行后面是否包含括号信息。
控制器冲突问题
通过以下命令查看系统所有蓝牙控制器:
bluetoothctl list
示例输出:
Controller 11:22:33:44:55:66 HostDevice [default]
Controller 77:88:99:AA:BB:CC HostDevice
可见,系统会默认将内置蓝牙(如 hci0)设置为 [default],即使尝试使用 bluetoothctl select 切换控制器,系统内核层面仍会优先使用内置蓝牙,无法真正切换默认控制器。
验证绑定关系
进一步使用以下命令确认目标设备绑定在哪个控制器上:
find /var/lib/bluetooth -type d -name "AA:BB:CC:DD:EE:FF"
输出结果:
/var/lib/bluetooth/77:88:99:AA:BB:CC/AA:BB:CC:DD:EE:FF
说明该设备实际绑定在 USB 蓝牙控制器(MAC: 77:88:99:AA:BB:CC)下。
潜在解决方案
若希望彻底解决控制器冲突,可通过以下方式暂时禁用内置蓝牙控制器,让系统仅识别 USB 蓝牙控制器:
echo "blacklist btusb" | sudo tee /etc/modprobe.d/blacklist-btusb.conf
sudo update-initramfs -u
sudo reboot
如需恢复内置蓝牙,删除对应配置文件后更新并重启即可:
sudo rm /etc/modprobe.d/blacklist-btusb.conf
sudo update-initramfs -u
sudo reboot
实际结果
最终,尽管完成了正则修改并确认了绑定关系,但由于多控制器环境复杂,切换默认控制器未能成功。不过,以上调试过程依然具有一定参考价值,可为日后解决类似问题提供思路。
总结
- 蓝牙多控制器环境下,系统默认控制器会影响设备管理
bluetoothctl select并不能真正切换系统全局默认控制器- 确认设备绑定情况是判断问题根源的关键一步
- 禁用内置蓝牙控制器是最直接的彻底方案