我尝试将我的 Ubuntu 23.10 与 LG C2 电视连接起来,然后将声音从 LG 输出到 Ubuntu;同样的方法也可以在我的 iPhone 上正常使用,然后 iPhone 会通过我连接的 Ubuntu 扬声器播放一些音乐。我使用bluetoothctl
:
devices Paired
Device 20:28:BC:81:F8:D9 [LG] webOS TV OLED55C22LB
connect 20:28:BC:81:F8:D9
Attempting to connect to 20:28:BC:81:F8:D9
[CHG] Device 20:28:BC:81:F8:D9 Connected: yes
Connection successful
[CHG] Device 20:28:BC:81:F8:D9 ServicesResolved: yes
但我在 LG 的“蓝牙设备”菜单中看不到我的 Ubuntu 作为扬声器。
我应该怎么做才能解决这个问题?
实际上,为了让 iPhone 输出音频到蓝牙,我必须首先指定蓝牙连接的目标(即计算机)是一个扬声器。
附言:我使用 pipewire、pipewire-pulse 和 wireplumber,效果很好。
info 20:28:BC:81:F8:D9
Device 20:28:BC:81:F8:D9 (public)
Name: LG TV[[LG] webOS TV OLED55C22LB
Alias: LG TV[[LG] webOS TV OLED55C22LB
Class: 0x0008243c (533564)
Icon: audio-card
Paired: yes
Bonded: yes
Trusted: yes
Blocked: no
Connected: yes
LegacyPairing: no
UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
UUID: Audio Sink (0000110b-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
UUID: PnP Information (00001200-0000-1000-8000-00805f9b34fb)
UUID: Generic Access Profile (00001800-0000-1000-8000-00805f9b34fb)
UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
UUID: LG Electronics (0000feb9-0000-1000-8000-00805f9b34fb)
Modalias: bluetooth:v0046p1200d1436
ManufacturerData Key: 0x00c4 (196)
ManufacturerData Value:
02 34 15 13 17 fd 80 .4.....
答案1
我们可以手动设置设备类别:
将以下内容粘贴到
/etc/systemd/system/bluetooth-class-askubuntu-1504191-1004020.service
:[Unit] Description=Set Bluetooth device class to be a speaker After=bluetooth.service [Service] # bluetooth.service reports ready before it sets the wrong class, so wait. ExecStartPre=/bin/sleep 5 ExecStart=/bin/hciconfig hci0 class 0x240414 Type=oneshot [Install] WantedBy=bluetooth.service
sudo systemctl enable --now bluetooth-class-askubuntu-1504191-1004020.service
要是我们检查新的设备类别,我们将看到这意味着它的服务类别是渲染和音频,它的主要设备类别是音频/视频,它的次要服务类别是扬声器。我从我的 Logitech 蓝牙扬声器中提取了这些数字,因此您的计算机会假装是相同的。
正常设置是0x7C010C
,这意味着其服务类别为渲染、捕获、对象传输、音频和电话,其主要设备类别为计算机,其次要服务类别为笔记本电脑。您的 LG 电视将跳过计算机类的设备,仅显示扬声器类的设备:
实际上,大多数蓝牙客户端会分两个步骤扫描周围环境:首先,它们会查找周围的所有蓝牙设备,然后找出它们的“类别”。您可以在 Linux 上使用 hcitool scan 命令执行此操作。然后,它们使用 SDP 检查给定类别中的设备是否提供它们想要的服务类型。
这意味着如果主机上运行着特定的服务,比如“PAN”或“OBEX Obect Push”等,则需要正确设置 hcid.conf 的“class”参数:一般来说,寻找“网络接入点”等服务的设备只会在其主要服务类别中包含“网络”的设备上扫描此服务。
设置不起作用Class = 0x240414
,/etc/bluetooth/main.conf
因为它没有设置所有位。设备在关注的程度上有所不同。Android 根本不关心,电视可能需要正确设置部分或全部位。当我编辑该文件时,只有主要/次要部分得到了0x0414
尊重,这仅仅是在我禁用了 bluetooth.service 命令行参数中的所有配置文件(它们也会将自己的位添加到类中)之后。bluetoothd
不支持设置服务类0x24
,因为它struct mgmt_cp_set_dev_class
不包含该变量。