deviceplug / btleplug

Rust Cross-Platform Host-Side Bluetooth LE Access Library

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Linux fails to discover services / characteristics

ryankurte opened this issue · comments

commented

Describe the bug
when connecting to a YWK-J1 BLE SPO2 sensor btleplug@0.9.1 inconsistently returns services in the PeripheralProperties object and discover_services() fails to discover any services or characteristics.

from messing with gatttool i think this is because the device will only communicate when connected with an LE address type of random instead of public, random is returned in the properties option but doesn't seem to be used and i can't seem to find how to specify BDADDR_LE_RANDOM here or via bluez-dbus.

Expected behavior

Discovery should list the characteristics available on the device, per nrf connect or gatttool:

➜  spo2 git:(main) sudo gatttool --device=DB:2B:7D:42:98:D0 -I -t random
[DB:2B:7D:42:98:D0][LE]> connect
Attempting to connect to DB:2B:7D:42:98:D0
Connection successful
[DB:2B:7D:42:98:D0][LE]> characteristics
handle: 0x0002, char properties: 0x0a, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x02, char value handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x0009, char properties: 0x02, char value handle: 0x000a, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x000d, char properties: 0x02, char value handle: 0x000e, uuid: 00002a29-0000-1000-8000-00805f9b34fb
handle: 0x000f, char properties: 0x02, char value handle: 0x0010, uuid: 00002a24-0000-1000-8000-00805f9b34fb
handle: 0x0011, char properties: 0x02, char value handle: 0x0012, uuid: 00002a25-0000-1000-8000-00805f9b34fb
handle: 0x0013, char properties: 0x02, char value handle: 0x0014, uuid: 00002a27-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a26-0000-1000-8000-00805f9b34fb
handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 00002a28-0000-1000-8000-00805f9b34fb
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002a50-0000-1000-8000-00805f9b34fb
handle: 0x001c, char properties: 0x08, char value handle: 0x001d, uuid: 00000002-0000-1000-8000-00805f9b34fb
handle: 0x001e, char properties: 0x10, char value handle: 0x001f, uuid: 00000003-0000-1000-8000-00805f9b34fb
handle: 0x0022, char properties: 0x0a, char value handle: 0x0023, uuid: 0000ff01-0000-1000-8000-00805f9b34fb
handle: 0x0025, char properties: 0x08, char value handle: 0x0026, uuid: f1080003-0451-4000-b000-000000000000
handle: 0x0027, char properties: 0x10, char value handle: 0x0028, uuid: f1080002-0451-4000-b000-000000000000
handle: 0x002b, char properties: 0x08, char value handle: 0x002c, uuid: f1020003-0451-4000-b000-000000000000
handle: 0x002d, char properties: 0x10, char value handle: 0x002e, uuid: f1020002-0451-4000-b000-000000000000
[DB:2B:7D:42:98:D0][LE]> quit

Actual behavior

Successful properties:

23:20:44 [INFO] Matching device!: PeripheralProperties { address: DB:2B:7D:42:98:D0, address_type: Some(Random), local_name: Some("J1"), tx_power_level: None, rssi: Some(-61), manufacturer_data: {60048: [208, 152, 66, 125, 43, 219]}, service_data: {}, services: [000090ea-0000-1000-8000-00805f9b34fb] }

Unsuccessful properties:

23:21:26 [INFO] Matching device!: PeripheralProperties { address: DB:2B:7D:42:98:D0, address_type: Some(Random), local_name: Some("J1"), tx_power_level: None, rssi: None, manufacturer_data: {60048: [208, 152, 66, 125, 43, 219]}, service_data: {}, services: [] }

regardless of properties, no services or characteristics are discovered.

Additional context
code is here.

  • it's unclear to me whether this is an issue with btleplug (as gattool and nrf connect both function) or a non-standard BLE implementation that these tools compensate for.
  • running this code with another known-good BLE device results in the expected list of characteristics.
  • i tried to test this on macos to isolate the platform, but, (with terminal BLE permissions) scan doesn't seem to work at all
  • i initially thought this was a regression so rolled back to btleplug@0.8.1 which i had used previously with no change
commented

bluer does support ConnectDevice which when enabled via --experimental in bluetoothd.system results in a dbus method error..

there's also l2_bdaddr_type in struct sockaddr_l2 when opening sockets, but i can't see how to use that API from here