Bluetooth (Русский)
Bluetooth — стандарт для беспроводного соединения малой дальности сотовых телефонов, компьютеров и других электронных устройств. В Linux канонической реализацией стека протоколов Bluetooth является BlueZ.
Установка
- Установите пакет bluez, который предоставляет стек протоколов Bluetooth.
- Установите bluez-utils, предоставляющий утилиту
bluetoothctl
. Также можно установить bluez-deprecated-tools, который содержит устаревшие инструменты BlueZ. - Универсальный драйвер Bluetooth находится в модуле ядра
btusb
. Проверьте, что он загружен. Если нет, то загрузите его вручную. - Запустите и включите службу
bluetooth.service
.
- По умолчанию демон Bluetooth разрешит использовать устройства bnep0 только пользователям, входящим в системную группу
lp
. Добавьте себя в эту группу, если вы собираетесь использовать Bluetooth. Вы можете изменить требуемую группу в файле/etc/dbus-1/system.d/bluetooth.conf
. - Некоторые адаптеры Bluetooth встроены в платы Wi-Fi (например, Intel Centrino[устаревшая ссылка 2023-05-06 ⓘ]). В этих случаях необходимо, чтобы сперва была включена плата Wi-Fi (обычно при помощи сочетания клавиш на ноутбуке), после чего ядро сможет увидеть адаптер Bluetooth.
- Некоторые карты Bluetooth (например, Broadcom) конфликтуют с сетевыми адаптерами. В этом случае вам необходимо удостовериться, что устройство Bluetooth подключается до начала загрузки сетевых служб.
- Некоторые утилиты вроде hcitool и hciconfig объявлены устаревшими и больше не поставляются в пакете bluez-utils. Так как они не получают обновления, рекомендуется избегать их использования. Если они вам всё ещё нужны, установите bluez-deprecated-tools. Подробнее смотрите FS#53110 и Bluez mailing list.
- Начиная с этого коммита, bluez-obex и bluez-mesh отделены от пакета bluez. Поэтому, если вы планируете передавать файлы по Bluetooth, также установите bluez-obex.
Фронтенды
Консольные
- bluetoothctl — Сопряжение устройств через командную строку является одним из самых простых и надёжных вариантов.
- bluetuith — TUI-менеджер bluetooth для облегчения сопряжения и управления устройствами/адаптерами, с передачей файлов OBEX и поддержкой мыши.
echo -e "команда1\nкоманда2\n" | bluetoothctl
или bluetoothctl -- команда
.Графические
Следующие пакеты позволяют настраивать Bluetooth с помощью графического интерфейса.
- GNOME Bluetooth — Инструмент Bluetooth в GNOME.
- gnome-bluetooth-3.0 предоставляет бэкенд (gnome-bluetooth — старая версия)
- gnome-shell предоставляет апплет мониторинга статуса
- gnome-control-center предоставляет графический интерфейс настройки, для открытия которого можно ввести Bluetooth в поиске или выполнить команду
gnome-control-center bluetooth
. - Также можно использовать команду
bluetooth-sendto
напрямую для отправки файлов на удалённое устройство. - nautilus-bluetoothAUR добавляет пункт отправки по Bluetooth в контекстное меню файлов
- Для получения файлов откройте панель настроек Bluetooth; принимать файлы можно только при открытых настройках.
- Для добавления пункта отправки файла по Bluetooth в контекстном меню Thunar смотрите инструкции здесь (укажите команду
bluetooth-sendto %F
).
- Bluedevil — Инструмент Bluetooth в KDE. Если нет иконки в Dolphin и системном трее, включите её в настройках трея или добавьте виджет. Настроить Bluedevel и обнаружить устройства Bluetooth можно кликом по иконке. Интерфейс также доступен через настройки KDE.
- Blueberry — Инструмент в Linux Mint, надстройка над GNOME Bluetooth, работает во всех средах рабочего стола. Blueberry не поддерживает приём файлов через Obex Object Push.
- Blueman — Полнофункциональный менеджер Bluetooth.
- ObexFTP — Инструмент для обмена файлами с устройствами через OBEX.
- Overskride — Простой, но мощный клиент bluetooth.
Сопряжение
Этот раздел описывает прямую настройку bluez5 через утилиту командной строки bluetoothctl. Это необязательно, если вы используете какой-нибудь другой инструмент (например, GNOME Bluetooth).
Точная процедура зависит от особенностей конкретного устройства; эта инструкция описывает сопряжение с устройством при помощи bluetoothctl
лишь в общих чертах.
Запустите интерактивную команду bluetoothctl
. После этого можно ввести help
для получения списка доступных команд.
- (необязательно) Выберите контроллер по умолчанию командой
select MAC-адрес
. - (необязательно) Включите питание контроллера, введя
power on
, если он выключен. По умолчанию он включен; смотрите #Состояние питания адаптера по умолчанию. - Введите
devices
, чтобы увидеть MAC-адрес устройства для сопряжения. - Войдите в режим обнаружения устройств при помощи команды
scan on
, если нужного вам устройства нет в списке. - Включите агент при помощи
agent on
или выберите конкретный агент: если вы введётеagent
и дважды нажмёте Tab, будет отображён список доступных вариантов. Агент Bluetooth управляет кодом сопряжения.default-agent
должен подойти в большинстве случаев. [1] - Введите
pair MAC-адрес
, чтобы осуществить сопряжение (работает автодополнение по tab). - При использовании устройства без PIN, возможно, потребуется подтверждение, прежде чем оно сможет успешно переподключиться. Для этого введите
trust MAC-адрес
. - Наконец, используйте
connect MAC-адрес
для установки соединения.
Сеанс будет выглядеть примерно так:
$ bluetoothctl
[NEW] Controller 00:10:20:30:40:50 hostname [default] [bluetooth]# agent KeyboardOnly Agent registered [bluetooth]# default-agent Default agent request successful [bluetooth]# power on Changing power on succeeded [CHG] Controller 00:10:20:30:40:50 Powered: yes [bluetooth]# scan on Discovery started [CHG] Controller 00:10:20:30:40:50 Discovering: yes [NEW] Device 00:12:34:56:78:90 device name [CHG] Device 00:12:34:56:78:90 LegacyPairing: yes [bluetooth]# pair 00:12:34:56:78:90 Attempting to pair with 00:12:34:56:78:90 [CHG] Device 00:12:34:56:78:90 Connected: yes [CHG] Device 00:12:34:56:78:90 Connected: no [CHG] Device 00:12:34:56:78:90 Connected: yes Request PIN code [agent] Enter PIN code: 1234 [CHG] Device 00:12:34:56:78:90 Paired: yes Pairing successful [CHG] Device 00:12:34:56:78:90 Connected: no [bluetooth]# connect 00:12:34:56:78:90 Attempting to connect to 00:12:34:56:78:90 [CHG] Device 00:12:34:56:78:90 Connected: yes Connection successful
Сопряжение при двойной загрузке
Чтобы сопряжение работало во всех установленных операционных системах, необходимо изменить ключи сопряжения так, чтобы они были одинаковыми во всех системах.
Ниже описан ручной способ изменения. Для автоматизации можно использовать bt-dualboot.
Подготовка
Чтобы сделать это, сперва сделайте сопряжение в вашем Arch Linux. Потом перезагрузитесь в другую ОС и сделайте сопряжение там. Теперь нужно извлечь ключи сопряжения, но сперва отключите Bluetooth-устройства, чтобы не было ненужных попыток подключения до завершения настройки.
Для Windows
Извлечение ключей в Windows
Загрузитесь в Windows.
Запись реестра, содержащая ключи, доступна только пользователю SYSTEM, в которого нельзя выполнить вход. Поэтому понадобится утилита PsExec с официального сайта Windows Sysinternals для запуска regedit.exe
от имени SYSTEM
.
Скачайте архив PsTools и извлеките из него файл PsExec64.exe
.
Запустите командную строку от имени администратора, перейдите в папку с извлечённым exe-файлом и запустите редактор реестра:
.\PsExec64.exe -s -i regedit.exe
В редакторе перейдите к этому разделу:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys
В нём содержатся подразделы для каждого Bluetooth-адаптера, названные по их MAC-адресам. Если их несколько и вы не знаете, какой из них вам нужен, смотрите эту инструкцию для выяснения MAC-адреса нужного вам Bluetooth-адаптера.
Разделы Bluetooth-адаптеров содержат параметры для каждого сопряжённого устройства, причём имена этих параметров являются MAC-адресами. Также могут присутствовать подразделы, названные по MAC-адресам сопряжённых устройств, и каждый такой подраздел будет содержать ключи с именами вроде LTK
или IRK
. Эти подразделы (если они есть) соответствуют устройствам Bluetooth 5.1. Если для нужного вам устройства такой подраздел есть, это устройство Bluetooth 5.1. Если подраздела нет, а есть только параметр, это не устройство Bluetooth 5.1.
Нажмите правой кнопкой мыши на раздел адаптера и экспортируйте его в файл .reg. Это текстовый файл, из которого можно копировать ключи. Как описано выше, он содержит параметры с ключами сопряжения для устройств без Bluetooth 5.1 и подразделы с ключами сопряжения (и другой информацией) для устройств Bluetooth 5.1. Сделайте этот файл доступным для вашей установки Linux и перезагрузитесь в него.
Если нужное устройство не является устройством Bluetooth 5.1, перейдите к разделу #Завершение. Если устройство является устройством Bluetooth 5.1, нужно внести некоторые изменения в ключи сопряжения и связанную с ними информацию, как описано в разделе #Подготовка ключей Bluetooth 5.1.
Извлечение ключей в Linux
Перезагрузитесь в Arch. Установите chntpw. Примонтируйте ваш Windows-раздел.
$ cd /путь/к/windows/диску/Windows/System32/config $ chntpw -e SYSTEM
В окружении chntpw
выполните
> cd CurrentControlSet\Services\BTHPORT\Parameters\Keys
или
> cd ControlSet00X\Services\BTHPORT\Parameters\Keys
Затем узнайте MAC-адрес вашего Bluetooth-адаптера и перейдите в соответствующий раздел:
> ls > cd mac-адрес
Сделайте то же самое для сопряжённых устройств. Если устройство не является устройством Bluetooth 5.1, вы увидите только ключ сопряжения:
> ls
Node has 0 subkeys and 1 values size type value name [value if type DWORD] 16 REG_BINARY <123456789876>
В таком случае можно просто получить ключ устройства командой hex
:
> hex 123456789876
:00000 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX (всякие другие символы)
«XX»ы и являются ключом сопряжения. Запомните, какие ключи каким MAC-адресам соответствуют.
Если устройство является устройством Bluetooth 5.1, вы увидите несколько разных ключей:
Node has 0 subkeys and 8 values size type value name [value if type DWORD] 16 3 REG_BINARY <LTK> 4 4 REG_DWORD <KeyLength> 16 [0x10] 8 b REG_QWORD <ERand> 4 4 REG_DWORD <EDIV> 37520 [0x9290] 16 3 REG_BINARY <IRK> 8 b REG_QWORD <Address> 4 4 REG_DWORD <AddressType> 1 [0x1] 4 4 REG_DWORD <AuthReq> 45 [0x2d]
Их использование описано в разделе #Подготовка ключей Bluetooth 5.1. Для получения значений параметров используйте команду hex value_name
.
Наконец, импортируйте ключи в вашу установку Linux, как описано в разделе #Завершение.
Для macOS
Загрузитесь в macOS:
- Для macOS Monterey или новее:
- Откройте «Связку ключей» и в строку поиска введите Bluetooth.
- Отсортируйте по дате.
- Если переподключение устройства выполнялось недавно, можно просто отсортировать ключи по дате и выбрать самый свежий. Скорее всего он будет иметь название MobileBluetooth (для старых устройств) или просто UUID (для Bluetooth 5.1+).
- Дважды щёлкните по записи. Проверьте, что в качестве учётной записи указан MAC-адрес вашего устройства.
- Поставьте галочку «Показать пароль». Система попросит вас ввести свой пароль.
- Скопируйте показанный пароль, который по сути является XML-файлом (
⌘+a
⌘+c
) - Вставьте и сохраните его в файл
bt_keys.txt
в вашем домашнем каталоге.
- Для High Sierra или новее выполните в терминале:
# defaults read /private/var/root/Library/Preferences/com.apple.bluetoothd.plist LinkKeys > ~/bt_keys.txt
- Для Sierra или более старых систем выполните в терминале:
# defaults read /private/var/root/Library/Preferences/blued.plist LinkKeys > ~/bt_keys.txt
Теперь в файле ~/.bt_keys.txt
находятся ключи Bluetooth. Для старых версий macOS (High Sierra и старше) нужно перевернуть ключи перед продолжением. Например, 98 54 2f aa bb cc dd ee ff gg hh ii jj kk ll mm
нужно изменить на MM LL KK JJ GG FF EE DD CC BB AA 2F 54 98
.
>>> key = "98 54 2f aa bb cc dd ee ff gg hh ii jj kk ll mm" >>> " ".join(reversed(key.strip().split()))
Если это устройство Bluetooth 5.1, то у одного устройства будет несколько ключей. Перейдите к разделу #Подготовка ключей Bluetooth 5.1 для работы с ними.
Наконец, импортируйте ключи в вашу установку Linux, как описано в разделе #Завершение.
Подготовка ключей Bluetooth 5.1
Если во время выполнения описанных выше шагов вы получили ключи для устройств Bluetooth 5.1, то перед импортом в Linux необходимо преобразовать значения определённым образом для последующего использования на этапе #Завершение. Процесс преобразования зависит от конкретного устройства; примеры для некоторых устройств приведены ниже.
Устройство | Источник ключа и преобразования (Windows) | Источник ключа и преобразования (macOS) | Название получаемого значения |
---|---|---|---|
|
|
? | IdentityResolvingKey.Key
|
|
? | SlaveLongTermKey.Key и PeripheralLongTermKey.Key
| |
ERand и EDIV должны быть 0
|
Random Number и Encrypted Diversifier должны быть 0 .
|
– | |
|
|
? | IdentityResolvingKey.Key
|
|
? | LocalSignatureKey.Key
| |
|
? | LongTermKey.Key
| |
|
? | LongTermKey.EncSize
| |
|
? | LongTermKey.EDiv
| |
|
? | LongTermKey.Rand
| |
|
|
|
IdentityResolvingKey.Key
|
|
|
LongTermKey.Key
| |
|
|
LongTermKey.Rand
| |
|
|
LongTermKey.EDiv
| |
Другие устройства |
|
|
LongTermKey.Key
|
|
|
LongTermKey.Rand
| |
|
|
LongTermKey.EDiv
| |
Xbox wireless controller |
|
? | SlaveLongTermKey.Key
|
- Чтобы просто удалить пробелы из значения, можно использовать этот онлайн-инструмент или такой код Python:
>>> "значение с пробелами".replace(" ", "")
- Вот так можно изменить порядок октетов на обратный (обратите внимание, что в итоге получится список строк с октетами):
>>> ERand=" 63 02 84 B8 5D 40 44 DF " >>> ERand=list(reversed(ERand.strip().split()))
- Вот так можно преобразовать этот список в десятичное число, если требуется:
>>> int("".join(ERand), 16) 16088054540146049635
- Преобразование base64 в hex (перед этим импортируйте модули командой
import binascii, base64
):
binascii.hexlify(base64.decodebytes(b'...')).upper()
- Преобразование macOS Encrypted Diversifier (тоже импортируйте модуль командой
import struct
):
struct.unpack('<H', base64.decodebytes(b'...'))
- Преобразование macOS Random Number:
struct.unpack('<Q', base64.decodebytes(b'...'))
Примеры в общем случае:
- Из
LTK
со значением48 4D AF CD 0F 92 22 88 0A 52 9A F4 76 DA 8B 94
должен получитьсяLongTermKey.Key
со значением484DAFCD0F9222880A529AF476DA8B94
. - Из
ERand
со значением63 02 84 B8 5D 40 44 DF
должен получитьсяRand
со значением16088054540146049635
. - Из
EDIV
со значением37520
должен получитьсяEDiv
со значением37520
.
Завершение
Теперь, когда у вас есть нужные ключи, войдите как root и перейдите в каталог:
# cd /var/lib/bluetooth/MAC-адрес-адаптера
Здесь вы найдёте подкаталоги для каждого сопряжённого устройства. Для каждого нужного устройства перейдите в его подкаталог:
# cd MAC-адрес-устройства
Если у вас есть только один ключ сопряжения (то есть устройство не является устройством Bluetooth 5.1), измените файл info
и подставьте ключ под [LinkKey]
, например:
info
[LinkKey] Key=XXXXXXXXXXXXXXX
Если у вас несколько ключей, то есть устройство является устройством Bluetooth 5.1, измените файл info
, прописав в нём значения, которые вы получили после выполнения описанных выше преобразований. Пример для Xbox One S Wireless Controller:
info
[IdentityResolvingKey] Key=<IdentityResolvingKey.Key> [PeripheralLongTermKey] Key=<PeripheralLongTermKey.Key> [SlaveLongTermKey] Key=<SlaveLongTermKey.Key>
Затем перезапустите bluetooth.service
и pulseaudio
(командой pulseaudio -k && pulseaudio --start
).
Теперь устройство должно успешно подключаться.
Настройка
Состояние питания адаптера по умолчанию
С версии bluez 5.65 питание всех Bluetooth-адаптеров по умолчанию включается при запуске службы или после пробуждения из сна. [2]
Если вы хотите, чтобы адаптер не включался автоматически (например, на портативном устройстве, на котором вы хотите сэкономить заряд батареи), в файле /etc/bluetooth/main.conf
в разделе [Policy]
пропишите AutoEnable=false
:
/etc/bluetooth/main.conf
[Policy] AutoEnable=false
Адаптер можно будет включить вручную командой power on
, как упоминалось в разделе #Сопряжение.
Видимость при запуске системы
Если вы хотите, чтобы ваше устройство всегда было видимо и доступно для подключения:
/etc/bluetooth/main.conf
[General] DiscoverableTimeout = 0
Пробуждение из сна
Чтобы разрешить Bluetooth-клавиатурам, мышам и т. д. пробуждать систему из сна, сначала проверьте настройки BIOS и убедитесь, что функция пробуждения от USB включена. Во многих случаях Bluetooth на материнской плате является USB-устройством.
Найдите ID производителя и ID устройства для адаптера Bluetooth.
$ lsusb | grep bluetooth -i
Bus 001 Device 002: ID 8087:0039 Intel Corp. AX200 Bluetooth
Добавьте новое правило udev для указанных ID производителя и ID устройства, чтобы включить для этого устройства пробуждение из сна.
/etc/udev/rules.d/91-keyboard-mouse-wakeup.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="8087", ATTRS{idProduct}=="0039" RUN+="/bin/sh -c 'echo enabled > /sys$env{DEVPATH}/../power/wakeup;'"
Чтобы автоматически изменить настройки Bluetooth-клавиатуры после пробуждения, например раскладку или частоту повторения зажатых клавиш (смотрите Конфигурация клавиатуры в Xorg#Регулировка задержки и скорости автоповтора и xmodmap (Русский)), создайте такой скрипт и сделайте его исполняемым:
configure_keyboard.sh
#!/bin/sh export DISPLAY=:0 xset r rate 220 30 xmodmap /путь/к/.Xmodmap
И добавьте ещё одно правило, подобное приведённому выше, для запуска этого скрипта:
/etc/udev/rules.d/92-keyboard-reconfiguration-wakeup.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="8087", ATTRS{idProduct}=="0039" RUN+="/путь/к/configure_keyboard.sh"
Включение экспериментальных функций
В стеке Bluez новые функции, потенциально имеющие ошибки, спрятаны за опциями Experimental и KernelExperimental. Набор функций, управляемых этими опциями, меняется со временем; некоторые функции могут стать стабильными и больше не требовать включения этих опций. Пример: включение экспериментальных интерфейсов D-Bus в настоящее время позволяет сообщать об уровне заряда батареи для старых гарнитур. Для включения раскомментируйте соответствующие строки в файле настроек:
/etc/bluetooth/main.conf
... # Enables D-Bus experimental interfaces # Possible values: true or false #Experimental = true # Enables kernel experimental features, alternatively a list of UUIDs # can be given. # Possible values: true,false,<UUID List> # Possible UUIDS: ... # Defaults to false. #KernelExperimental = true
Другой способ — отредактировать юнит bluetooth.service
, создав drop-in файл и добавив флаг --experimental
или --kernel
для запускаемой команды:
/etc/systemd/system/bluetooth.service.d/override.conf
[Service] ExecStart= ExecStart=/usr/lib/bluetooth/bluetoothd --experimental
В обоих случаях перезапустите bluetooth.service
после внесения изменений.
Аудио
Обычно нужны дополнительные шаги для интеграции аудиосервера с Bluetooth. Подробнее это описано ниже.
Смотрите также Bluetooth наушники для информации о подключении Bluetooth-гарнитуры.
PulseAudio
Установите пакет pulseaudio-bluetooth. Не забудьте перезапустить PulseAudio после переустановки: pulseaudio -k
. При стандартной установке PulseAudio (то есть при использовании пользовательской службы со стандартным default.pa
) после этого у вас сразу должна появиться возможность использования Bluetooth-устройств. [3]
Если ваш PulseAudio работает как общесистемная служба, убедитесь, что пользователь, от имени которого запущен демон (обычно pulse
), состоит в группе lp
, и не забудьте загрузить нужные модули:
/etc/pulse/system.pa
... load-module module-bluetooth-policy load-module module-bluetooth-discover ...
Также можно добавить модуль load-module module-switch-on-connect
, если вы хотите автоматически переключать все звуки на устройство Bluetooth.
PipeWire
PipeWire с версии 0.3.19 включает свою поддержку Bluetooth по умолчанию.
ALSA
Сперва убедитесь, что ваше аудиоустройство Bluetooth подключено и сопряжено с системой.
Затем установите bluez-alsa-gitAUR, запустите (и включите) службу bluealsa
и добавьте своего пользователя в группу audio
.
Выполните следующую команду для проверки, что всё работает (замените XX:XX:XX:XX:XX:XX
и ФАЙЛ.wav
на нужные значения):
$ aplay -D bluealsa:SRV=org.bluealsa,DEV=XX:XX:XX:XX:XX:XX,PROFILE=a2dp ФАЙЛ.wav
В завершение добавьте эти строки в ~/.asoundrc
:
~/.asoundrc
defaults.bluealsa { service "org.bluealsa" device "XX:XX:XX:XX:XX:XX" profile "a2dp" }
Теперь можно использовать устройство bluealsa
для доступа к аудиоустройству Bluetooth. Управление громкостью обычно осуществляется через alsamixer
с опцией -D bluealsa
.
Bluetooth serial
Чтобы получить последовательную связь на Bluetooth-to-Serial модулях (HC-05, HC-06), выполните следующие шаги:
Выполните сопряжение с вашим устройством Bluetooth с помощью bluetoothctl
, как описано в разделе #Сопряжение.
Установите bluez-deprecated-tools, поскольку он предоставляет функции, отсутствующие в более новых инструментах.
Привяжите MAC-адрес сопряжённого устройства к терминула tty:
# rfcomm bind rfcomm0 MAC-адрес-устройства
Теперь можно открыть /dev/rfcomm0
для последовательной связи:
$ picocom /dev/rfcomm0 -b 115200
Решение проблем
Основное
Отладка
Для отладки сперва остановите bluetooth.service
.
Затем запустите его напрямую с параметром -d
:
# /usr/lib/bluetooth/bluetoothd -n -d
Другой вариант — использовать инструмент btmon
.
Устаревшие инструменты BlueZ
Восемь инструментов BlueZ объявлены устаревшими и удалены из bluez-utils, хотя не для всех из них есть замена среди новых инструментов. Пакет bluez-deprecated-tools предоставляет эти устаревшие инструменты.
Устаревший инструмент | Ближайшая замена |
---|---|
gatttool | btgatt-client, D-Bus Gatt API[устаревшая ссылка 2023-10-29 ⓘ] |
hciattach | btattach |
hciconfig | btmgmt (и bluetoothctl?) |
hcidump | btmon (и btsnoop) |
hcitool | отсутствует, есть D-Bus Device API[устаревшая ссылка 2023-10-29 ⓘ] |
rfcomm | отсутствует, сделать с D-Bus Profile1 API[устаревшая ссылка 2023-10-29 ⓘ]? |
ciptool | |
sdptool | отсутствует, функциональность кажется разбросанной по разным объектам DBus: Profile[устаревшая ссылка 2023-10-29 ⓘ], Advertising[устаревшая ссылка 2023-10-29 ⓘ], и массивы UUID в device[устаревшая ссылка 2023-10-29 ⓘ] и adapter[устаревшая ссылка 2023-10-29 ⓘ]. |
Проблемы службы
systemd: Condition check resulted in Bluetooth service being skipped
bluetooth.service
требует только существование каталога /sys/class/bluetooth
, который создаётся модулем ядра bluetooth
, который автоматически загружается через systemd-udev
, если он находит работающее устройство Bluetooth.
Если у вас /sys/class/bluetooth
не существует, проверьте, что модуль Bluetooth загружен, командой lsmod
. Если нет, и вы уверены, что у вас есть устройство Bluetooth, попробуйте загрузить его вручную и перезапустить службу bluetooth.service
.
Также нужно загрузить соответствующий драйвер Bluetooth, чаще всего btusb
, но иногда могут понадобиться btrtl,btintel,btbcm,bnep,btusb
и т.д.
Проверьте статус службы bluetooth.service
, чтобы убедиться, что она запущена.
Смотрите также Debian Bug report logs - #853207.
Если bluetooth.service
успешно запускается, но нормально использовать Bluetooth всё равно не получается (например, bluetoothctl
говорит что-то вроде org.Bluez.Error.NotReady
при выполнении scan on
), попробуйте перезагрузить компьютер и дважды проверьте: каталог /sys/class/bluetooth
существует; lsmod
содержит нужные модули Bluetooth; сообщения в журнале; и т.д. systemd-udev
должен подхватить ваше устройство Bluetooth автоматически.
Bluetooth сразу пробуждает систему из режима suspend-to-idle
На системах с поддержкой suspend-to-idle/S2idle/S0ix/Modern Standby Bluetooth-контроллеры остаются включенными в этом режиме сна. Это обычно приводит к тому, что система просыпается сразу после перехода в сон, если подключено какое-либо устройство Bluetooth.
Чтобы предотвратить это, вы можете полностью отключить Bluetooth перед переходом в сон. Установите bluez-utils и создайте файл:
/etc/systemd/system/bluetooth-disable-before-sleep.service
[Unit] Description=Disable Bluetooth before going to sleep Before=sleep.target Before=suspend.target Before=hybrid-sleep.target Before=suspend-then-hibernate.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/bluetoothctl power off ExecStop=/usr/bin/bluetoothctl power on [Install] WantedBy=sleep.target WantedBy=suspend.target WantedBy=hybrid-sleep.target WantedBy=suspend-then-hibernate.target
Включите эту службу и проверьте, что Bluetooth отключается при переходе в сон и включается обратно после пробуждения.
При использовании этого обходного решения #Пробуждение из сна с помощью клавиатуры или мыши не будет работать.
Bluetooth отключается после выхода на headless-системе или сервере
Это может быть вызвано различными причинами:
- И PulseAudio, и PipeWire по умолчанию работают как пользовательские службы, которые завершают работу после завершения последнего сеанса. Чтобы этого не происходило, включите lingering для пользователя.
- Кроме того, при использовании WirePlumber с PipeWire (что обычно и происходит) WirePlumber запускает «logind-monitor», который включает Bluetooth при входе и отключает его при выходе. Решение описано в разделе WirePlumber#Keep Bluetooth running after logout / Headless Bluetooth.
Проблемы адаптера
hcitool scan: Устройство не найдено
- На некоторых ноутбуках Dell (например, Studio 15) вы должны переключить режим Bluetooth с HID на HCI. Установите пакет bluez-hid2hci, после чего udev будет делать это автоматически. В качестве альтернативы вы можете выполнить эту команду для переключения на HCI вручную:
# /usr/lib/udev/hid2hci
- Если устройство не появится, а на вашей машине есть операционная система Windows, попробуйте загрузиться в её и включить адаптер Bluetooth через Windows.
- Иногда также помогает эта простая команда:
# bluetoothctl power on
bluetoothctl: No default controller available
В Bluetooth-контроллерах некоторых материнских плат есть ошибка. Чтобы проверить, столкнулись ли вы с такой ошибкой, выполните journalctl | grep hci
. Если в журнале есть записи вроде «command tx timeout» или «Reading Intel version command failed», выключите компьютер и физически отсоедините кабель питания на несколько секунд. Таким образом прошивка контроллера будет принудительно перезагружена (в то время как стандартная перезагрузка системы этого не сделает). Сообщение об ошибке.
Эта ошибка может случаться, если устройство заблокировано через rfkill.
Также это случается с некоторыми картами intel (такими как 8260), которые не распознаются корректно службой Bluetooth. Иногда использование устаревшего bluez-deprecated-tools, как сообщалось, решает проблему.
Это также может быть вызвано мерами по энергосбережению, тогда добавление параметра ядра btusb.enable_autosuspend=n
может помочь. Смотрите также Red Hat Bugzilla – Bug 1573562.
Иногда выгрузка и загрузка модуля btusb
без параметров помогает вернуть контроллер:
# modprobe -r btusb # modprobe btusb
Это также может случиться с клоном CSR.
rfkill unblock: не происходит разблокировка
Если ваше устройство по-прежнему программно блокируется и у вас запущен ConnMan, попробуйте это:
$ connmanctl enable bluetooth
Bluetooth USB донгл
Если вы пользуетесь USB донглом, вы должны проверить, что ваш Bluetooth донгл распознан системой. Это можно сделать с помощью команды journalctl -f
, после того как вы воткнёте USB донгл (или заглянув в /var/log/messages.log
). Должно появиться что-то вроде следующего (ищите hci):
Feb 20 15:00:24 hostname kernel: [ 2661.349823] usb 4-1: new full-speed USB device number 3 using uhci_hcd Feb 20 15:00:24 hostname bluetoothd[4568]: HCI dev 0 registered Feb 20 15:00:24 hostname bluetoothd[4568]: Listening for HCI events on hci0 Feb 20 15:00:25 hostname bluetoothd[4568]: HCI dev 0 up Feb 20 15:00:25 hostname bluetoothd[4568]: Adapter /org/bluez/4568/hci0 has been enabled
Если вы получили только первые две строки, значит донгл распознан, но вам необходимо его активировать (поднять). Пример:
# btmgmt
[mgmt]# info Index list with 1 item hci0: Primary controller addr 00:1A:7D:DA:71:10 version 6 manufacturer 10 class 0x000000 supported settings: powered connectable fast-connectable discoverable bondable link-security ssp br/edr hs le advertising secure-conn debug-keys privacy static-addr current settings: connectable discoverable bondable ssp br/edr le secure-conn name Mozart short name [mgmt]# select hci0 Selected index 0 [hci0]# power up hci0 Set Powered complete, settings: powered connectable discoverable bondable ssp br/edr le secure-conn [hci0]# info hci0: Primary controller addr 00:1A:7D:DA:71:10 version 6 manufacturer 10 class 0x1c0104 supported settings: powered connectable fast-connectable discoverable bondable link-security ssp br/edr hs le advertising secure-conn debug-keys privacy static-addr current settings: powered connectable discoverable bondable ssp br/edr le secure-conn
Или
# bluetoothctl
[bluetooth]# show Controller 00:1A:7D:DA:71:10 (public) Name: Mozart Alias: Mozart Class: 0x0000095c Powered: no Discoverable: yes Pairable: yes [bluetooth]# power on [CHG] Controller 00:1A:7D:DA:71:10 Class: 0x001c0104 Changing power on succeeded [CHG] Controller 00:1A:7D:DA:71:10 Powered: yes [bluetooth]# show Controller 00:1A:7D:DA:71:10 (public) Name: Mozart Alias: Mozart Class: 0x001c0104 Powered: yes Discoverable: yes Pairable: yes
Чтобы убедиться, что устройство было определено, вы можете использовать команду btmgmt
, являющуюся частью bluez-utils
. Получить список доступных устройств, их идентификаторов и MAC-адресов можно так:
$ btmgmt info
Index list with 1 item hci0: Primary controller addr 00:1A:7D:DA:71:10 version 6 manufacturer 10 class 0x1c0104 supported settings: powered connectable fast-connectable discoverable bondable link-security ssp br/edr hs le advertising secure-conn debug-keys privacy static-addr current settings: powered connectable discoverable bondable ssp br/edr le secure-conn
Для проверки версии Bluetooth можно сопоставить её с версией HCI по таблице из официальной спецификации. Например, в предыдущем выводе HCI version 6 означает Bluetooth 4.0.
Более детальная информация об устройстве может быть получена с помощью устаревшего инструмента hciconfig
. (bluez-deprecated-tools)
$ hciconfig -a hci0
hci0: Type: USB BD Address: 00:1B:DC:0F:DB:40 ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING PSCAN ISCAN RX bytes:1226 acl:0 sco:0 events:27 errors:0 TX bytes:351 acl:0 sco:0 commands:26 errors:0 Features: 0xff 0xff 0x8f 0xfe 0x9b 0xf9 0x00 0x80 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH HOLD SNIFF PARK Link mode: SLAVE ACCEPT Name: 'BlueZ (0)' Class: 0x000100 Service Classes: Unspecified Device Class: Computer, Uncategorized HCI Ver: 2.0 (0x3) HCI Rev: 0xc5c LMP Ver: 2.0 (0x3) LMP Subver: 0xc5c Manufacturer: Cambridge Silicon Radio (10)
Устройства аудио начинают пропускать звук на небольшом расстоянии от донгла
Если другие устройства работают через тот же USB-хост, они могут прерывать связь с устройствами аудио. Убедитесь, что к USB-шине, к которой подключен Bluetooth, больше не подключено никаких других устройств. Например:
$ lsusb
Bus 002 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 004: ID 048d:1345 Integrated Technology Express, Inc. Multi Cardreader Bus 001 Device 003: ID 0424:a700 Standard Microsystems Corp. 2 Port Hub Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Донгл CSR 0a12:0001
С устройством ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
есть баг, и оно сейчас работает только в версиях ядра 5.17 и < 6.0. Подробнее смотрите Kernel Bug 60824.
Logitech Bluetooth USB донгл
Существуют Logitech донглы (например, Logitech MX5000), которые могут работать в двух режимах: встроенный (Embedded) и HCI. Во встроенном режиме донгл эмулирует устройство USB так, что ваш компьютер думает, что вы используете обычную USB мышь/клавиатуру.
Если вы зажмёте маленькую красную кнопку на USB BT мини-приёмнике, включится другой режим. Удерживайте красную кнопку на BT донгле и вставьте его в компьютер, и через 3-5 секунд удерживания кнопки в системном трее появится иконка Bluetooth (обсуждение).
В качестве альтернативы вы можете установить пакет bluez-hid2hci. Когда вы подключите ваш Logitech донгл, он автоматически переключится.
Foxconn / Hon Hai / Lite-On Broadcom
Некоторые из этих устройств необходимо прошивать при загрузке.
Некоторые прошивки можно найти в AUR по запросу broadcom. В частности, стоит упомянуть broadcom-bt-firmwareAUR, который содержит файлы для большого числа карт.
Если готовых файлов прошивок не нашлось, их можно сконвертировать из Windows-файлов .hex в .hcd с помощью hex2hcd (входит в состав пакета bluez-utils).
Чтобы получить нужный .hex файл, попробуйте поискать vendor:product (производитель:продукт) из lsusb, например:
Bus 002 Device 004: ID 04ca:2006 Lite-On Technology Corp. Broadcom BCM43142A0 Bluetooth Device
или
Bus 004 Device 004: Id 0489:e031 Foxconn / Hon Hai
В качестве альтернативы можно загрузиться в Windows (виртуальная машина тоже подойдёт) и посмотреть название прошивки в «Диспетчере устройств». Если вы хотите знать модель устройства, но не видите его в lsusb, его можно увидеть в lsusb -v как iProduct
.
Файл .hex можно извлечь из скачанного драйвера Windows без необходимости загружаться в Windows. Скачайте правильный драйвер, например Bluetooth Widcomm[устаревшая ссылка 2023-09-16 ⓘ]. Для извлечения файлов может понадобиться unrar или cabextract в зависимости от формата. Чтобы найти, какой из .hex файлов нужен вам, смотрите Win32/bcbtums-win7x86-brcm.inf
и ищите строку [RAMUSBE031.CopyList]
, где E031
следует заменить на product code вашего устройства (второе hex-число из lsusb) в верхнем регистре. Сразу под этой строкой вы увидите имя нужного .hex файла.
Когда вы сконвертируете его в .hcd, скопируйте его в /lib/firmware/brcm/BCM.hcd
— это имя файла предлагает dmesg и может быть другим, так что проверьте вывод dmesg у себя. Затем перезагрузите модуль
# rmmod btusb # modprobe btusb
Теперь устройство должно быть доступно. Смотрите BBS#162688 для информации о том, как сделать эти изменения постоянными.
Комбинированные WiFi-Bluetooth карты Intel
See Wireless network configuration (Русский)#Bluetooth Coexistence.
Mediatek MT7921 или MT7961 при двойной загрузке с Windows
В системах с двойной загрузкой, если версии прошивок Bluetooth отличаются в Windows и Linux, адаптер Bluetooth не заработает после перезагрузки в Windows.
Лучший способ предотвратить это — обновить драйверы (и особенно прошивку) Bluetooth до последней версии в каждой ОС.
Если вы не можете найти свежий драйвер (или прошивку) для Windows, можно скопировать файл прошивки /usr/lib/firmware/mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin.xz
из Arch Linux и распаковать в Windows (например, C:\WINDOWS\system32\DRIVERS\
, точный путь к файлу прошивки можно найти в диспетчере устройств).
Адаптер пропадает после ждущего режима
Сперва найдите product ID адаптера. Например:
$ lsusb -tv
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M ID 1d6b:0002 Linux Foundation 2.0 root hub ... |__ Port 3: Dev 3, If 0, Class=Wireless, Driver=btusb, 12M ID 8087:0025 Intel Corp. |__ Port 3: Dev 3, If 1, Class=Wireless, Driver=btusb, 12M ID 8087:0025 Intel Corp. ...
В данном случае vendor ID — 8087, product ID — 0025.
Затем используйте usb_modeswitch для сброса адаптера:
# usb_modeswitch -R -v vendor_ID -p product_ID
Проблемы с сопряжением и соединением
Мой компьютер невидим
Включите режим обнаружения:
# bluetoothctl discoverable on
Убедитесь, что он включен:
# bluetoothctl show
Powered: yes Discoverable: yes Pairable: yes
DiscoverableTimeout
и PairableTimeout
в /etc/bluetooth/main.conf
.Если компьютер всё равно невидим, попробуйте изменить класс устройства в /etc/bluetooth/main.conf
как показано ниже:
# Default device class. Only the major and minor device class bits are # considered. #Class = 0x000100 # Computer Type (from default config) Class = 0x100100 # (Object-Transfer Service & Computer Type)
Class
в файле main.conf
оказывается переопределён после инициализации устройства, так что попробуйте установить класс напрямую с помощью hciconfig hci0 class 100100
.Пользователь сообщал, что это было единственное решение, сделавшее его компьютер видимым для телефона. Телевизоры LG (и некоторые другие) видимы с других устройств аудио, так что использование класса 000414
(soundbar) заставит такие устройства появиться.
Смотрите https://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html для генерации классов устройств/служб Bluetooth.
Устройство подключается и затем отключается спустя мгновение
Если вы видите в журнале подобные сообщения и устройство не может подключиться или отключается вскоре после подключения:
bluetoothd: Unable to get connect data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107) bluetoothd: connect error: Connection refused (111)
Это может быть из-за того, что вы уже настроили сопряжение с этим устройством в другой операционной системе с тем же Bluetooth-адаптером (например, в случае двойной загрузки). Некоторые устройства не могут обрабатывать несколько сопряжений с одним и тем же MAC-адресом. Смотрите #Сопряжение при двойной загрузке для решения этой проблемы.
Устройство не видно при сканировании
Некоторые устройства Bluetooth low energy не отображаются при сканировании в bluetoothctl, например Logitech MX Master. Для их поиска можно использовать transport le
.
# bluetoothctl
[bluetooth]# menu scan [bluetooth]# transport le [bluetooth]# back [bluetooth]# scan on [bluetooth]# devices ... Device XX:XX:XX:XX:XX:XX DA V2 X <---- low energy device here
Другой способ — установить bluez-deprecated-tools, запустить службу bluetooth.service
и выполнить:
# bluetoothctl
[NEW] Controller (MAC) myhostname [default] [bluetooth]# power on [CHG] Controller (MAC) Class: 0x0c010c Changing power on succeeded [CHG] Controller (MAC) Powered: yes [bluetooth]# scan on Discovery started [CHG] Controller (MAC) Discovering: yes
В другом терминале:
# hcitool lescan
Дождитесь появления устройства и затем прервите hcitool с помощью Ctrl+c
. Теперь bluetoothctl должен увидеть ваше устройство и позволить нормально настроить сопряжение.
Устройства BLE не видны на Intel Corp. AX200 Bluetooth
Похоже, что пассивное сканирование BLE на этом устройстве не работает; смотрите сообщение об ошибке.
Не удаётся переподключиться после сна
Вы можете заметить, что не удаётся переподключиться к устройству после того, как оно перешло в спящий режим, или после пробуждения компьютера из сна.
Например, вы можете увидеть в журнале следующие ошибки:
bluetoothd[487]: Authentication attempt without agent bluetoothd[487]: Access denied: org.bluez.Error.Rejected
Это может быть связано с тем, что устройство не отмечено как доверенное (trusted). Смотрите раздел #Сопряжение.
Проблемы с определёнными устройствами
Bluetooth-мышь тормозит / отключается / зависает
Смотрите Bluetooth мышь#Решение проблем.
Bluetooth-аудио не сможет подключиться, если используется pipewire (вместо pulseaudio-bluetooth), а экземпляр pipewire не запущен. Запустите пользовательскую службу pipewire.service
или воспроизведите какой-нибудь звук, чтобы запустился демон pipewire, а затем попробуйте подключить устройство снова.
Интерференция между наушниками и мышью
Если аудио заикается при одновременном использовании Bluetooth-мыши и клавиатуры, попробуйте это, как указано на странице https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/424215 в комментарии #23:
# hciconfig hci0 lm ACCEPT,MASTER # hciconfig hci0 lp HOLD,SNIFF,PARK
Постоянное переподключение с TP-LINK UB400 и контроллером Xbox
Используйте такие настройки:
/etc/bluetooth/main.conf
... [General] JustWorksRepairing = always FastConnectable = true Class = 0x000100 ... [GATT] ReconnectIntervals=1,1,2,3,5,8,13,21,34,55 AutoEnable=true ...
Перезапустите службу bluetooth.service
после внесения изменений.
Смотрите также обсуждение в проекте xpadneo (но использовать сам xpadneo не требуется).
Проблемы с передачей файлов
gnome-bluetooth
Если вы видите это при попытке включить получение файлов в настройках bluetooth:
Bluetooth OBEX start failed: Invalid path Bluetooth FTP start failed: Invalid path
То убедитесь, что пользовательские каталоги XDG существуют.
Не удаётся получить файлы из-за символической ссылки
Если передача файла обрывается, хотя во всём остальном Bluetooth-соединение нормально работает, проблема может быть из-за символических ссылок в пути. В журнале могут появиться примерно такие записи:
Jun 18 11:18:13 ember obexd[3338969]: open(/home/me/.cache/obexd/MOC740): Operation not permitted (1)
Если показанный здесь путь содержит символическую ссылку, то obexd по умолчанию не примет его. Поведение можно переопределить с помощью drop-in файла для пользовательской службы obex.service
:
~/.config/systemd/user/obex.service.d/10-symlink.conf
[Service] ExecStart= ExecStart=/usr/lib/bluetooth/obexd --symlinks
Затем выполните systemctl daemon-reload --user
от имени нужного пользователя и перезапустите пользовательский юнит obex.service
.