# # blueart.py # BLE NUS UART routines # # Neil Gershenfeld 11/13/23 # # based on: # https://github.com/micropython/micropython/blob/master/examples/bluetooth/ble_uart_peripheral.py # https://github.com/micropython/micropython/blob/master/examples/bluetooth/ble_advertising.py # from micropython import const import struct import bluetooth _ADV_TYPE_FLAGS = const(0x01) _ADV_TYPE_NAME = const(0x09) _ADV_TYPE_UUID16_COMPLETE = const(0x3) _ADV_TYPE_UUID32_COMPLETE = const(0x5) _ADV_TYPE_UUID128_COMPLETE = const(0x7) _ADV_TYPE_UUID16_MORE = const(0x2) _ADV_TYPE_UUID32_MORE = const(0x4) _ADV_TYPE_UUID128_MORE = const(0x6) _ADV_TYPE_APPEARANCE = const(0x19) _ADV_MAX_PAYLOAD = const(32) def advertising_payload(limited_disc=False,br_edr=False,name=None, services=None,appearance=0): payload = bytearray() def _append(adv_type, value): nonlocal payload payload += struct.pack("BB",len(value)+1,adv_type)+value _append(_ADV_TYPE_FLAGS,struct.pack("B",(0x01 if limited_disc else 0x02)+(0x18 if br_edr else 0x04)),) if name: _append(_ADV_TYPE_NAME,name) if services: for uuid in services: b = bytes(uuid) if len(b) == 2: _append(_ADV_TYPE_UUID16_COMPLETE,b) elif len(b) == 4: _append(_ADV_TYPE_UUID32_COMPLETE,b) elif len(b) == 16: _append(_ADV_TYPE_UUID128_COMPLETE,b) if appearance: _append(_ADV_TYPE_APPEARANCE,struct.pack(" _ADV_MAX_PAYLOAD: raise ValueError("advertising payload too large") return payload def decode_field(payload,adv_type): i = 0 result = [] while (i+1 < len(payload)): if payload[i+1] == adv_type: result.append(payload[i+2:i+payload[i]+1]) i += 1+payload[i] return result def decode_name(payload): n = decode_field(payload,_ADV_TYPE_NAME) return str(n[0],"utf-8") if n else "" def decode_services(payload): services = [] for u in decode_field(payload,_ADV_TYPE_UUID16_COMPLETE): services.append(bluetooth.UUID(struct.unpack("