2019-10-15 02:45:21 -04:00
|
|
|
# Helpers for generating BLE advertising payloads.
|
|
|
|
|
|
|
|
from micropython import const
|
|
|
|
import struct
|
|
|
|
|
|
|
|
# Advertising payloads are repeated packets of the following form:
|
|
|
|
# 1 byte data length (N + 1)
|
|
|
|
# 1 byte type (see constants below)
|
|
|
|
# N bytes type-specific data
|
|
|
|
|
|
|
|
_ADV_TYPE_FLAGS = const(0x01)
|
|
|
|
_ADV_TYPE_NAME = const(0x09)
|
|
|
|
_ADV_TYPE_UUID16_COMPLETE = const(0x3)
|
2019-10-21 21:31:40 -04:00
|
|
|
_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)
|
2019-10-15 02:45:21 -04:00
|
|
|
_ADV_TYPE_APPEARANCE = const(0x19)
|
|
|
|
|
2019-10-21 21:31:40 -04:00
|
|
|
|
2019-10-15 02:45:21 -04:00
|
|
|
# Generate a payload to be passed to gap_advertise(adv_data=...).
|
|
|
|
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) + (0x00 if br_edr else 0x04)))
|
|
|
|
|
|
|
|
if name:
|
|
|
|
_append(_ADV_TYPE_NAME, name)
|
|
|
|
|
|
|
|
if services:
|
|
|
|
for uuid in services:
|
2019-10-21 21:31:40 -04:00
|
|
|
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)
|
2019-10-15 02:45:21 -04:00
|
|
|
|
|
|
|
# See org.bluetooth.characteristic.gap.appearance.xml
|
|
|
|
_append(_ADV_TYPE_APPEARANCE, struct.pack('<h', appearance))
|
|
|
|
|
|
|
|
return payload
|