Jump to content

# Bluetooth (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Bluetooth. Дата последней синхронизации: 11 февраля 2024. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- Bluetooth мышь
- Bluetooth клавиатура
- Bluetooth наушники
- Blueman
- ObexFTP

Bluetooth — стандарт для беспроводного соединения малой дальности сотовых телефонов, компьютеров и других электронных устройств. В Linux канонической реализацией стека протоколов Bluetooth является BlueZ.

## Установка

1. Установите пакет bluez, который предоставляет стек протоколов Bluetooth.
2. Установите bluez-utils, предоставляющий утилиту bluetoothctl. Дополнительно стоит установить bluez-deprecated-tools, который содержит устаревшие инструменты BlueZ.
3. Универсальный драйвер Bluetooth находится в модуле ядра `btusb`. Проверьте, что он загружен. Если нет, то загрузите его вручную.
4. Запустите и включите службу `bluetooth.service`.

Примечание

- Некоторые адаптеры Bluetooth встроены в платы Wi-Fi (например, старые платы Intel Centrino). В этих случаях необходимо, чтобы сперва была включена плата Wi-Fi (обычно при помощи сочетания клавиш на ноутбуке), после чего ядро сможет увидеть адаптер Bluetooth.
- Некоторые карты Bluetooth (например, Broadcom) конфликтуют с сетевыми адаптерами. В этом случае вам необходимо удостовериться, что устройство Bluetooth подключается до начала загрузки сетевых служб.
- Некоторые утилиты вроде hcitool и hciconfig объявлены устаревшими и больше не поставляются в пакете bluez-utils. Так как они не получают обновления, рекомендуется избегать их использования. Если они вам всё ещё нужны, установите дополнительно bluez-deprecated-tools. Подробнее смотрите FS#53110 и Bluez mailing list.
- Начиная с 2024, bluez-obex и bluez-mesh отделены от пакета bluez. Поэтому, если вы планируете передавать файлы по Bluetooth, также установите bluez-obex и пользовательская служба `obex.service` должна быть включена.

### Фронтенды

#### Консольные

- bluetoothctl — Сопряжение устройств через командную строку является одним из самых простых и надёжных вариантов.

  https://www.bluez.org/ || bluez-utils

- bluetui — TUI для управления устройствами Bluetooth.

  https://github.com/pythops/bluetui || bluetui

- bluetuith — TUI-менеджер bluetooth для облегчения сопряжения и управления устройствами/адаптерами, с передачей файлов OBEX и поддержкой мыши.

  https://www.github.com/darkhz/bluetuith || bluetuithAUR

Совет Для автоматизации команд bluetoothctl используйте `echo -e "команда1\nкоманда2\n" | bluetoothctl` или `bluetoothctl -- команда`.

#### Графические

Следующие пакеты позволяют настраивать Bluetooth с помощью графического интерфейса.

- GNOME Bluetooth — Инструменты для Bluetooth в GNOME.
  - gnome-bluetooth-3.0 предоставляет бэкенд (gnome-bluetoothAUR — старая версия)
  - 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.

  https://invent.kde.org/plasma/bluedevil || bluedevil

- Blueberry — Инструмент в Linux Mint, надстройка над GNOME Bluetooth, работает во всех средах рабочего стола. Blueberry не поддерживает приём файлов через Obex Object Push.

  https://github.com/linuxmint/blueberry || blueberryAUR

- Blueman — Полнофункциональный менеджер Bluetooth.

  https://github.com/blueman-project/blueman || blueman

- ObexFTP — Инструмент для обмена файлами с устройствами через OBEX.

  http://dev.zuckschwerdt.org/openobex/wiki/ObexFtp || obexftpAUR

- Overskride — Простой, но мощный клиент Bluetooth.

  https://github.com/kaii-lb/overskride#overskride || overskrideAUR

- btctl — Простой менеджер подключений Bluetooth для fuzzel и других лаунчеров.

  https://codeberg.org/kupospelov/btctl || btctlAUR

## Сопряжение

Примечание Перед использованием устройства Bluetooth убедитесь, что оно не заблокировано через rfkill.

Этот раздел описывает прямую настройку bluez через утилиту командной строки bluetoothctl. Это необязательно, если вы используете какой-нибудь другой инструмент (например, GNOME Bluetooth).

