summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2019-11-13 17:00:35 +1100
committerDamien George <damien.p.george@gmail.com>2019-11-25 17:32:10 +1100
commit3436223630751c770c04b2dca35ef0002143f033 (patch)
tree5ae3ca53efc0bdb1e8046d86aeac8ddd7ffafa2f
parente873d352ada8c392985e9f248271c5cf0fcd32ed (diff)
examples/bluetooth: Add helpers for decoding advertising payloads.
Extracts name and service UUID fields.
-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
index b57d5e031..3a06beb74 100644
--- a/examples/bluetooth/ble_advertising.py
+++ b/examples/bluetooth/ble_advertising.py
@@ -2,6 +2,7 @@
from micropython import const
import struct
+import bluetooth
# Advertising payloads are repeated packets of the following form:
# 1 byte data length (N + 1)
@@ -46,3 +47,39 @@ def advertising_payload(limited_disc=False, br_edr=False, name=None, services=No
_append(_ADV_TYPE_APPEARANCE, struct.pack('<h', appearance))
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('<h', u)[0]))
+ for u in decode_field(payload, _ADV_TYPE_UUID32_COMPLETE):
+ services.append(bluetooth.UUID(struct.unpack('<d', u)[0]))
+ for u in decode_field(payload, _ADV_TYPE_UUID128_COMPLETE):
+ services.append(bluetooth.UUID(u))
+ return services
+
+
+def demo():
+ payload = advertising_payload(name='micropython', services=[bluetooth.UUID(0x181A), bluetooth.UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')])
+ print(payload)
+ print(decode_name(payload))
+ print(decode_services(payload))
+
+if __name__ == '__main__':
+ demo()