3b6c9119eb
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.
124 lines
3.8 KiB
Python
124 lines
3.8 KiB
Python
# 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)
|