Точная процедура зависит от особенностей конкретного устройства; эта инструкция описывает сопряжение с устройством при помощи bluetoothctl лишь в общих чертах.

Запустите интерактивную команду `bluetoothctl`. После этого можно ввести `help` для получения списка доступных команд.

1. (необязательно) Выберите контроллер по умолчанию командой `select MAC-адрес`.
2. (необязательно) Включите питание контроллера, введя `power on`, если он выключен. По умолчанию он включен; смотрите #Состояние питания адаптера по умолчанию.
3. Введите `devices`, чтобы увидеть MAC-адрес устройства для сопряжения.
4. Войдите в режим обнаружения устройств при помощи команды `scan on`, если нужного вам устройства нет в списке.
5. Включите агент при помощи `agent on` или выберите конкретный агент: если вы введёте `agent` и дважды нажмёте Tab, будет отображён список доступных вариантов. Агент Bluetooth управляет кодом сопряжения. `default-agent` должен подойти в большинстве случаев. [1]
6. Введите `pair MAC-адрес`, чтобы осуществить сопряжение (работает автодополнение по tab).
7. При использовании устройства без PIN, возможно, потребуется подтверждение, прежде чем оно сможет успешно переподключиться. Для этого введите `trust MAC-адрес`.
8. Наконец, используйте `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

### Сопряжение при двойной загрузке

Для систем Linux с двойной загрузкой, как показано в #Сохранение конфигурации[ссылка недействительна: раздел не найден], просто убедитесь, что все файлы из `/var/lib/bluetooth/"BT-Adapter-MAC-address"` идентичны при каждой установке, либо скопировав их, либо установив на них символические ссылки.

В Windows или macOS для сопряжения устройств при двойной загрузке вам необходимо изменить соответствующие ключи сопряжения в вашей установке Linux.

Ниже описан ручной способ изменения. Для автоматизации можно использовать bt-dualboot. (не поддерживает Bluetooth_с_низким_энергопотреблением) и соответствующие репозитории. Для полуавтоматического процесса используйте bluetooth-dualboot script, который не редактирует файлы, но помогает выполнять нужные команды и вырезать и вставлять правильные значения.

#### Подготовка

Чтобы сделать это, сперва сделайте сопряжение в вашем Arch Linux. Потом перезагрузитесь в другую ОС и сделайте сопряжение там. Теперь нужно извлечь ключи сопряжения, но сперва отключите Bluetooth-устройства, чтобы не было ненужных попыток подключения до завершения настройки.

Примечание Некоторые устройства, например Logitech MX Master и Logitech 604 Lightspeed, содержат октет их MAC-адреса (как правило, последний) при каждом сопряжении. Проверьте, случается ли это у вас, и учтите это при завершении процесса.

#### Для Windows

Вы можете извлечь свои Bluetooth-ключи как в Linux, так и в 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

Примечание Если ваш Windows-раздел зашифрован Bitlocker'ом, то получить к нему доступ через chntpw не получится.

Загрузитесь в Arch. Установите chntpw. Примонтируйте ваш Windows-раздел. Перейдите в каталог раздела реестра и запустите `chntpw` в разделе SYSTEM:

Tip Если установлен rlwrap, `chntpw` можно запустить как `rlwrap chntpw` чтобы обеспечить редактирование командной строки в стиле readline и просмотр истории.

    $ cd /путь/к/windows/диску/Windows/System32/config
    $ chntpw -e SYSTEM

В окружении `chntpw` выполните:

    > cd CurrentControlSet\Services\BTHPORT\Parameters\Keys

Вместо `CurrentControlSet`, можно увидеть `ControlSet00X` (проверьте с помощью `ls`); используйте вместо этого:

    > cd ControlSet00X\Services\BTHPORT\Parameters\Keys

Вероятно, там будет только один подраздел, название которого является MAC-адресом вашего Bluetooth-адаптера. Отобразить можно с помощью `ls` и `cd` в нём:

    > ls

    > cd your-adapter's-mac-address

Имена подразделов под этим адаптером являются MAC-адресами устройств, к которым подключен адаптер.

Отобразите их с помощью `ls`, затем `cd` в каждом из них, которые вы хотите соединить двумя парами:

    > 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 <ab12cd34ef56>

Если это так, получите хэш-ключ устройства командой `hex`:

    > hex ab12cd34ef56

    :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 или новее:
  1. Откройте «Связку ключей» и в строку поиска введите Bluetooth.
  2. Отсортируйте по дате.
  3. Если переподключение устройства выполнялось недавно, можно просто отсортировать ключи по дате и выбрать самый свежий. Скорее всего он будет иметь название MobileBluetooth (для старых устройств) или просто UUID (для Bluetooth 5.1+).
  4. Дважды щёлкните по записи. Проверьте, что в качестве учётной записи указан MAC-адрес вашего устройства.
  5. Поставьте галочку «Показать пароль». Система попросит вас ввести свой пароль.
  6. Скопируйте показанный пароль, который по сути является XML-файлом (`⌘+a` `⌘+c`)
  7. Вставьте и сохраните его в файл `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`.

Примечание Это можно сделать таким кодом Python:

    >>> key = "98 54 2f aa bb cc dd ee ff gg hh ii jj kk ll mm"
    >>> " ".join(reversed(key.split()))

Если это устройство Bluetooth 5.1, то у одного устройства будет несколько ключей. Перейдите к разделу #Подготовка ключей Bluetooth 5.1 для работы с ними.

Наконец, импортируйте ключи в вашу установку Linux, как описано в разделе #Завершение.

#### Подготовка ключей Bluetooth 5.1

Если во время выполнения описанных выше шагов вы получили ключи для устройств Bluetooth 5.1, то перед импортом в Linux необходимо преобразовать значения определённым образом для последующего использования на этапе #Завершение. Процесс преобразования зависит от конкретного устройства; примеры для некоторых устройств приведены ниже.

Устройство | Источник ключа и преобразования (Windows) | Источник ключа и преобразования (macOS) | Название получаемого значения
--- | --- | --- | ---
Logitech MX Anywhere 3S Logitech MX Master 3 Logitech MX Master 3S Logitech MX Keys Logitech MX Keys Mini Logitech MX Mechanical Xbox One S Wireless Controller | Скопируйте `IRK`. Уберите пробелы между октетами. | ? | `IdentityResolvingKey.Key`
Скопируйте `LTK`. Уберите пробелы между октетами. | ? | `SlaveLongTermKey.Key` и `PeripheralLongTermKey.Key`
`ERand` и `EDIV` должны быть `0` | Random Number и Encrypted Diversifier должны быть `0`. | –
Logitech MX Anywhere 2S ELECOM Bitra | Скопируйте `IRK`. Уберите пробелы между октетами. | ? | `IdentityResolvingKey.Key`
Скопируйте `CSRK`. Уберите пробелы между октетами. | ? | `LocalSignatureKey.Key`
Скопируйте `LTK`. Уберите пробелы между октетами. | ? | `LongTermKey.Key`
Скопируйте `KeyLength`. Преобразуйте число в десятичное. | ? | `LongTermKey.EncSize`
Скопируйте `EDIV`. Преобразуйте число в десятичное. | ? | `LongTermKey.EDiv`
Скопируйте `ERand`. Измените порядок октетов на обратный. Преобразуйте число в десятичное. | ? | `LongTermKey.Rand`
Dygma Defy | Скопируйте `IRK`. Удалите пробелы (или запятые) между шестнадцатеричными октетами. | ? | `IdentityResolvingKey.Key`
Скопируйте `LTK`. Удалите пробелы (или запятые) между шестнадцатеричными октетами. | ? | `LongTermKey.Key`
Скопируйте `KeyLength`. Преобразуйте целое число из шестнадцатеричного в десятичное. | ? | `LongTermKey.EncSize`
Скопируйте `EDIV`. Преобразуйте целое число из шестнадцатеричного в десятичное. | ? | `LongTermKey.EDiv`
Скопируйте `ERand`. Измените порядок октетов на противоположный и уберите пробелы (или запятые). Преобразуйте целое число из шестнадцатеричного в десятичное. | ? | `LongTermKey.Rand`
Клавиатура Royal Kludge F68 похожа на клавиатуру Logitech MX Anywhere 2S | Скопируйте также `CSRKInbound`. Удалите пробелы между hex-октетами. | ? | `RemoteSignatureKey.Key` | ThinkPad TrackPoint Keyboard II Мышь Pebble M350 Мышь Logitech G604 Lightspeed | Скопируйте `IRK`. Измените порядок октетов на обратный. | Скопируйте Remote IRK. Преобразуйте из base64 в hex. | `IdentityResolvingKey.Key`
Скопируйте `LTK`. Уберите пробелы между октетами. | Скопируйте Remote Encryption > Long-term Key. Преобразуйте из base64 в hex. | `LongTermKey.Key`
Скопируйте `ERand`. Измените порядок октетов на обратный. Преобразуйте число в десятичное. | Скопируйте Remote Encryption > Random Number. Преобразуйте из base64 в little-endian десятичное число (смотрите Python-код ниже). | `LongTermKey.Rand`
Скопируйте `EDIV`. Измените порядок октетов на обратный. Преобразуйте число в десятичное. | Скопируйте Remote Encryption > Encrypted Diversifier. Преобразуйте из base64 в little-endian десятичное число (смотрите Python-код ниже). | `LongTermKey.EDiv`
Другие устройства | Скопируйте `LTK`. Уберите пробелы между октетами. | Скопируйте Remote IRK. Преобразуйте из base64 в hex. | `LongTermKey.Key`
Скопируйте `ERand`. Измените порядок октетов на обратный. Преобразуйте число в десятичное. | Скопируйте Remote Encryption > Long-term Key. Преобразуйте из base64 в hex. | `LongTermKey.Rand`
Скопируйте `EDIV`. Уберите пробелы между октетами. | Скопируйте Remote Encryption > Encrypted Diversifier. Преобразуйте из base64 в hex. Измените порядок октетов на обратный. | `LongTermKey.EDiv`
Xbox wireless controller | Скопируйте `LTK`. Уберите пробелы между октетами. | ? | `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-адрес-устройства

