summaryrefslogtreecommitdiffstatshomepage
path: root/examples/bluetooth/ble_advertising.py
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2019-10-15 17:45:21 +1100
committerDamien George <damien.p.george@gmail.com>2019-10-18 13:36:51 +1100
commit25a228af7e5809fe3a582f665c13a2d38eb5ed40 (patch)
treed6d81589b78df5989e7a123b4b339f6eca834c12 /examples/bluetooth/ble_advertising.py
parentebf8332104c1c6fbd01b521a713e49d040c62920 (diff)
downloadmicropython-25a228af7e5809fe3a582f665c13a2d38eb5ed40.tar.gz
micropython-25a228af7e5809fe3a582f665c13a2d38eb5ed40.zip
examples/bluetooth: Add basic BLE peripheral examples.
Consisting of: - ble_advertising.py -- helper to generate advertising payload. - ble_temperature.py -- simple temperature device. - ble_uart_periperhal.py -- BLE UART wrapper. - ble_uart_repl.py -- dupterm-compatible uart.
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