bluetoothd (BlueZ 5) не з'єднується з жодними пристроями


9

РЕШЕНО. Відредаговано: див. Нижче.

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

Здається, існує багато підходів, але мені не ясно, де закінчується один, а другий починається:

ПІДХІД 1:

a) $ sudo bluetoothd -d -n #runs bluetoothd у багатослівному режимі

b) # $ hciconfig hci1 upвмикає пристрій

$ hciconfig -a #see властивості пристрою

    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:

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 Я також спробував використовувати судо з цими командами

або $ ../bluey-5.15/test/simple-agent hci1

Це сценарій пітона, який обробляє вхідні запити про пару. У разі успіху він також намагається "довіряти" та "підключатися"

вихід: 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"

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 (як тестовий пристрій) можуть бачити BT-пристрій для деяких команд, а не інших. Наприклад, тестовий пристрій буде "довіряти" пристрою, але коли я намагаюся його "видалити", його не існує.

ПІДХІД 2:

DBUS безпосередньо за допомогою команд dbus-send --system. Я не думаю, що будь-яка з цих команд не принесе мені користі, поки я не зможу з'єднати і підключити пристрій.

ПІДХІД 3:

Я спробував усі пропозиції щодо цієї публікації . У BlueZ 5. немає /etc/bluetooth/hcid.conf. Чи потрібно мені його створити? Команда 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

Bluetoothd вихід:

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 LOCAL не підтримує профіль a2dp мого джерела звуку. (Не працює як раковина) Потім я побачив, що таку саму проблему пережили багато людей, які перейшли від BlueZ4 до BlueZ5. Випуск також був розміщений у списку розсилки BlueZ .

Поки що я не знайшов способу додати цей протокол до свого адаптера.


ви пробували bluetoothctl? Встановіть потрібний агент і поставте його до агента за замовчуванням. Також btmon може допомогти отримати більш детальну інформацію про вашу проблему

Дякую за відгук. Так. З новою конфігурацією (BlueZ 5 і PA 5, див. Нижче) я можу використовувати bluetoothctl.
MrUser

Відповіді:


8

Рішення:

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

Головне:

-завантажте новий вихідний код PulseAudio 5, який підтримує BlueZ5, і компілюйте його. (Це не нова версія в схожих сховищах.)

-компіляція взяла багато залежностей (JSON, libsndfile, libcap тощо)

- майте на увазі, що шлях для PA5 є / usr / local not / usr / (Це важливо, тому що я повинен був поставити його в $ LD_LIBRARY_PATH, щоб PA міг знайти libpulsecore-5.0 при запуску)

- як каже вікі ArchLinux, вбийте сервер pulseaudio, який запускається при запуску, і запустіть новий. Він не завантажує профілі при запуску. Також переконайтесь, що демон відроджується. (Встановити в /usr/local//etc/pulse/client.conf)

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

Я не зміг змусити його запускати ALSA, але я десь прочитав, що BlueZ5 може більше не підтримувати плагіни ALSA pcm.


2

Ключовою для вищезазначеної проблеми є ця фраза: "Після того, як відкриття припиниться, пристрої, які не підключені до або не спарені, будуть автоматично видалені Bluetoothd протягом трьох хвилин".

Прочитайте розділ виявлення пристрою на веб-сайті http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/

У мене була аналогічна проблема, але я зв'язав її в парі та підключив. Щоб з'єднати пристрій і підключити його, його потрібно було виявити протягом останніх 3 хвилин. І простий агент, і bluetoothctl відмінно працюють.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.