Linux Bluez RFCOMM: в соединении отказано

Соединение с устройством Bluetooth через RFCOMM завершается сбоем в Linux/Bluez с отказом в соединении при вызове connect(s, (struct sockaddr *)&addr, sizeof(addr));. Устройство было успешно сопряжено. Соединение RFCOMM с этим устройством из Android или Windows может быть успешно установлено, поэтому проблема, похоже, связана с Bluez diver и/или blueotoothd.

В Linux/Bluez трассировки bluetoothctl и Wireshark показывают, что он сначала подключается, а затем примерно через 2 секунды происходит отключение. Причина отключения не ясна.

Та же проблема возникает с различными выпусками Linux на ПК с USB Bluetooth (Linux ubuntu 4.15.0-33-generic #36~16.04.1-Ubuntu SMP, среда, 15 августа, 17:21:05 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux) или Raspberry Pi 3 (Джесси, Стретч).

Я проверил множество других тем с такой же/похожей проблемой. Большинство не имеют или не имеют четкого ответа.

На снимке экрана трассировки Wireshark показано отключение через 2,2 секунды.

Соответствующий вывод системного журнала bluetoothd:

Aug 31 16:43:54 ubuntu bluetoothd[926]: src/adapter.c:connected_callback() hci0 device F6:65:0A:E5:DE:E1 connected eir_len 22
Aug 31 16:43:54 ubuntu bluetoothd[926]: src/device.c:device_create() dst F6:65:0A:E5:DE:E1
Aug 31 16:43:54 ubuntu bluetoothd[926]: src/device.c:device_new() address F6:65:0A:E5:DE:E1
Aug 31 16:43:55 ubuntu bluetoothd[926]: src/device.c:device_new() Creating device /org/bluez/hci0/dev_F6_65_0A_E5_DE_E1
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:dev_disconnected() Device F6:65:0A:E5:DE:E1 disconnected, reason 3
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:adapter_remove_connection()
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:adapter_remove_connection() Removing temporary device /org/bluez/hci0/dev_F6_65_0A_E5_DE_E1
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/device.c:device_remove() Removing device /org/bluez/hci0/dev_F6_65_0A_E5_DE_E1
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/device.c:btd_device_unref() Freeing device /org/bluez/hci0/dev_F6_65_0A_E5_DE_E1
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/device.c:device_free() 0x563aa2a270a0
Aug 31 16:43:57 ubuntu bluetoothd[926]: plugins/policy.c:disconnect_cb() reason 3
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:bonding_attempt_complete() hci0 bdaddr F6:65:0A:E5:DE:E1 type 0 status 0xe
Aug 31 16:43:57 ubuntu bluetoothd[926]: src/adapter.c:resume_discovery()

reason 3 указывает на MGMT_DEV_DISCONN_REMOTE. /net/bluetooth/mgmt.h исходников ядра. Это будет означать, что это устройство инициирует отключение. Но выделенная строка в трассировке Wireshark показывает, что именно хост инициирует отключение.

Большое спасибо за любую помощь заранее.


person shpc    schedule 03.09.2018    source источник
comment
Это часто происходит, когда у bluez нет всех обязательных профилей, которые нужны устройству. Я не уверен в операциях на основе libbluetooth, но все же вы можете попробовать использовать метод ConnectProfile для подключения к определенному профилю, см. здесь: git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/ По умолчанию Connect попытается разрешить и подключить все профили, которые поддерживает устройство. Если не удается подключиться со всеми профилями, соединение прерывается, и устройство остается в парном состоянии.   -  person Parthiban    schedule 05.09.2018
comment
Спасибо за подсказку. Установка профиля, вероятно, автоматически выберет правильный канал RFCOMM. Но мне кажется не очевидным, как можно задать профиль.   -  person shpc    schedule 07.09.2018


Ответы (1)


Был использован неправильный канал RFCOMM. Он мгновенно срабатывает при использовании правильного канала RFCOMM.

sdptool records F6:65:0A:E5:DE:E1 показывает, на каком канале находится RFCOMM:

Service Name: Serial Port
Service RecHandle: 0x10000
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 5
person shpc    schedule 07.09.2018