Improved BLE device discovery on Android

master
Mark Qvist 2025-07-13 22:07:47 +02:00
rodzic e0f1f3f947
commit f2969bd1b0
1 zmienionych plików z 16 dodań i 9 usunięć

Wyświetl plik

@ -1558,7 +1558,7 @@ class BLEConnection(BluetoothDispatcher):
MTU_TIMEOUT = 4.0 MTU_TIMEOUT = 4.0
CONNECT_TIMEOUT = 7.0 CONNECT_TIMEOUT = 7.0
RECONNECT_WAIT = 1.0 RECONNECT_WAIT = 2.5
@property @property
def is_open(self): def is_open(self):
@ -1659,13 +1659,17 @@ class BLEConnection(BluetoothDispatcher):
self.write_thread = None self.write_thread = None
def connection_job(self): def connection_job(self):
ble_devices = []
while self.should_run: while self.should_run:
if self.bt_manager.bt_enabled(): if self.bt_manager.bt_enabled():
if self.ble_device == None: if not self.connected:
self.ble_device = self.find_target_device() if len(ble_devices) == 0:
ble_devices = self.find_target_devices()
if len(ble_devices) > 0: self.ble_device = ble_devices.pop()
else: self.ble_device == None
if self.ble_device != None: if self.ble_device != None:
if not self.connected:
if self.was_connected: if self.was_connected:
RNS.log(f"Throttling BLE reconnect for {BLEConnection.RECONNECT_WAIT} seconds", RNS.LOG_DEBUG) RNS.log(f"Throttling BLE reconnect for {BLEConnection.RECONNECT_WAIT} seconds", RNS.LOG_DEBUG)
time.sleep(BLEConnection.RECONNECT_WAIT) time.sleep(BLEConnection.RECONNECT_WAIT)
@ -1677,7 +1681,7 @@ class BLEConnection(BluetoothDispatcher):
RNS.log("Bluetooth was disabled, closing active BLE device connection", RNS.LOG_ERROR) RNS.log("Bluetooth was disabled, closing active BLE device connection", RNS.LOG_ERROR)
self.close() self.close()
time.sleep(2) time.sleep(1)
def connect_device(self): def connect_device(self):
if self.ble_device != None and self.bt_manager.bt_enabled(): if self.ble_device != None and self.bt_manager.bt_enabled():
@ -1710,15 +1714,17 @@ class BLEConnection(BluetoothDispatcher):
self.ble_device = None self.ble_device = None
self.close_gatt() self.close_gatt()
def find_target_device(self): def find_target_devices(self):
found_device = None found_device = None
potential_devices = self.bt_manager.get_paired_devices() potential_devices = self.bt_manager.get_paired_devices()
suitable_devices = []
if self.target_bt_addr != None: if self.target_bt_addr != None:
for device in potential_devices: for device in potential_devices:
if (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_LE) or (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_DUAL): if (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_LE) or (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_DUAL):
if str(device.getAddress()).replace(":", "").lower() == str(self.target_bt_addr).replace(":", "").lower(): if str(device.getAddress()).replace(":", "").lower() == str(self.target_bt_addr).replace(":", "").lower():
found_device = device found_device = device
suitable_devices.append(device)
break break
if not found_device and self.target_name != None: if not found_device and self.target_name != None:
@ -1726,6 +1732,7 @@ class BLEConnection(BluetoothDispatcher):
if (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_LE) or (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_DUAL): if (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_LE) or (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_DUAL):
if device.getName().lower() == self.target_name.lower(): if device.getName().lower() == self.target_name.lower():
found_device = device found_device = device
suitable_devices.append(device)
break break
if not found_device: if not found_device:
@ -1733,9 +1740,9 @@ class BLEConnection(BluetoothDispatcher):
if (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_LE) or (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_DUAL): if (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_LE) or (device.getType() == AndroidBluetoothManager.DEVICE_TYPE_DUAL):
if device.getName().startswith("RNode "): if device.getName().startswith("RNode "):
found_device = device found_device = device
break suitable_devices.append(device)
return found_device return suitable_devices
def on_connection_state_change(self, status, state): def on_connection_state_change(self, status, state):
if status == GATT_SUCCESS and state: if status == GATT_SUCCESS and state: