решаемые. Отредактировано: см. Ниже.
Я думаю, что достаточно долго искал интернет для этой проблемы. Об этом спрашивали много раз, но ни одно из решений не работает для меня. Я обновился до BlueZ 5, потому что хочу в конечном итоге использовать его возможности с низким энергопотреблением. Однако сейчас я не могу подключить даже свои устройства. Я не могу использовать графический интерфейс, потому что это в конечном итоге будет для встроенной системы Linux. Поэтому я думаю, что я также не могу использовать bluetoothctl, потому что он требует интерактивного сеанса. (Я могу ошибаться в этом.) Поэтому я хочу, чтобы все было через BASH, C или python, в этом порядке. Кроме того, поскольку это должно быть автоматизировано, сопряжение и соединение должны будут инициироваться с устройства Bluetooth, а не с блока Linux. Наконец, все устройства должны использовать профиль a2dp.
Кажется, что есть много подходов, но мне не ясно, где заканчивается один и начинается другой:
ПОДХОД 1:
a) $ sudo bluetoothd -d -n
# запускает bluetoothd в подробном режиме
b) $ hciconfig hci1 up
# включает устройство
$ hciconfig -a
# см. Свойства устройства
Type: BR/EDR Bus: USB
BD Address: 00:02:72:C5:D8:E0 ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING PSCAN ISCAN
RX bytes:32875 acl:761 sco:0 events:1037 errors:0
TX bytes:20178 acl:780 sco:0 commands:329 errors:0
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH SNIFF
Link mode: SLAVE ACCEPT
Name: 'Adapter-1'
Class: 0x00010c
Service Classes: Unspecified
Device Class: Computer, Laptop
HCI Version: 4.0 (0x6) Revision: 0x1000
LMP Version: 4.0 (0x6) Subversion: 0x220e
Manufacturer: Broadcom Corporation (15)
c) пытается выполнить сопряжение с устройством.
Результат: от bluetoothd:
bluetoothd[5359]: src/adapter.c:connected_callback() hci1 device 70:72:3C:62:49:7F connected eir_len 15
bluetoothd[5359]: src/adapter.c:user_confirm_request_callback() hci1 70:72:3C:62:49:7F confirm_hint 1
bluetoothd[5359]: src/device.c:new_auth() Requesting agent authentication for 70:72:3C:62:49:7F
** bluetoothd[5359]: No agent available for request type 2
** bluetoothd[5359]: device_confirm_passkey: Operation not permitted
bluetoothd[5359]: src/adapter.c:btd_adapter_confirm_reply() hci1 addr 70:72:3C:62:49:7F success 0
bluetoothd[5359]: src/adapter.c:bonding_attempt_complete() hci1 bdaddr 70:72:3C:62:49:7F type 0 status 0x5
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x05
bluetoothd[5359]: src/device.c:device_bonding_failed() status 5
bluetoothd[5359]: src/adapter.c:resume_discovery()
bluetoothd[5359]: src/adapter.c:dev_disconnected() Device 70:72:3C:62:49:7F disconnected, reason 3
bluetoothd[5359]: src/adapter.c:adapter_remove_connection()
bluetoothd[5359]: src/adapter.c:bonding_attempt_complete() hci1 bdaddr 70:72:3C:62:49:7F type 0 status 0xe
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
bluetoothd[5359]: src/device.c:device_bonding_failed() status 14
bluetoothd[5359]: src/adapter.c:resume_discovery()
Устройство сообщает Не удалось выполнить сопряжение с адаптером-1 из-за неправильного PIN-кода или пароля.
1134 Основываясь на помеченных выше ответах, я выяснила, почему не было агента. Что за агент? Кто знает, но я сделал вывод, что это был посредник между моим устройством и демоном bluetooth.
d) $ ../bluey-5.15/test/simple-agent
# Я также пытался использовать sudo с этими командами
или $ ../bluey-5.15/test/simple-agent hci1
Это скрипт на python, который обрабатывает входящие запросы на сопряжение. В случае успеха он также пытается «доверять» и «подключать» вывод
: Agent registered
e) затем я пытаюсь выполнить повторное сопряжение с устройства.
выход простого агента:
RequestConfirmation (/org/bluez/hci1/dev_70_72_3C_62_49_7F, 110643)
Confirm passkey (yes/no): yes
Я нажимаю пару на устройстве BT, и он говорит, что сопряжено, но простой агент зависает. Я использовал BlueZ 4, и я уверен, что он должен сказать что-то вроде «Новое устройство XX_XX_XX_XX_XX_XX»
Выход bluetoothd:
** bluetoothd[5359]: src/agent.c:set_default_agent() Default agent set to :1.126 /test/agent
bluetoothd[5359]: src/adapter.c:connected_callback() hci1 device 70:72:3C:62:49:7F connected eir_len 15
bluetoothd[5359]: src/adapter.c:user_confirm_request_callback() hci1 70:72:3C:62:49:7F confirm_hint 0
bluetoothd[5359]: src/device.c:new_auth() Requesting agent authentication for 70:72:3C:62:49:7F
bluetoothd[5359]: src/agent.c:agent_ref() 0xa59290: ref=2
bluetoothd[5359]: src/agent.c:agent_request_confirmation() Calling Agent.RequestConfirmation: name=:1.126, path=/test/agent, passkey=110643
bluetoothd[5359]: src/agent.c:agent_ref() 0xa59290: ref=3
bluetoothd[5359]: src/adapter.c:btd_adapter_confirm_reply() hci1 addr 70:72:3C:62:49:7F success 1
bluetoothd[5359]: src/agent.c:agent_unref() 0xa59290: ref=2
bluetoothd[5359]: src/agent.c:agent_unref() 0xa59290: ref=1
bluetoothd[5359]: src/adapter.c:new_link_key_callback() hci1 new key for 70:72:3C:62:49:7F type 5 pin_len 0
bluetoothd[5359]: src/device.c:device_set_bonded()
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x00
bluetoothd[5359]: src/adapter.c:resume_discovery()
bluetoothd[5359]: src/adapter.c:dev_disconnected() Device 70:72:3C:62:49:7F disconnected, reason 3
bluetoothd[5359]: src/adapter.c:adapter_remove_connection()
bluetoothd[5359]: src/adapter.c:bonding_attempt_complete() hci1 bdaddr 70:72:3C:62:49:7F type 0 status 0xe
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
bluetoothd[5359]: src/device.c:device_bonding_failed() status 14
bluetoothd[5359]: src/adapter.c:resume_discovery()
Так что это что-то делает.
Вывод hcidump:
$ hcidump -i hci1
HCI sniffer - Bluetooth packet analyzer ver 5.15
device: hci1 snap_len: 1500 filter: 0xffffffffffffffff
> HCI Event: Connect Request (0x04) plen 10
bdaddr 70:72:3C:62:49:7F class 0x5a020c type ACL
> HCI Event: Command Status (0x0f) plen 4
Accept Connection Request (0x01|0x0009) status 0x00 ncmd 1
> HCI Event: Connect Complete (0x03) plen 11
status 0x00 handle 11 bdaddr 70:72:3C:62:49:7F type ACL encrypt 0x00
> HCI Event: Command Status (0x0f) plen 4
Read Remote Supported Features (0x01|0x001b) status 0x00 ncmd 1
> HCI Event: Read Remote Supported Features (0x0b) plen 11
status 0x00 handle 11
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
> HCI Event: Command Status (0x0f) plen 4
Read Remote Extended Features (0x01|0x001c) status 0x00 ncmd 1
> HCI Event: Command Complete (0x0e) plen 10
IO Capability Request Reply (0x01|0x002b) ncmd 1
status 0x00 bdaddr 70:72:3C:62:49:7F
> HCI Event: Read Remote Extended Features (0x23) plen 13
status 0x00 handle 11 page 1 max 1
Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
> HCI Event: Command Status (0x0f) plen 4
Remote Name Request (0x01|0x0019) status 0x00 ncmd 1
> HCI Event: Remote Name Req Complete (0x07) plen 255
status 0x00 bdaddr 70:72:3C:62:49:7F name 'Prism II'
> HCI Event: Command Complete (0x0e) plen 10
User Confirmation Request Reply (0x01|0x002c) ncmd 1
status 0x00 bdaddr 70:72:3C:62:49:7F
> HCI Event: Disconn Complete (0x05) plen 4
status 0x00 handle 11 reason 0x13
Reason: Remote User Terminated Connection
Я даже попробовал bluetoothctl, но он дает те же результаты. Самое смешное, что некоторые скрипты от BlueZ (например, test-device) могут видеть устройство BT для некоторых команд, но не для других. Например, test-device будет «доверять» устройству, но когда я пытаюсь «удалить» его, его не существует.
ПОДХОД 2:
DBUS напрямую с использованием команд dbus-send --system. Я не думаю, что какая-либо из этих команд пойдет мне на пользу, пока я не смогу выполнить сопряжение и подключить устройство.
ПОДХОД 3:
Я перепробовал все предложения на этот пост . В BlueZ нет файла /etc/bluetooth/hcid.conf 5. Нужно ли его создавать? Команда rfcomm подключится, но затем отключится сразу же.
$ sudo rfcomm connect /dev/rfcomm0 70:72:3C:62:49:7F 1
Connected /dev/rfcomm0 to 70:72:3C:62:49:7F on channel 1
Press CTRL-C for hangup
Disconnected
Выход Bluetooth:
bluetoothd[5359]: src/adapter.c:connected_callback() hci1 device 70:72:3C:62:49:7F connected eir_len 10
bluetoothd[5359]: src/adapter.c:dev_disconnected() Device 70:72:3C:62:49:7F disconnected, reason 3
bluetoothd[5359]: src/adapter.c:adapter_remove_connection()
bluetoothd[5359]: src/adapter.c:bonding_attempt_complete() hci1 bdaddr 70:72:3C:62:49:7F type 0 status 0xe
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
bluetoothd[5359]: src/device.c:device_bonding_failed() status 14
bluetoothd[5359]: src/adapter.c:resume_discovery()
Выход hcidump:
$ hcidump -i hci1
HCI sniffer - Bluetooth packet analyzer ver 5.15
device: hci1 snap_len: 1500 filter: 0xffffffffffffffff
> HCI Event: Command Status (0x0f) plen 4
Create Connection (0x01|0x0005) status 0x00 ncmd 1
> HCI Event: Connect Complete (0x03) plen 11
status 0x00 handle 11 bdaddr 70:72:3C:62:49:7F type ACL encrypt 0x00
> HCI Event: Command Status (0x0f) plen 4
Read Remote Supported Features (0x01|0x001b) status 0x00 ncmd 1
> HCI Event: Read Remote Supported Features (0x0b) plen 11
status 0x00 handle 11
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
> HCI Event: Command Status (0x0f) plen 4
Read Remote Extended Features (0x01|0x001c) status 0x00 ncmd 1
> HCI Event: Read Remote Extended Features (0x23) plen 13
status 0x00 handle 11 page 1 max 1
Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
> HCI Event: Command Status (0x0f) plen 4
Remote Name Request (0x01|0x0019) status 0x00 ncmd 1
> HCI Event: Remote Name Req Complete (0x07) plen 255
status 0x00 bdaddr 70:72:3C:62:49:7F name 'Prism II'
> HCI Event: Command Status (0x0f) plen 4
Authentication Requested (0x01|0x0011) status 0x00 ncmd 1
> HCI Event: Command Complete (0x0e) plen 10
Link Key Request Reply (0x01|0x000b) ncmd 1
status 0x00 bdaddr 70:72:3C:62:49:7F
> HCI Event: Auth Complete (0x06) plen 3
status 0x00 handle 11
> HCI Event: Command Status (0x0f) plen 4
Set Connection Encryption (0x01|0x0013) status 0x00 ncmd 1
> HCI Event: Encrypt Change (0x08) plen 4
status 0x00 handle 11 encrypt 0x01
> HCI Event: Command Status (0x0f) plen 4
Exit Sniff Mode (0x02|0x0004) status 0x0c ncmd 1
Error: Command Disallowed
> HCI Event: Disconn Complete (0x05) plen 4
status 0x00 handle 11 reason 0x13
Reason: Remote User Terminated Connection
Есть предложения? Я:
Забыть что-то действительно очевидное?
Неправильно ли используете инструменты?
Забыть установить файл конфигурации?
] Редактировать:
Так как простой агент bluez не дал мне никаких полезных ошибок, я написал свой собственный агент сопряжения. Однажды я смог соединиться, но не смог соединиться. bluetoothd дал мне эту новую ошибку:
bluetoothd[3078]: profiles/audio/a2dp.c:a2dp_source_connect() path /org/bluez/hci0/dev_70_72_3C_62_49_7F
bluetoothd[3078]: a2dp-source profile connect failed for 70:72:3C:62:49:7F: Protocol not available
В этом посте указывалось, что, возможно, мой локальный адаптер Bluetooth не поддерживает профиль a2dp моего аудиоисточника. (Не действует как раковина) Потом я увидел, что многие люди, переходящие с BlueZ4 на BlueZ5, сталкивались с той же проблемой. Эта проблема также была опубликована в списке рассылки BlueZ .
До сих пор я не нашел способа добавить этот протокол в мой адаптер.
Решение:
После нахождения, что профиль (a2dp) не был соединен и видя, что у других была та же проблема, я изучил, был ли этот профиль реализован в BlueZ5 уже. Я предполагаю, что не прочитал руководство по портированию достаточно тесно, потому что это объясняет, что a2dp был перемещен из стека BlueZ и в GStreamer. я никогда не слышал о GStreamer, но я также видел от это сообщение , что PulseAudio и ДЖЕК реализуют этот профиль также. Я попробовал PulseAudio, но он не загрузит надлежащие UUID для адаптера. Тогда я наконец нашел сообщение на ArchLinux wiki. я, должно быть, был к этой странице миллионом раз, но это было, вероятно, когда я все еще использовал BlueZ4.
Самое главное:
- загружают новый исходный код PulseAudio 5, который имеет поддержку BlueZ5, и скомпилируйте его. (Это не новейшая версия в способных репозиториях.)
- компиляция взяла МНОГО зависимостей (JSON, libsndfile, libcap, и т.д.)
- имеют в виду, что путь для PA5 является/usr/local не/usr/(Это важно, потому что я должен был поместить его в $LD_LIBRARY_PATH так, чтобы PA мог найти libpulsecore-5.0 при запуске)
- как ArchLinux wiki говорит, уничтожьте pulseaudio сервер, который выполняется при запуске, и запустите новый. Это не загружает профили при запуске. Также удостоверьтесь, что демон повторно мечет икру. (Набор в/usr/local//etc/pulse/client.conf)
После этого, обычный pactl управляет работой. Я смог получить источник a2dp BT (т.е. iPod) к потоку к PA5, и затем, с помощью петлевого модуля, потока к приемнику a2dp BT!
я не смог заставить его работать с ALSA, но я считал где-нибудь, что BlueZ5 не может поддерживать ALSA pcm плагины больше.
Ключ к вышеупомянутой проблеме является этой фразой: "Как только открытие останавливается, устройства, ни один подключенный с или соединенный не будет автоматически удален bluetoothd в течение трех минут".
читайте Обнаружение устройств раздел от http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/
, я имел подобную проблему, но получил соединенный и связанный. Чтобы соединить и подключить устройство, это, должно быть, было обнаружено в течение прошлых 3 минут. И простой агент и bluetoothctl хорошо работают.