In aioble calling DeviceConnection.pair() or security.pair() gives 'unknown config param'
In the aioble library attempting to pair gives 'unknown config param' regardless of which attempt I use (one can call the pair method through the DeviceConnection object which calls the pair method in the security module or call the security module pair method direct). The difference as far as the application is concerned is in the latter one has to pass the DeviceConnection parameter in the first argument. The documentation in the code says use the DeviceConnection object.
I think the offending parameter is the bond parameter. When I try and set the config at the low level programmatically I get an error with the bond parameter as unknown., I did not try setting other parameters.
Handling the # TODO: Handle failure in the _IRQ_ENCRYPTION_UPDATE event
I am using the btstack for the PICO_W. We have needed to do significant work to add pairing/encryption support from the BtStack but for the most part I think we have got the basics working. What I need to know is what to do with the aioble objects when errors occur. I have modified the code a little (slowly adding typing as I learn what things are) to look as follows:
pair_status: int = -1
def _security_irq(event: int, data: tuple[int, bool, bool, bool, int, int]):
global _modified
global pair_status
if event == _IRQ_ENCRYPTION_UPDATE:
pair_status = -1
# Connection has updated (usually due to pairing).
conn_handle, encrypted, authenticated, bonded, key_size, status = data
pair_status = status
logger.info("LNI: AIOBLE: encryption update") # type: ignore
if connection := DeviceConnection._connected.get(conn_handle, None):
logger.info(f'LNI: AIOBLE: Event triggered. Pairing status: {pair_status}') # type: ignore
connection.encrypted = encrypted
connection.authenticated = authenticated
connection.bonded = bonded
connection.key_size = key_size
if pair_status == 19: #ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION (in Bt Stack code - not so in MP code)
del DeviceConnection._connected[conn_handle] # Signal as disconnected
# TODO: Handle failure.
#if encrypted and connection._pair_event:
connection._pair_event.set()
I am assuming the status values are those defined in the btstack file bluetooth.h such that status value 0x13 is, for example, ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION
What I dont know is exactly what to do in each case. Is the del DeviceConnection._connected[conn_handle] sufficient for the ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION case? Should I always set the event if the connection is not None?
What should be done if if connection := DeviceConnection._connected.get(conn_handle, None) gives None?
Are there certain exceptions I should raise to inform the application or do I need to create one?