Wayland合成器下快速连接蓝牙设备

如果你使用 Wayland Compositor(比如 Labwc、Sway、Niri 等)打造的轻量 Linux 桌面环境,在日常使用中,总会碰到连接蓝牙耳机或者蓝牙音箱的问题。

本文主要介绍在 Arch + Labwc 环境下,如何快速连接蓝牙耳机或者音箱(下文已音箱为例)。

1. 通过 Waybar 触发脚本连接

这是我目前在使用的方式,在此之前,我是直接使用命令行连接的:

1➜  ~ abbr | grep acton3
2abbr -a -- acton3 'bluetoothctl connect 50:5E:5C:95:0B:A4'
3abbr -a -- dis-acton3 'bluetoothctl disconnect 50:5E:5C:95:0B:A4'

看上面 Fish 的 abbr,所谓 abbr 是 fish 内置缩写(abbreviation)工具,区别于传统 alias:输入缩写按空格 / 回车会实时展开完整命令,可编辑后再执行,历史记录存完整命令,可以简单理解为 alias 变种。

上面的配置意思是:输入 acton3 连接蓝牙音箱 ACTON III,反之 dis-acton3 为断开连接。看起来简单朴实,没什么毛病。

我以前也的确是这么操作的,随着时间的推移,慢慢就觉得不对劲:

  • 每次需要先打开终端;
  • 然后还要输入命令;
  • 要记住这个 alias 缩写,每当你长假归来打开电脑,你可能会忘记别名。

由于上述操作链路过长,有记忆负担,最终放弃使用。

我想到的替换方案是,使用 waybar 的蓝牙模块,触发脚本自动连接。

示例配置如下:

 1"bluetooth": {
 2    "format": "{status}",
 3	  "format-on": "{status}|none",
 4    "format-off": "{status}",
 5    "format-disabled": "󰂲{status}",
 6    "format-connected": "{device_alias}",
 7    "format-connected-battery": " {device_alias} {device_battery_percentage}%",
 8    // "format-device-preference": [ "device1", "device2" ], // preference list deciding the displayed device
 9    "tooltip-format": "{controller_alias}\t{controller_address}\n{num_connections} connected",
10    "tooltip-format-connected": "{controller_alias}\t{controller_address}\n{num_connections} connected\n{device_enumerate}",
11    "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
12    "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%",
13    "on-click": "~/.config/waybar/scripts/bluetooth-toggle.sh"
14},

在 Waybar 中,on-click 属性用于为状态栏模块添加鼠标点击交互事件。

事件属性触发条件
on-click鼠标 左键 单击
on-click-release释放鼠标 左键
on-click-right鼠标 右键 单击
on-click-middle鼠标 中键(滚轮)单击
on-double-click鼠标 左键 双击
on-triple-click鼠标 左键 三击
on-scroll-up鼠标滚轮 向上 滚动
on-scroll-down鼠标滚轮 向下 滚动

从上述配置可看出,我选的单击左键触发脚本连接蓝牙音箱。

脚本示例如下:

 1➜  ~ cat ~/.config/waybar/scripts/bluetooth-toggle.sh
 2#!/bin/bash
 3BLUETOOTH_MAC="50:5E:5C:95:0B:A4"
 4WAIT=0.2
 5
 6notify() {
 7    notify-send -i audio-speakers "$1" "$2"
 8}
 9
10# 确保蓝牙已开启
11if ! bluetoothctl show | grep -q "Powered: yes"; then
12    notify "蓝牙未开启" "正在开启..."
13    bluetoothctl power on >/dev/null 2>&1
14    sleep $WAIT
15fi
16
17# 获取当前连接状态
18info=$(bluetoothctl info "$BLUETOOTH_MAC")
19
20if echo "$info" | grep -q "Connected: yes"; then
21    # 已连接 → 断开
22    bluetoothctl disconnect "$BLUETOOTH_MAC" >/dev/null 2>&1
23    notify "已断开⏹️" "$BLUETOOTH_MAC"
24else
25    # 尝试连接
26    bluetoothctl connect "$BLUETOOTH_MAC" >/dev/null 2>&1
27    sleep $WAIT
28
29    # 验证结果
30    if bluetoothctl info "$BLUETOOTH_MAC" | grep -q "Connected: yes"; then
31        notify "连接成功✅" "$BLUETOOTH_MAC"
32    else
33        notify "连接失败❌" "蓝牙设备未开机或不在附近"
34        exit 1
35    fi
36fi

逻辑非常简单,点一下连接,再点一下断开,音箱没通电或者没开机等,弹出提示。

效果截图

bluetooth all

细心的朋友可能会问,这样不是只能连接一个蓝牙设备吗?是的,主要在家里只用连接音箱,很少需要去连接别的设备,所以对我来说够用,简单直接。

那如果要连接多设备呢?当然也可以回退到命令行。

还可以用下面的方式。

2. 使用 orbit 这个 GUI 工具管理蓝牙设备

其实 Linux 管理蓝牙设备的 GUI 工具也有好多,比如 blueman、blueberry 等,都特么丑得哭,完全看不上眼。

我自己搜索了下,orbit 是最近几个月才冒出来的工具,Rust 写的,UI 用的 GTK4,整个界面看其还挺美观协调。

示例图片:

orbit

它不光能管理蓝牙,还能管理 Wi-Fi 和 VPN,也可以和 waybar 结合使用,还可以

1orbit toggle --tab [wifi|bluetooth|vpn]

这样聚焦到某个子 tab,看起来这个作者是很懂非完整 DE 痛点的。

完整的说明使用方式请看 https://github.com/LifeOfATitan/orbit 的 README 文件,懒得写了,简单易用,还是值得推荐的。

要说不足,那就是使用要多启动一个进程😅(话说,没有进程怎么提供功能?bluetoothctl 还要 bluetoothd 呢?没毛病啊!)

1systemctl --user enable --now orbit

说这么多,你为什么不用?我用上面 1 的方式就足够了,简单明了,wifi 等我都用 waybar 显示,tui 管理的。如果你需要[wifi|bluetooth|vpn]三合一的工具,为什么不用呢?

综上所术,如果你想简单,不连接多设备,就用 waybar 的蓝牙模块配合自定义脚本;如果想同时管理[wifi|bluetooth|vpn],或者更喜欢 GUI 操作,使用 Orbit 也是不错的,按需取舍即可。

最后修改于: Wednesday, June 24, 2026
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相关文章:

翻译: