Re: btvirt with two virtual controllers: Cannot connect to GATT server
From: Barry Byford <hidden>
Date: 2021-01-05 08:40:27
Hi Olivier, On 2020-04-08 21:40:03, Olivier MARTIN wrote:
Hi Luiz, On 07.04.20 08:30, Olivier MARTIN wrote:quoted
Hi Luiz, On 07.04.20 02:26, Luiz Augusto von Dentz wrote:quoted
Hi Olivier, On Mon, Apr 6, 2020 at 4:06 PM Olivier MARTIN [off-list ref] wrote:quoted
Hi all, I am trying to test BLE connection between two virtual controllers (created with 'btvirt'). But when trying to connect to the GATT server running on the first virtual controller, I have the error "src/device.c:att_connect_cb() connect error: Transport endpoint is not connected (107)" To test my test case, I am using the head of Bluez (2a7df9323e, Sunday 5th April). Here is the test case: 1. Start btvirt for BLE: sudo ./emulator/btvirt -L -U2 (you will need my patch to fix command line parsing I sent a couple of minutes ago) 2. Start bluetoothctl to initialize the Virtual Controller that would play the role of GATT Server: $ bluetoothctl [NEW] Controller DB:E3:2A:E8:90:C4 olivier-ThinkPad-T480 #2 [default] [NEW] Device E3:01:36:88:4C:DE TestAdvertisement [NEW] Controller E3:01:36:88:4C:DE olivier-ThinkPad-T480 [NEW] Device DB:E3:2A:E8:90:C4 TestAdvertisement [bluetooth]# list Controller DB:E3:2A:E8:90:C4 olivier-ThinkPad-T480 #2 [default] Controller E3:01:36:88:4C:DE olivier-ThinkPad-T480 [bluetooth]# power on Changing power on succeeded [CHG] Controller DB:E3:2A:E8:90:C4 Powered: yes [bluetooth]# discoverable on Changing discoverable on succeeded [CHG] Controller DB:E3:2A:E8:90:C4 Discoverable: yesTry with advertise.discoverable on, advertise instances actually have their discoverable flag.I am not sure to understand how "advertise.discoverable on" will fix my issue. I do not have any issue to discover the GATT server running on the first instance of the virtual controller from the second one (see log below). The only issue is when I try connecting to the GATT server with 'connect DB:E3:2A:E8:90:C4', I have the error "Failed to connect: org.bluez.Error.Failed" with the error in bluetoothd "src/device.c:att_connect_cb() connect error: Transport endpoint is not connected (107)".I still wanted to make sure "advertise.discoverable on" would not solve my issue. I have just tested with the latest bluez (commit 60423fed392a) by adding "menu advertise" + "discoverable on" to the steps to duplicate the issue. And I still see the error: bluetoothd[14755]: src/device.c:btd_device_set_temporary() temporary 0 bluetoothd[14755]: src/device.c:device_connect_le() Connection attempt to: DB:E3:2A:E8:90:C4 bluetoothd[14755]: src/device.c:att_connect_cb() connect error: Transport endpoint is not connected (107)
I was having similar issues with getting btvirt working. I resolved my
issue by using btmgmt to set the virtual adapter I was trying to
connect to have "connectable on".
As you can see below, the two virtual adapters are created without
being connectable:
pi@raspberrypi:~ $ btmgmt info | grep -P "hci|current settings"
hci2: Primary controller
current settings: powered bondable ssp br/edr le secure-conn
hci1: Primary controller
current settings: powered bondable ssp br/edr le secure-conn
hci0: Primary controller
current settings: powered connectable bondable ssp br/edr le secure-conn
pi@raspberrypi:~ $ sudo btmgmt --index 1 connectable on
hci1 Set Connectable complete, settings: powered connectable bondable
ssp br/edr le secure-conn
pi@raspberrypi:~ $ btmgmt info | grep -P "hci|current settings"
hci2: Primary controller
current settings: powered bondable ssp br/edr le secure-conn
hci1: Primary controller
current settings: powered connectable bondable ssp br/edr le secure-conn
hci0: Primary controller
current settings: powered connectable bondable ssp br/edr le secure-conn
quoted
quoted
quoted
[bluetooth]# advertise on [CHG] Controller DB:E3:2A:E8:90:C4 SupportedInstances: 0x04 [CHG] Controller DB:E3:2A:E8:90:C4 ActiveInstances: 0x01 Advertising object registered 3. Use './test/example-gatt-server' to simulate GATT server. I confirm the server is started on DB:E3:2A:E8:90:C4 (first virtual controller) 4. Return to bluetoothctl to switch to second virtual controller and connect to the first one [bluetooth]# select E3:01:36:88:4C:DE Controller E3:01:36:88:4C:DE olivier-ThinkPad-T480 [default] [bluetooth]# power on Changing power on succeeded [CHG] Controller E3:01:36:88:4C:DE Powered: yes [bluetooth]# scan on Discovery started [CHG] Controller E3:01:36:88:4C:DE Discovering: yes [NEW] Device DB:E3:2A:E8:90:C4 [bluetooth]# scan off Discovery stopped [CHG] Controller E3:01:36:88:4C:DE Discovering: no [bluetooth]# connect DB:E3:2A:E8:90:C4 Attempting to connect to DB:E3:2A:E8:90:C4 Failed to connect: org.bluez.Error.Failed [CHG] Controller DB:E3:2A:E8:90:C4 Discoverable: no And in the bluetoothd log: bluetoothd[15175]: src/adapter.c:start_discovery() sender :1.6483 bluetoothd[15175]: src/adapter.c:update_discovery_filter() bluetoothd[15175]: src/adapter.c:discovery_filter_to_mgmt_cp() bluetoothd[15175]: src/adapter.c:trigger_start_discovery() bluetoothd[15175]: src/adapter.c:cancel_passive_scanning() bluetoothd[15175]: src/adapter.c:start_discovery_timeout() bluetoothd[15175]: src/adapter.c:start_discovery_timeout() adapter->current_discovery_filter == 0 bluetoothd[15175]: src/adapter.c:start_discovery_complete() status 0x00 bluetoothd[15175]: src/adapter.c:discovering_callback() hci0 type 6 discovering 1 method 0 bluetoothd[15175]: src/adapter.c:device_found_callback() hci0 addr DB:E3:2A:E8:90:C4, rssi 0 flags 0x0000 eir_len 3 bluetoothd[15175]: src/device.c:device_set_legacy() legacy 0 bluetoothd[15175]: src/device.c:device_set_flags() flags 6 bluetoothd[15175]: src/adapter.c:stop_discovery() sender :1.6483 bluetoothd[15175]: src/adapter.c:stop_discovery_complete() status 0x00 bluetoothd[15175]: src/adapter.c:trigger_passive_scanning() bluetoothd[15175]: src/adapter.c:discovery_remove() owner :1.6483 bluetoothd[15175]: src/adapter.c:discovering_callback() hci0 type 6 discovering 0 method 0 bluetoothd[15175]: src/device.c:device_connect_le() Connection attempt to: DB:E3:2A:E8:90:C4 bluetoothd[15175]: src/device.c:att_connect_cb() connect error: Transport endpoint is not connected (107)