Bluetooth (BlueZ 5) не будет подключаться ни к каким устройствам

решаемые. Отредактировано: см. Ниже.

Я думаю, что достаточно долго искал интернет для этой проблемы. Об этом спрашивали много раз, но ни одно из решений не работает для меня. Я обновился до 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 .

До сих пор я не нашел способа добавить этот протокол в мой адаптер.

9
задан 23 May 2017 в 15:39

2 ответа

Решение:

После нахождения, что профиль (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 плагины больше.

0
ответ дан 23 May 2017 в 15:39

Ключ к вышеупомянутой проблеме является этой фразой: "Как только открытие останавливается, устройства, ни один подключенный с или соединенный не будет автоматически удален bluetoothd в течение трех минут".

читайте Обнаружение устройств раздел от http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/

, я имел подобную проблему, но получил соединенный и связанный. Чтобы соединить и подключить устройство, это, должно быть, было обнаружено в течение прошлых 3 минут. И простой агент и bluetoothctl хорошо работают.

0
ответ дан 23 May 2017 в 15:39

Другие вопросы по тегам:

Похожие вопросы: