diff --git a/demos/python/sdk_wireless_camera_control/open_gopro/ble/adapters/bleak_wrapper.py b/demos/python/sdk_wireless_camera_control/open_gopro/ble/adapters/bleak_wrapper.py index f100399d..d51543f2 100644 --- a/demos/python/sdk_wireless_camera_control/open_gopro/ble/adapters/bleak_wrapper.py +++ b/demos/python/sdk_wireless_camera_control/open_gopro/ble/adapters/bleak_wrapper.py @@ -11,6 +11,7 @@ from typing import Pattern, Any, Callable, Optional import pexpect +from packaging.version import Version from bleak import BleakScanner, BleakClient from bleak.backends.device import BLEDevice as BleakDevice from bleak.backends.characteristic import BleakGATTCharacteristic @@ -302,14 +303,24 @@ def pair(self, handle: BleakClient) -> None: async def _async_def_pair() -> None: logger.debug("Attempting to pair...") if (OS := platform.system()) == "Linux": + logger.info("Pairing with bluetoothctl") # Manually control bluetoothctl on Linux bluetoothctl = pexpect.spawn("bluetoothctl") if logger.level == logging.DEBUG: bluetoothctl.logfile = sys.stdout.buffer bluetoothctl.expect("Agent registered") + # Get the version + bluetoothctl.sendline("version") + bluetoothctl.expect(r"Version") + bluetoothctl.expect(r"\n") + version = Version(bluetoothctl.before.decode("utf-8").strip()) # First see if we are already paired - bluetoothctl.sendline("paired-devices") - bluetoothctl.expect("paired-devices") + if version >= Version("5.66"): + bluetoothctl.sendline("devices Paired") + bluetoothctl.expect("devices Paired") + else: + bluetoothctl.sendline("paired-devices") + bluetoothctl.expect("paired-devices") bluetoothctl.expect(r"#") for device in bluetoothctl.before.decode("utf-8").splitlines(): if "Device" in device and device.split()[1] == handle.address: @@ -317,9 +328,11 @@ async def _async_def_pair() -> None: else: # We're not paired so do it now bluetoothctl.sendline(f"pair {handle.address}") - bluetoothctl.expect("Accept pairing") - bluetoothctl.sendline("yes") - bluetoothctl.expect("Pairing successful") + if (match := bluetoothctl.expect(["Accept pairing", "Pairing successful"])) == 0: + bluetoothctl.sendline("yes") + bluetoothctl.expect("Pairing successful") + elif match == 1: # We received pairing successful so nothing else to do + pass elif OS == "Darwin": # No pairing on Mac diff --git a/demos/python/sdk_wireless_camera_control/open_gopro/util.py b/demos/python/sdk_wireless_camera_control/open_gopro/util.py index 5d6c3982..15cfe3e1 100644 --- a/demos/python/sdk_wireless_camera_control/open_gopro/util.py +++ b/demos/python/sdk_wireless_camera_control/open_gopro/util.py @@ -67,7 +67,7 @@ def __init__( "open_gopro.api.http_commands": logging.DEBUG, "open_gopro.api.ble_commands": logging.DEBUG, "open_gopro.communication_client": logging.DEBUG, - "open_gopro.ble.adapters.bleak_wrapper": logging.INFO, + "open_gopro.ble.adapters.bleak_wrapper": logging.INFO, # DEBUG for pexpect communication "open_gopro.ble.client": logging.DEBUG, "open_gopro.wifi.adapters.wireless": logging.DEBUG, "open_gopro.responses": logging.DEBUG,