Примечание На этом этапе, если вы используете устройство, которое инкрементирует свой MAC-адрес при каждом сопряжении, вы должны переименовать каталог нужного устройства на актуальный инкрементированный MAC-адрес, получившийся при последнем сопряжении. Либо скопируйте 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`).

Теперь устройство должно успешно подключаться.

Примечание В зависимости от вашего менеджера Bluetooth может понадобиться выполнить полную перезагрузку для переподключения устройств.

## Настройка

### Default transport 3.0 vs 5.x (low energy)

Чтобы заставить контроллер Bluetooth использовать более старый транспортный протокол Bluetooth (например, из-за того, что для устройства 3.0 проще настроить сопряжение с двойной загрузкой, чем для устройства 5.x BLE), установите `ControllerMode=bredr` в `/etc/bluetooth/main.conf` в разделе `[General]`:

    /etc/bluetooth/main.conf

    [General]
    ControllerMode=bredr

Значение по умолчанию `ControllerMode=dual` т.е. включены оба: BR/EDR и LE.

### Состояние питания адаптера по умолчанию

С версии 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-устройством.

Добавьте новое правило udev для адаптеров Bluetooth (Базовый класс беспроводного контроллера USB, протокол интерфейса программирования Bluetooth), чтобы включить выход из режима ожидания:

    /etc/udev/rules.d/91-bluetooth-wakeup.rules

    ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", \

        ATTR{bDeviceClass}=="e0", \
        ATTR{bDeviceProtocol}=="01", \
        ATTR{bDeviceSubClass}=="01", \
    ATTR{power/wakeup}="enabled"

Чтобы автоматически изменить настройки 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

    ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", \
        ATTR{bDeviceClass}=="e0", \
        ATTR{bDeviceProtocol}=="01", \
        ATTR{bDeviceSubClass}=="01" \
    RUN+="/your/path/to/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

Примечание Bluez5 прекратил поддержку ALSA и поддерживает только PulseAudio. Используйте эту инструкцию, только если вы не можете или не хотите использовать PulseAudio.

Сперва убедитесь, что ваше аудиоустройство 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 мышь#Решение проблем.

#### Аудиоустройство не может подключиться с ошибкой br-connection-profile-unavailable

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`.

## Смотрите также

- Keeping Bluetooth devices paired between Linux and Windows
- Bluetooth link keys on dual-boot systems

Category:

- Bluetooth (Русский)

Hidden categories:

- Pages with broken section links
- Pages with dead links

Bluetooth (Русский)
Add topic