На Orange Pi 3B встроенный Bluetooth-чип Spreadtrum UWE5622 подключён через UART (/dev/ttyBT0). В отличие от USB-адаптеров, он требует:
- Загрузки прошивки и калибровочных данных перед инициализацией
- Запуска
hciattach_opiс правильными флагами - Корректного порядка запуска: сначала инициализация чипа, потом демон BlueZ
Симптомы:
bluetoothctl scan on→No default controller availablebtmgmt info→Index list with 0 itemshciconfig -aпоказываетhci0, ноbluetoothctlего не видит- Ошибка
org.bluez.Error.Busyпри попытке включить питание
Причина: сервис orangepi3b-sprd-bluetooth.service запускает hciattach_opi с флагом -n (no-detach), который удерживает устройство, не давая BlueZ зарегистрировать контроллер.
✅ Решение: два шага
Шаг 1: Установите недостающие утилиты
sudo apt update
sudo apt install -y rfkill bluez
rfkillнужен для разблокировки адаптера,bluez- сам стек Bluetooth.
Шаг 2: Исправьте сервис инициализации
Вариант А: Быстрый фикс (вручную)
# 1. Остановите всё
sudo systemctl stop orangepi3b-sprd-bluetooth
sudo systemctl stop bluetooth
sudo killall -9 hciattach_opi 2>/dev/null
sleep 2
# 2. Загрузите драйверы и разблокируйте адаптер
sudo modprobe -a sprdbt_tty sprdwl_ng
sudo rfkill unblock all
# 3. Запустите инициализацию БЕЗ флага -n (hciattach отцепится сам)
sudo /usr/bin/hciattach_opi -s 1500000 /dev/ttyBT0 sprd
# ← Процесс завершится через 2-3 секунды, если чип ответил
# 4. Запустите BlueZ - он подхватит готовый hci0
sudo systemctl start bluetooth
sleep 2
# 5. Проверка
btmgmt info
# Ожидаемо: Index list with 1 item, hci0: Primary controller
sudo bluetoothctl power on
sudo bluetoothctl scan on
# Ожидаемо: Changing power on succeeded, устройство появится в скане
Вариант Б: Постоянный фикс (через systemd)
# 1. Откройте сервис для редактирования
sudo systemctl edit orangepi3b-sprd-bluetooth
# 2. Переопределите ExecStart (уберите -n):
[Service]
ExecStart=
ExecStart=/usr/bin/hciattach_opi -s 1500000 /dev/ttyBT0 sprd
# 3. Примените и перезапустите
sudo systemctl daemon-reload
sudo systemctl restart orangepi3b-sprd-bluetooth
sudo systemctl restart bluetooth
# 4. Проверка
btmgmt info
sudo bluetoothctl power on
sudo bluetoothctl scan on
💡 Почему
-nломает: флагno-detachзаставляетhciattachоставаться в фоне и удерживать UART. BlueZ не может зарегистрировать контроллер, потому что устройство уже занято.
🔧 Если не работает: диагностика
# Проверить, видит ли ядро чип
dmesg | grep -iE "ttyBT|sprd|uwe5622"
# Проверить, загружены ли драйверы
lsmod | grep -iE "sprd|bt"
# Проверить блокировки
rfkill list
# Если Soft blocked: yes → sudo rfkill unblock bluetooth
# Проверить, запущен ли bluetoothd с нужными флагами
ps aux | grep bluetoothd
# Для пассивного сканирования (нужно для HA) требуется: --experimental
# Проверить права на устройство
ls -l /dev/hci0 /dev/ttyBT0
# Должно быть: root:bluetooth, права 660
🐳 Для Docker: проброс в контейнер
Если вы запускаете Home Assistant или другое приложение в Docker:
services:
home-assistant:
volumes:
- /run/dbus:/run/dbus:ro # ← Обязательно для доступа к Bluetooth
# Не запускайте bluetoothctl внутри контейнера!
# Управляйте сопряжением на хосте, приложение подхватит через D-Bus
⚠️ Не используйте
network_mode: hostтолько ради Bluetooth - это ломает сетевую изоляцию. Проброса/run/dbusдостаточно.