Arch linux如何順暢連接藍牙設備

週末在家使用Arch linux打遊戲,需要連接 Airpdos Pro 或者藍牙音箱,時間長了,積累了一些經驗,特分享出來。

成熟的桌面環境如KDE、Gnome等,都有相關藍牙連接GUI程序,實際上,個別情況下會出問題,還是要返回到命令行界面處理,我以前寫過在Ubuntu上,無法連接藍牙耳機的處理方法。

本文主要是寫,在Arch + labwc自己定義環境下,如何保證始終能連上藍牙設備的問題。

1. 如何連接藍牙設備

我建議是直接一步到位,使用bluetoothctl命令行工具,可以說是Linux連接藍牙設備的兜底方案。 Arch 先安裝bluez包,這個軟件包提供藍牙協議棧, 而 bluez-utils 包提供 bluetoothctl 命令行工具,其他發行版類似,搜一下就知道。

藍牙涉及控制模式的問題:

1➜  ~ grep ControllerMode -B3 /etc/bluetooth/main.conf
2# Restricts all controllers to the specified transport. Default value
3# is "dual", i.e. both BR/EDR and LE enabled (when supported by the HW).
4# Possible values: "dual", "bredr", "le"
5#ControllerMode = dual

分別是雙向,傳統的和低功耗模式,我問AI告訴我的😊,如果你的設備比較新,默認的dual就沒有問題,實在不行嘗試更換其他模式,修改配置要重啓纔會生效。

看上面的輸出,我就是用默認的,實際我用AirPod Pro2,和 Aciton III 都可以正常連上。

以Action III爲例(AirPods以前寫過相關文章),演示過程如下。 首先,音箱接電源開啓後,長按藍牙匹配按鈕,聽到聲響後:

 1➜  ~ bluetoothctl
 2[bluetooth]# Agent registered
 3[bluetooth]# scan on
 4[bluetooth]# SetDiscoveryFilter success
 5[bluetooth]# Discovery started
 6[bluetooth]# [CHG] Controller E4:C7:67:3F:6A:0A Discovering: yes
 7[bluetooth]# [NEW] Device 77:FF:F0:47:08:D4 77-FF-F0-47-08-D4
 8[bluetooth]# [NEW] Device C8:C2:E6:CC:9B:54 ACTON III [LE]
 9[bluetooth]# [NEW] Device 7D:97:57:B3:41:3F 7D-97-57-B3-41-3F
