summaryrefslogtreecommitdiffstatshomepage
path: root/examples/bluetooth/ble_advertising.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/bluetooth/ble_advertising.py')
-rw-r--r--examples/bluetooth/ble_advertising.py37
1 files changed, 37 insertions, 0 deletions
diff --git a/examples/bluetooth/ble_advertising.py b/examples/bluetooth/ble_advertising.py
new file mode 100644
index 0000000000..f52598a62a
--- /dev/null
+++ b/examples/bluetooth/ble_advertising.py
@@ -0,0 +1,37 @@
+# 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)
+_ADV_TYPE_APPEARANCE = const(0x19)
+
+# 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:
+ # TODO: Support bluetooth.UUID class.
+ _append(_ADV_TYPE_UUID16_COMPLETE, struct.pack('<h', uuid))
+
+ # See org.bluetooth.characteristic.gap.appearance.xml
+ _append(_ADV_TYPE_APPEARANCE, struct.pack('<h', appearance))
+
+ return payload