Problem: A python based BLE central program, when run on a Raspberry Pi, failed to connect to BLE peripheral device (a custom board based on Nordic processor). The same python program successfully connected to the BLE peripheral device when run on a Linux Laptop.
I was expecting the python program will work the same way on both platforms.
Raspberry Pi image is bullseye
.
To investigate the issue I used the following on the two platforms (Raspberry Pi and Linux Laptop):
btmon
for monitoringbluetoothctl
as the central program to connect to BLE Device- A NRF52 DK running the standard HR monitor example from Zephyr as the BLE peripheral device
I noticed the same behaviour i.e. Raspberry PI failed (connects and immediately disconnects) to connect while Linux Laptop connected successfully.
See btmon
logs for the two platforms below.
Observations to note:
- On connect
btmon
log for Raspberry Pi showsFlags: 0x00000008
(unknown device flag) - Some additional HCI events which are not seen in the Linux
btmon
logs
The above raises a few questions for which I still don't have answers:
- What are DEVICE FLAGS (I googled but found no reference to this - all I got was pointers to Advertisement Flags and this Flag seem different)
- Why does the value switch from 0x00000000 (in @MGMT Device found event) to 0x00000008 (HCI Device connected event). Note: The valid values for DEVICE FLAGS are 0(Confirm Name),1(LegacyPairing),2(Not Connectable) (got this information from
btmon
source filepacket.c
). I found one reference to "unknown device flag" - Who is responsible for the change from 0x00000000 to 0x00000008 - BLE Peripheral or the Central program?
btmon
output from Raspberry Pi
Bluetooth monitor ver 5.55
= Note: Linux version 5.15.61-v8+ (aarch64) 15:51:01.286532
= Note: Bluetooth subsystem version 2.22 15:51:01.286533
@ MGMT Event: Device Found (0x0012) plen 25 {0x0001} [hci0] 16:11:04.518347
LE Address: CA:13:47:69:08:05 (Static)
RSSI: -36 dBm (0xdc)
Flags: 0x00000000
Data length: 11
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
16-bit Service UUIDs (complete): 3 entries
Heart Rate (0x180d)
Battery Service (0x180f)
Device Information (0x180a)
< HCI Command: LE Create Co.. (0x08|0x000d) plen 25 #34 [hci0] 16:11:12.743104
Scan interval: 60.000 msec (0x0060)
Scan window: 60.000 msec (0x0060)
Filter policy: White list is not used (0x00)
Peer address type: Random (0x01)
Peer address: CA:13:47:69:08:05 (Static)
Own address type: Public (0x00)
Min connection interval: 30.00 msec (0x0018)
Max connection interval: 50.00 msec (0x0028)
Connection latency: 0 (0x0000)
Supervision timeout: 420 msec (0x002a)
Min connection length: 0.000 msec (0x0000)
Max connection length: 0.000 msec (0x0000)
> HCI Event: Command Status (0x0f) plen 4 #35 [hci0] 16:11:12.743617
LE Create Connection (0x08|0x000d) ncmd 1
Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 19 #36 [hci0] 16:11:12.846266
LE Connection Complete (0x01)
Status: Success (0x00)
Handle: 64
Role: Master (0x00)
Peer address type: Random (0x01)
Peer address: CA:13:47:69:08:05 (Static)
Connection interval: 48.75 msec (0x0027)
Connection latency: 0 (0x0000)
Supervision timeout: 420 msec (0x002a)
Master clock accuracy: 0x00
@ MGMT Event: Device Connec.. (0x000b) plen 24 {0x0001} [hci0] 16:11:12.846310
LE Address: CA:13:47:69:08:05 (Static)
Flags: 0x00000008
Unknown device flag (0x00000008)
Data length: 11
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
16-bit Service UUIDs (complete): 3 entries
Heart Rate (0x180d)
Battery Service (0x180f)
Device Information (0x180a)
< HCI Command: LE Read Remot.. (0x08|0x0016) plen 2 #37 [hci0] 16:11:12.846451
Handle: 64
> HCI Event: Command Status (0x0f) plen 4 #38 [hci0] 16:11:12.856641
LE Read Remote Used Features (0x08|0x0016) ncmd 1
Status: Success (0x00)
> HCI Event: Command Complete (0x0e) plen 14 #39 [hci0] 16:11:12.856698
LE Read Remote Used Features (0x08|0x0016) ncmd 1
Status: Success (0x00)
00 00 00 00 00 00 00 00 00 00 ..........
> HCI Event: LE Meta Event (0x3e) plen 12 #40 [hci0] 16:11:13.186323
LE Read Remote Used Features (0x04)
Status: Connection Failed to be Established (0x3e)
Handle: 64
Features: 0x3f 0x00 0x00 0x08 0x00 0x00 0x00 0x00
LE Encryption
Connection Parameter Request Procedure
Extended Reject Indication
Slave-initiated Features Exchange
LE Ping
LE Data Packet Length Extension
Remote Public Key Validation
> HCI Event: Disconnect Complete (0x05) plen 4 #41 [hci0] 16:11:13.186899
Status: Success (0x00)
Handle: 64
Reason: Connection Failed to be Established (0x3e)
@ MGMT Event: Device Disconn.. (0x000c) plen 8 {0x0001} [hci0] 16:11:13.198822
LE Address: CA:13:47:69:08:05 (Static)
Reason: Unspecified (0x00)
btmon
output from Linux
Bluetooth monitor ver 5.53
= Note: Linux version 5.4.0-131-generic (x86_64) 0.388161
= Note: Bluetooth subsystem version 2.22 0.388162
@ MGMT Event: Device Found (0x0012) plen 50 {0x0002} [hci0] 7.498178
LE Address: CA:13:47:69:08:05 (Static)
RSSI: -56 dBm (0xc8)
Flags: 0x00000000
Data length: 36
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
16-bit Service UUIDs (complete): 3 entries
Heart Rate (0x180d)
Battery Service (0x180f)
Device Information (0x180a)
Name (complete): Zephyr Heartrate Sensor
> HCI Event: LE Meta Event (0x3e) plen 19 #47 [hci0] 17.448221
LE Connection Complete (0x01)
Status: Success (0x00)
Handle: 3585
Role: Master (0x00)
Peer address type: Random (0x01)
Peer address: CA:13:47:69:08:05 (Static)
Connection interval: 50.00 msec (0x0028)
Connection latency: 0 (0x0000)
Supervision timeout: 420 msec (0x002a)
Master clock accuracy: 0x00
@ MGMT Event: Device Connected (0x000b) plen 24 {0x0002} [hci0] 17.448313
LE Address: CA:13:47:69:08:05 (Static)
Flags: 0x00000000
Data length: 11
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
16-bit Service UUIDs (complete): 3 entries
Heart Rate (0x180d)
Battery Service (0x180f)
Device Information (0x180a)
@ MGMT Command: Disconnect (0x0014) plen 7 {0x0001} [hci0] 28.148025
LE Address: CA:13:47:69:08:05 (Static)
< HCI Command: Disconnect (0x01|0x0006) plen 3 #95 [hci0] 28.148111
Handle: 3585
Reason: Remote User Terminated Connection (0x13)
> HCI Event: Command Status (0x0f) plen 4 #96 [hci0] 28.149253
Disconnect (0x01|0x0006) ncmd 1
Status: Success (0x00)
> HCI Event: Disconnect Complete (0x05) plen 4 #97 [hci0] 28.174302
Status: Success (0x00)
Handle: 3585
Reason: Connection Terminated By Local Host (0x16)
@ MGMT Event: Command Complete (0x0001) plen 10 {0x0001} [hci0] 28.174386
Disconnect (0x0014) plen 7
Status: Success (0x00)
LE Address: CA:13:47:69:08:05 (Static)
@ MGMT Event: Device Disconnected (0x000c) plen 8 {0x0002} [hci0] 28.174417
LE Address: CA:13:47:69:08:05 (Static)
Reason: Connection terminated by local host (0x02)
sudo cat /var/log/syslog
provided some specific messages relating to disconnect but I don't know how I can use that to solve the problem I am facing.
Nov 18 11:17:31 kosha bluetoothd[883]: src/adapter.c:connected_callback() hci0 device D0:5F:64:52:00:01 connected eir_len 31
Nov 18 11:17:32 kosha bluetoothd[883]: src/device.c:att_connect_cb() connect to D0:5F:64:52:00:01: Function not implemented (38)
Nov 18 11:17:32 kosha bluetoothd[883]: src/adapter.c:dev_disconnected() Device D0:5F:64:52:00:01 disconnected, reason 0
Nov 18 11:17:32 kosha bluetoothd[883]: src/adapter.c:adapter_remove_connection()
Nov 18 11:17:32 kosha bluetoothd[883]: plugins/policy.c:disconnect_cb() reason 0
Note: when I use my Python program and custom hardware as the BLE device - I see the same things in the btmon
log as above. Based on this I suspect the bluetoothd
version could be the reason for the problem mentioned above.
I am yet to try keeping the version of bluetoothd
the same on both platforms to see if that makes a difference.
UPDATE 19/Nov/2022
I downloaded and compiled the following versions of bluez
5.64, 5.55, 5.65, 5.66 - none of them helped to solve the problem I was facing.