Linux Bluez RFCOMM: соединение отказано - PullRequest
0 голосов
/ 03 сентября 2018

Не удается установить соединение с устройством 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 показывает, что именно хост инициирует отключение.

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

1 Ответ

0 голосов
/ 07 сентября 2018

Использовался неверный канал 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
...