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

9

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

Я думаю, что достаточно долго искал интернет для этой проблемы. Об этом спрашивали много раз, но ни одно из решений не работает для меня. Я обновился до BlueZ 5, потому что хочу со временем использовать его возможности с низким энергопотреблением. Однако сейчас я не могу подключить даже свои устройства. Я не могу использовать графический интерфейс, потому что это в конечном итоге будет для встроенной системы Linux. Поэтому я думаю, что я также не могу использовать bluetoothctl, потому что он требует интерактивного сеанса. (Я могу ошибаться в этом.) Поэтому я хочу, чтобы все было через BASH, C или python, в этом порядке. Кроме того, поскольку это должно быть автоматизировано, сопряжение и соединение должны будут инициироваться с устройства Bluetooth, а не с блока Linux. Наконец, все устройства должны использовать профиль a2dp.

Кажется, есть много подходов, но мне не ясно, где один заканчивается, а другой начинается:

ПОДХОД 1:

а) $ sudo bluetoothd -d -n #runs bluetoothd в подробном режиме

б) # $ 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)

в) попробуйте выполнить сопряжение с устройства.

Результат: от блютузда:

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-кода или пароля.

Основываясь на отмеченных выше комментариях, я выяснил, почему не было агента. Что за агент? Кто знает, но я сделал вывод, что это был посредник между моим устройством и демоном Bluetooth.

г) # $ ../bluey-5.15/test/simple-agent Я также пытался использовать sudo с этими командами

или $ ../bluey-5.15/test/simple-agent hci1

Это скрипт Python, который обрабатывает входящие запросы на сопряжение. В случае успеха он также пытается «доверять» и «соединяться»

вывод: Agent registered

д) затем я снова пытаюсь выполнить сопряжение с устройства.

вывод простого агента:

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»

выход Bluetooth:

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

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

MrUser
источник
ты пробовал bluetoothctl? Установите правильный агент и установите его в default-agent. Также btmon может помочь лучше понять вашу проблему
Спасибо за ответ. Да. С новой конфигурацией (BlueZ 5 и PA 5, см. Ниже) я могу использовать bluetoothctl.
MrUser

Ответы:

8

Решение:

Обнаружив, что профиль (a2dp) не был подключен и увидев, что другие имеют ту же проблему, я выяснил, реализован ли этот профиль в BlueZ5. Думаю, я недостаточно внимательно прочитал руководство по портированию, потому что оно объясняет, что a2dp был перемещен из стека BlueZ в GStreamer. Я никогда не слышал о GStreamer, но из этого поста я также увидел, что PulseAudio и JACK также реализуют этот профиль. Я попытался PulseAudio, но он не будет загружать надлежащие UUID для адаптера. Тогда я наконец нашел пост в вики ArchLinux. Должно быть, я был на этой странице миллион раз, но это было, вероятно, когда я все еще использовал BlueZ4.

Самое главное:

- загрузите новый исходный код PulseAudio 5, который поддерживает BlueZ5, и скомпилируйте его. (Это не самая новая версия в репозиториях apt.)

-компиляция требует много зависимостей (JSON, libsndfile, libcap и т. д.)

помните, что путь для PA5 - это / usr / local, а не / usr / (это важно, потому что мне пришлось поместить его в $ LD_LIBRARY_PATH, чтобы PA мог найти libpulsecore-5.0 при запуске)

-Как говорится в вики ArchLinux, убейте сервер pulseaudio, который запускается при запуске, и запустите новый. Он не загружает профили при запуске. Также убедитесь, что демон возрождается. (Устанавливается в /usr/local//etc/pulse/client.conf)

После этого работают обычные команды pactl. Мне удалось получить источник BT a2dp (то есть iPod) для потоковой передачи на PA5, а затем, используя модуль обратной связи, транслировать на приемник BT a2dp!

Я не смог заставить его работать с ALSA, но где-то читал, что BlueZ5 может больше не поддерживать плагины ALSA pcm.

MrUser
источник
2

Ключ к вышеупомянутой проблеме заключается в следующей фразе: «Как только обнаружение прекращается, устройства, не подключенные или не сопряженные, будут автоматически удалены через Bluetooth в течение трех минут».

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

У меня была похожая проблема, но я получил ее в паре и подключен. Для сопряжения и подключения устройства оно должно быть обнаружено в течение последних 3 минут. И simple-agent, и bluetoothctl работают нормально.

vtmr
источник