在 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 并不能真正切换系统全局默认控制器
  • 确认设备绑定情况是判断问题根源的关键一步
  • 禁用内置蓝牙控制器是最直接的彻底方案

Leave a Reply

Your email address will not be published. Required fields are marked *