diff options
| author | Damien George | 2020-05-08 13:54:10 +1000 |
|---|---|---|
| committer | Damien George | 2020-05-11 21:30:41 +1000 |
| commit | 3b6c9119eb3593d9a3af8474d7186541f08d849e (patch) | |
| tree | ec6fe93a8d9657398d80eca6ff5ac1e257477847 /tests/multi_bluetooth | |
| parent | f385b7bfa86aa4657d4a28971a63b8681e1403e2 (diff) | |
extmod/modbluetooth: Add support for changing the GAP device name.
This commit allows the user to set/get the GAP device name used by service
0x1800, characteristic 0x2a00. The usage is:
BLE.config(gap_name="myname")
print(BLE.config("gap_name"))
As part of this change the compile-time setting
MICROPY_PY_BLUETOOTH_DEFAULT_NAME is renamed to
MICROPY_PY_BLUETOOTH_DEFAULT_GAP_NAME to emphasise its link to GAP and this
new "gap_name" config value. And the default value of this for the NimBLE
bindings is changed from "PYBD" to "MPY NIMBLE" to be more generic.
Diffstat (limited to 'tests/multi_bluetooth')
| -rw-r--r-- | tests/multi_bluetooth/ble_gap_device_name.py | 123 | ||||
| -rw-r--r-- | tests/multi_bluetooth/ble_gap_device_name.py.exp | 24 |
2 files changed, 147 insertions, 0 deletions
diff --git a/tests/multi_bluetooth/ble_gap_device_name.py b/tests/multi_bluetooth/ble_gap_device_name.py new file mode 100644 index 000000000..ee4a7a544 --- /dev/null +++ b/tests/multi_bluetooth/ble_gap_device_name.py @@ -0,0 +1,123 @@ +# Test BLE GAP device name get/set + +from micropython import const +import time, machine, bluetooth + +TIMEOUT_MS = 5000 + +_IRQ_CENTRAL_CONNECT = const(1 << 0) +_IRQ_CENTRAL_DISCONNECT = const(1 << 1) +_IRQ_PERIPHERAL_CONNECT = const(1 << 6) +_IRQ_PERIPHERAL_DISCONNECT = const(1 << 7) +_IRQ_GATTC_CHARACTERISTIC_RESULT = const(1 << 9) +_IRQ_GATTC_READ_RESULT = const(1 << 11) + +GAP_DEVICE_NAME_UUID = bluetooth.UUID(0x2A00) + +last_event = None +last_data = None +value_handle = 0 + + +def irq(event, data): + global last_event, last_data, value_handle + last_event = event + last_data = data + if event == _IRQ_CENTRAL_CONNECT: + print("_IRQ_CENTRAL_CONNECT") + elif event == _IRQ_CENTRAL_DISCONNECT: + print("_IRQ_CENTRAL_DISCONNECT") + elif event == _IRQ_PERIPHERAL_CONNECT: + print("_IRQ_PERIPHERAL_CONNECT") + elif event == _IRQ_PERIPHERAL_DISCONNECT: + print("_IRQ_PERIPHERAL_DISCONNECT") + elif event == _IRQ_GATTC_CHARACTERISTIC_RESULT: + if data[-1] == GAP_DEVICE_NAME_UUID: + print("_IRQ_GATTC_CHARACTERISTIC_RESULT", data[-1]) + value_handle = data[2] + elif event == _IRQ_GATTC_READ_RESULT: + print("_IRQ_GATTC_READ_RESULT", data[-1]) + + +def wait_for_event(event, timeout_ms): + t0 = time.ticks_ms() + while time.ticks_diff(time.ticks_ms(), t0) < timeout_ms: + if isinstance(event, int): + if last_event == event: + break + elif event(): + break + machine.idle() + + +# Acting in peripheral role. +def instance0(): + multitest.globals(BDADDR=ble.config("mac")) + + # Test setting and getting the GAP device name before registering services. + ble.config(gap_name="GAP_NAME") + print(ble.config("gap_name")) + + # Create an empty service and start advertising. + ble.gatts_register_services([]) + print("gap_advertise") + multitest.next() + + try: + # Do multiple iterations to test changing the name. + for iteration in range(2): + # Set the GAP device name and start advertising. + ble.config(gap_name="GAP_NAME{}".format(iteration)) + print(ble.config("gap_name")) + ble.gap_advertise(20_000) + + # Wait for central to connect, then wait for it to disconnect. + wait_for_event(_IRQ_CENTRAL_CONNECT, TIMEOUT_MS) + wait_for_event(_IRQ_CENTRAL_DISCONNECT, 4 * TIMEOUT_MS) + if last_event != _IRQ_CENTRAL_DISCONNECT: + return + finally: + ble.active(0) + + +# Acting in central role. +def instance1(): + multitest.next() + try: + for iteration in range(2): + # Wait for peripheral to start advertising. + time.sleep_ms(500) + + # Connect to peripheral. + print("gap_connect") + ble.gap_connect(0, BDADDR) + wait_for_event(_IRQ_PERIPHERAL_CONNECT, TIMEOUT_MS) + if last_event != _IRQ_PERIPHERAL_CONNECT: + return + conn_handle, _, _ = last_data + + if iteration == 0: + print("gattc_discover_characteristics") + ble.gattc_discover_characteristics(conn_handle, 1, 65535) + wait_for_event(lambda: value_handle, TIMEOUT_MS) + + # Wait for all characteristic results to come in (there should be an event for it). + time.sleep_ms(500) + + # Read the peripheral's GAP device name. + print("gattc_read") + ble.gattc_read(conn_handle, value_handle) + wait_for_event(_IRQ_GATTC_READ_RESULT, TIMEOUT_MS) + + # Disconnect from peripheral. + print("gap_disconnect:", ble.gap_disconnect(conn_handle)) + wait_for_event(_IRQ_PERIPHERAL_DISCONNECT, TIMEOUT_MS) + if last_event != _IRQ_PERIPHERAL_DISCONNECT: + return + finally: + ble.active(0) + + +ble = bluetooth.BLE() +ble.active(1) +ble.irq(irq) diff --git a/tests/multi_bluetooth/ble_gap_device_name.py.exp b/tests/multi_bluetooth/ble_gap_device_name.py.exp new file mode 100644 index 000000000..377df90de --- /dev/null +++ b/tests/multi_bluetooth/ble_gap_device_name.py.exp @@ -0,0 +1,24 @@ +--- instance0 --- +b'GAP_NAME' +gap_advertise +b'GAP_NAME0' +_IRQ_CENTRAL_CONNECT +_IRQ_CENTRAL_DISCONNECT +b'GAP_NAME1' +_IRQ_CENTRAL_CONNECT +_IRQ_CENTRAL_DISCONNECT +--- instance1 --- +gap_connect +_IRQ_PERIPHERAL_CONNECT +gattc_discover_characteristics +_IRQ_GATTC_CHARACTERISTIC_RESULT UUID16(0x2a00) +gattc_read +_IRQ_GATTC_READ_RESULT b'GAP_NAME0' +gap_disconnect: True +_IRQ_PERIPHERAL_DISCONNECT +gap_connect +_IRQ_PERIPHERAL_CONNECT +gattc_read +_IRQ_GATTC_READ_RESULT b'GAP_NAME1' +gap_disconnect: True +_IRQ_PERIPHERAL_DISCONNECT |