10[bluetooth]# [NEW] Device 4B:40:4A:38:4F:92 4B-40-4A-38-4F-92
11[bluetooth]# [NEW] Device 50:5E:5C:95:0B:A4 ACTON III
12[bluetooth]# [NEW] Device 7A:02:E0:F1:DB:F6 7A-02-E0-F1-DB-F6
13[bluetooth]# connect [CHG] Device 7D:97:57:B3:41:3F RSSI: 0xffffffa4 (-92)
14[bluetooth]# connect 50:5E:5C:95:0B:A4
15Attempting to connect to 50:5E:5C:95:0B:A4
16[bluetooth]# [CHG] Device 7A:02:E0:F1:DB:F6 RSSI: 0xffffffa2 (-94)
17[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 Connected: yes
18[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 Modalias: bluetooth:v0094p0004d0100
19[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: 00000000-0000-0000-0099-aabbccddeeff
20[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: 00000000-deca-fade-deca-deafdecacaff
21[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
22[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
23[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
24[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: 00001200-0000-1000-8000-00805f9b34fb
25[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: 0000ff01-0000-1000-8000-00805f9b34ff
26[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: df21fe2c-2515-4fdb-8886-f12c4d67927c
27[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 UUIDs: fa349b5f-8050-0030-0010-00001bbb231d
28[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 ServicesResolved: yes
29[ACTON III]# [NEW] Device F9:83:83:EA:E2:D6 F9-83-83-EA-E2-D6
30[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 Bonded: yes
31[ACTON III]# [CHG] Device 50:5E:5C:95:0B:A4 Paired: yes
32[ACTON III]# [NEW] Endpoint /org/bluez/hci0/dev_50_5E_5C_95_0B_A4/sep1
33[ACTON III]# [NEW] Transport /org/bluez/hci0/dev_50_5E_5C_95_0B_A4/sep1/fd0
34[ACTON III]# [CHG] Transport /org/bluez/hci0/dev_50_5E_5C_95_0B_A4/sep1/fd0 Delay: 0x05dc (1500)
35[ACTON III]# Connection successful
36[ACTON III]# [CHG] Transport /org/bluez/hci0/dev_50_5E_5C_95_0B_A4/sep1/fd0 Volume: 0x0013 (19)
37[ACTON III]# [NEW] Device 72:FF:AE:FE:20:06 72-FF-AE-FE-20-06
38[ACTON III]#

仔細看上面的輸出,先 scan on 掃描藍牙設備,[bluetooth]# [NEW] Device 50:5E:5C:95:0B:A4 ACTON III 表明已正確掃到 mac地址。

理所當然,[bluetooth]# connect 50:5E:5C:95:0B:A4,接着的輸出顯示已經連接成功。

此外,還有 pair xxx, trust xxx,disconnet xxx,remove xxx等命令,xxx代表mac地址,看英文意思就能猜到是什麼意思,還是比較好記的,按需選擇就好。

絕大部分情況下,上述連接方式連接成功後,即可正常使用藍牙設備(聽到聲音,調整音量),我手頭的外接藍牙設備只有這些,基本遇到問題很少。

對於AirPods Pro2,要想在各種通透、隔音模式下輕便使用,估計是想多了, 反正我只用打遊戲聽個響,主要還是在iOS設備下使用。 真實打 CS2 的時候,友方說一講話就是很奇怪的電子顫抖音,我自己聽不到,未成能有機會體驗😅。

2. 遇到問題怎麼辦

上述步驟1,只是講正常連上的時候,那萬一遇到問題了呢?我目前的解決方式,羅列如下:

  • 連着連着突然沒聲音了怎麼辦?

此時,藍牙顯示還是連接狀態,但是沒有聲音,或者聲音斷續,這個問題在AirPods Pro2的確會遇到(Action III未遇到,買這個音箱的原因之一),不知道是我這個mini主機藍牙模塊發熱的緣故,還是其它詭異原因。 我一般是重啓再連,後來買獨立音箱了,就沒怎麼使用過AirPods Pro2連接電腦玩遊戲,帶耳機玩遊戲難受,而且電量還受限制。

重啓後,重新走一遍連接流程,可以直接 connect your_mac_address,至少Air Pods是可以的。

1sudo systemctl restart bluetooth.service
  • 重啓還是沒聲音怎麼辦

這個問題很關鍵,也是寫這個文章的核心動力,我可是自己摸索了十幾天知道的。可以說全中文網絡,沒有找到有相關分享,真沒吹牛。

問題產生背景是,在沒買音箱之前,我一直是用AirPdds連電腦聽聲音的,不知道從哪一天滾動升級 sudo pacman -Syu 後,整個套路不管用了,也就是說,我沒有方式能聽到電腦的聲音。

後果很嚴重,打遊戲聽不到聲音,長期被虐,我以爲mini主機的藍牙設備壞了,當時剛好雙11快到了,所以順帶買個音箱試試看(還有個原因是想外放聽音樂,音箱品質還可以)。

在音箱未到期間,我一直在和這個問題搏鬥。各種招式都試過了,就是聽不到響。 直到有一天,我發現,Sinks列表中,默認選擇中的不是我的AirPods Pro2(設備前面的星號表示選中,當前的聲音輸出設備,該狀況已無法重現)。

會不會就是這個問題呢?我有充分理由懷疑這個,以前正常使用的時候,瞄到過一眼。

 1➜  ~ wpctl status
 2PipeWire 'pipewire-0' [1.2.6, mephisto@minipc, cookie:3413408580]
 3 └─ Clients:
 4        32. WirePlumber                         [1.2.6, mephisto@minipc, pid:779]
 5        33. pipewire                            [1.2.6, mephisto@minipc, pid:780]
 6        46. WirePlumber [export]                [1.2.6, mephisto@minipc, pid:779]
 7        81. xdg-desktop-portal                  [1.2.6, mephisto@minipc, pid:953]
 8        82. waybar                              [1.2.6, mephisto@minipc, pid:900]
 9        83. wpctl                               [1.2.6, mephisto@minipc, pid:4354]
10
11Audio
12 ├─ Devices:
13 │      47. Rembrandt Radeon High Definition Audio Controller [alsa]
14 │      48. Family 17h/19h HD Audio Controller  [alsa]
1516 ├─ Sinks:
17 │      52. Rembrandt Radeon High Definition Audio Controller HDMI / DisplayPort 4 Output [vol: 1.00]
18 │      53. Rembrandt Radeon High Definition Audio Controller HDMI / DisplayPort 3 Output [vol: 1.00]
19 │      54. Rembrandt Radeon High Definition Audio Controller HDMI / DisplayPort 2 Output [vol: 0.70]
20 │      55. Rembrandt Radeon High Definition Audio Controller HDMI / DisplayPort 1 Output [vol: 1.00]
21 │  *   56. Family 17h/19h HD Audio Controller Line Output [vol: 0.50]
2223 ├─ Sources:
24 │      57. Family 17h/19h HD Audio Controller Front Stereo Microphone [vol: 1.00]
25 │  *   58. Family 17h/19h HD Audio Controller Digital Microphone [vol: 0.49]
2627 ├─ Filters:
2829 └─ Streams:
30
31Video
32 ├─ Devices:
3334 ├─ Sinks:
3536 ├─ Sources:
3738 ├─ Filters:
3940 └─ Streams:
41
42Settings
43 └─ Default Configured Devices:
44         0. Audio/Sink    bluez_output.50_5E_5C_95_0B_A4.1

真是這個小細節拯救了我,這可能也是Linux用戶的煩惱和快樂吧。

找到線索後,問題很快就解決了。

1pactl set-default-sink bluez_output.C0_95_6D_C0_A3_92.1

如果你遇到類似問題,上面一條命令即可救人於水火,意思就是設置你的默認輸出設備,很離譜,Linux不能智能判定該使用那個設備輸出!

當我分別設置耳機和音箱都爲默認輸出設備後,再也沒有遇到聽不到聲響的問題了。

兩個都設置爲默認輸出,不會有問題嗎?不會,同一時間,正常人只會用一個設備聽聲響,不會衝突,大佬有特殊用法除外。

不明白上面的 Sinks、Sources是什麼意思的,可以問問AI,我就是這麼做的,管用。

還有個問題,bluez_output.C0_95_6D_C0_A3_92.1 這個地址咋來的?請看下面的操作。

 1➜  ~ wpctl status
 2PipeWire 'pipewire-0' [1.2.6, mephisto@minipc, cookie:3413408580]
 3 └─ Clients:
 4        32. WirePlumber                         [1.2.6, mephisto@minipc, pid:779]
 5        33. pipewire                            [1.2.6, mephisto@minipc, pid:780]
 6        46. WirePlumber [export]                [1.2.6, mephisto@minipc, pid:779]
 7        81. xdg-desktop-portal                  [1.2.6, mephisto@minipc, pid:953]
 8        82. waybar                              [1.2.6, mephisto@minipc, pid:900]
 9        89. wpctl                               [1.2.6, mephisto@minipc, pid:4651]
10
11Audio
12 ├─ Devices:
13 │      47. Rembrandt Radeon High Definition Audio Controller [alsa]
14 │      48. Family 17h/19h HD Audio Controller  [alsa]
15 │      83. ACTON III                           [bluez5]
1617 ├─ Sinks:
18 │      52. Rembrandt Radeon High Definition Audio Controller HDMI / DisplayPort 4 Output [vol: 1.00]
19 │      53. Rembrandt Radeon High Definition Audio Controller HDMI / DisplayPort 3 Output [vol: 1.00]
20 │      54. Rembrandt Radeon High Definition Audio Controller HDMI / DisplayPort 2 Output [vol: 0.70]
21 │      55. Rembrandt Radeon High Definition Audio Controller HDMI / DisplayPort 1 Output [vol: 1.00]
22 │      56. Family 17h/19h HD Audio Controller Line Output [vol: 0.50]
23 │  *   84. ACTON III                           [vol: 0.15]
2425 ├─ Sources:
26 │      57. Family 17h/19h HD Audio Controller Front Stereo Microphone [vol: 1.00]
27 │  *   58. Family 17h/19h HD Audio Controller Digital Microphone [vol: 0.49]
2829 ├─ Filters:
3031 └─ Streams:
32
33Video
34 ├─ Devices:
3536 ├─ Sinks:
3738 ├─ Sources:
3940 ├─ Filters:
4142 └─ Streams:
43
44Settings
45 └─ Default Configured Devices:
46         0. Audio/Sink    bluez_output.50_5E_5C_95_0B_A4.1
47➜  ~ wpctl inspect 84
48id 84, type PipeWire:Interface:Node
49    api.bluez5.address = "50:5E:5C:95:0B:A4"
50    api.bluez5.codec = "sbc"
51    api.bluez5.profile = "a2dp-sink"
52    api.bluez5.transport = ""
53    bluez5.loopback = "false"
54    card.profile.device = "1"
55  * client.id = "46"
56    clock.quantum-limit = "8192"
57    device.api = "bluez5"
58  * device.id = "83"
59    device.routes = "1"
60  * factory.id = "12"
61    factory.name = "api.bluez5.a2dp.sink"
62    library.name = "audioconvert/libspa-audioconvert"
63  * media.class = "Audio/Sink"
64    media.name = "ACTON III"
65  * node.description = "ACTON III"
66    node.driver = "true"
67    node.loop.name = "data-loop.0"
68  * node.name = "bluez_output.50_5E_5C_95_0B_A4.1"
69    node.pause-on-idle = "false"
70  * object.serial = "97"
71    port.group = "stream.0"
72  * priority.driver = "1010"
73  * priority.session = "1010"
74    session.suspend-timeout-seconds = "0"

wpctl inspect 84node.name = "bluez_output.50_5E_5C_95_0B_A4.1"來的,84 是 sinks 設備的id,會動態變化,node.name一般不變。

仔細看上面輸出的結尾部分,有個Default Configured Devices,表明置是成功的。

wpctl是什麼?是wireplumber的命令行工具。

wireplumber 是什麼?WirePlumber 是一個用於管理 Linux 系統中音頻和視頻流的會話管理器。它取代了之前的 PulseAudio 會話管理器,主要負責處理多媒體流的路由和策略,感覺有點像互聯網企業中網關的概念。

現在的Linux都使用PireWire,PipeWire是一個Linux系統上的用來處理音視頻的底層多媒體框架。PipeWire開發出來的目的是爲了替代PulseAudio,功能包括支持容器化應用的音頻輸出,和應對專業音頻場景。 可以簡單理解爲,二者配套使用,名字都帶個wire也就算是正常的。

  • 經過上面的折騰後,我還是聽不到響怎麼辦?

一般來說,極少遇到。遇到了,得保證設備能連上,sinks 裏面選中的設備是對的。 在 bluetoothctl 命令行中,先disconnect xxx, 再remove xxx,然後重啓bluetooth服務,重複連一次(ActionIII就會有類似機制,長時間不使用,會掉線,重連後即可)。

最後,你這麼折騰,時間不要錢嗎?我人窮,時間基本不值錢,能學到知識啊😅。躺雷急先鋒,別人就不用挨炸了呀!真的有人寫郵件感謝我的。總有人第一個喫螃蟹,況且真的能解決打遊戲沒有聲音的問題。 你爲什麼不用Windows打遊戲呢?我不喜歡Windows,喜歡命令行的感覺,除了內核,系統環境全部定製的,就好像很多人喜歡玩改裝車一樣,自己打造的工具纔是最順手的。

你這麼雷鋒,犧牲週末時間寫文章,有什麼目的嗎?寫文章擴大影響力,廣告能搞錢(目前還沒搞到大錢,賺夠錢就退休,不卷其它牛馬,回家到處玩),日積月累,順帶記錄學習知識,昇華一下,豐富了中文世界,還是有用的...

你的文章有多錯別字,語句不是很順通。證明是手敲的,我有時候很着急,犧牲週末時間很辛苦的,着急去幹別的事情。

最後修改於: Sunday, November 24, 2024

相關文章:

翻譯: