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
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相關文章:

翻譯: