src/eric7/MicroPython/BluetoothDialogs/BluetoothAdvertisement.py

Thu, 15 Jun 2023 19:13:51 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 15 Jun 2023 19:13:51 +0200
branch
eric7
changeset 10090
8be7dd9460c5
parent 10089
5fe9bfafbc7c
child 10439
21c28b0f9e41
permissions
-rw-r--r--

MicroPython
- Improved the display of the bluetooth scan results.

9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de>
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a class to parse and store the Bluetooth device advertisement data.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
10 import contextlib
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
11 import os
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 import struct
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 import uuid
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
15 import yaml
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
16
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 ADV_IND = 0
9859
829c1edbf253 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9858
diff changeset
18 ADV_DIRECT_IND = 1
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 ADV_SCAN_IND = 2
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 ADV_NONCONN_IND = 3
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 SCAN_RSP = 4
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 ADV_TYPE_UUID16_INCOMPLETE = 0x02
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 ADV_TYPE_UUID16_COMPLETE = 0x03
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 ADV_TYPE_UUID32_INCOMPLETE = 0x04
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 ADV_TYPE_UUID32_COMPLETE = 0x05
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 ADV_TYPE_UUID128_INCOMPLETE = 0x06
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 ADV_TYPE_UUID128_COMPLETE = 0x07
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 ADV_TYPE_SHORT_NAME = 0x08
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 ADV_TYPE_COMPLETE_NAME = 0x09
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 ADV_TYPE_TX_POWER_LEVEL = 0x0A
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 ADV_TYPE_SVC_DATA = 0x16
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 ADV_TYPE_MANUFACTURER = 0xFF
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
35 ManufacturerIDs = None
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
36 ServiceIDs = None
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
37
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
38
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
39 def _loadManufacturerIDs():
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
40 """
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
41 Function to load the manufacturer IDs.
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
42 """
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
43 global ManufacturerIDs
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
44
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
45 idsFile = os.path.join(
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
46 os.path.dirname(__file__), "data", "company_identifiers.yaml"
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
47 )
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
48 with contextlib.suppress(OSError):
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
49 with open(idsFile, "r") as f:
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
50 idsDict = yaml.safe_load(f)
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
51
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
52 ManufacturerIDs = {
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
53 entry["value"]: entry["name"] for entry in idsDict["company_identifiers"]
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
54 }
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
55
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
56
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
57 def _loadServiceUUIDs():
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
58 """
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
59 Function to load the service UUIDs.
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
60 """
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
61 global ServiceIDs
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
62
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
63 ServiceIDs = {}
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
64
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
65 for uuidFilename in ("member_uuids.yaml", "sdo_uuids.yaml", "service_uuids.yaml"):
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
66 uuidFilepath = os.path.join(os.path.dirname(__file__), "data", uuidFilename)
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
67 with contextlib.suppress(OSError):
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
68 with open(uuidFilepath, "r") as f:
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
69 uuidDict = yaml.safe_load(f)
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
70
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
71 ServiceIDs.update({u["uuid"]: u["name"] for u in uuidDict["uuids"]})
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 class BluetoothAdvertisement:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 Class to parse and store the Bluetooth device advertisement data.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 def __init__(self, address):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 Constructor
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 @param address address of the device advertisement
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 @type str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 self.__address = address
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 self.__rssi = 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 self.__connectable = False
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 self.__advData = None
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 self.__respData = None
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 def update(self, advType, rssi, advData):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 Public method to update the advertisement data.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @param advType type of advertisement data
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @type int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 @param rssi RSSI value in dBm
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @type int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 @param advData advertisement data
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 @type bytes
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 if rssi != self.__rssi:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 self.__rssi = rssi
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 if advType in (ADV_IND, ADV_NONCONN_IND):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 if advData != self.__advData:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 self.__advData = advData
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 self.__connectable = advType == ADV_IND
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 elif advType == ADV_SCAN_IND:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 self.__advData = advData
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 elif advType == SCAN_RSP and advData and advData != self.__respData:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 self.__respData = advData
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 def __str__(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 Special method to generate a string representation.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 @return string representation
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 @rtype str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 return "Scan result: {0} {1}".format(self.__address, self.__rssi)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 def __decodeField(self, *advType):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 Private method to get all fields of the specified types.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 @param *advType type of fields to be extracted
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 @type int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 @yield requested fields
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 @ytype bytes
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 # Advertising payloads are repeated packets of the following form:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 # 1 byte data length (N + 1)
10089
5fe9bfafbc7c MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10065
diff changeset
136 # 1 byte type (see constants at top)
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 # N bytes type-specific data
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 for payload in (self.__advData, self.__respData):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 if not payload:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 continue
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 i = 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 while i + 1 < len(payload):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 if payload[i + 1] in advType:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 yield payload[i + 2 : i + payload[i] + 1]
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 i += 1 + payload[i]
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 def __splitBytes(self, data, chunkSize):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 Private method to split some data into chunks of given size.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 @param data data to be chunked
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 @type bytes, bytearray, str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 @param chunkSize size for each chunk
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 @type int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 @return list of chunks
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 @rtype list of bytes, bytearray, str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 start = 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 dataChunks = []
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 while start < len(data):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 end = start + chunkSize
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 dataChunks.append(data[start:end])
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 start = end
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 return dataChunks
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 @property
9863
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
168 def completeName(self):
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
169 """
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
170 Public method to get the complete advertised name, if available.
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
171
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
172 @return advertised name
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
173 @rtype str
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
174 """
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
175 for n in self.__decodeField(ADV_TYPE_COMPLETE_NAME):
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
176 return str(n, "utf-8").replace("\x00", "") if n else ""
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
177
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
178 return ""
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
179
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
180 @property
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
181 def shortName(self):
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
182 """
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
183 Public method to get the shortened advertised name, if available.
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
184
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
185 @return advertised name
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
186 @rtype str
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
187 """
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
188 for n in self.__decodeField(ADV_TYPE_SHORT_NAME):
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
189 return str(n, "utf-8").replace("\x00", "") if n else ""
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
190
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
191 return ""
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
192
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
193 @property
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 def name(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 Public method to get the complete or shortened advertised name, if available.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 @return advertised name
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 @rtype str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 """
9863
5f2377b32716 BluetoothAdvertisement
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9859
diff changeset
201 return self.completeName or self.shortName
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 def rssi(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 Public method to get the RSSI value.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 @return RSSI value in dBm
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 @rtype int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 return self.__rssi
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 def address(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 Public method to get the address string.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 @return address of the device
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 @rtype str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 return self.__address
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 def txPower(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 Public method to get the advertised power level in dBm.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 @return transmit power of the device (in dBm)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 @rtype int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 for txLevel in self.__decodeField(ADV_TYPE_TX_POWER_LEVEL):
9859
829c1edbf253 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9858
diff changeset
232 return struct.unpack("<b", txLevel)[0]
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 return 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 def services(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 Public method to get the service IDs.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
241 @return list of tuples containing the advertised service ID, the associated
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
242 service name (if available) and a flag indicating a complete ID
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 @rtype list of tuple of (str, bool)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 """
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
245 if ServiceIDs is None:
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
246 _loadServiceUUIDs()
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
247
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 result = []
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 for u in self.__decodeField(ADV_TYPE_UUID16_INCOMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 for v in self.__splitBytes(u, 2):
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
252 uid = struct.unpack("<H", v)[0]
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
253 result.append((hex(uid), ServiceIDs.get(uid, ""), False))
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 for u in self.__decodeField(ADV_TYPE_UUID16_COMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 for v in self.__splitBytes(u, 2):
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
256 uid = struct.unpack("<H", v)[0]
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
257 result.append((hex(uid), ServiceIDs.get(uid, ""), False))
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 for u in self.__decodeField(ADV_TYPE_UUID32_INCOMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 for v in self.__splitBytes(u, 4):
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
261 result.append((hex(struct.unpack("<I", v)), "", False))
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 for u in self.__decodeField(ADV_TYPE_UUID32_COMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 for v in self.__splitBytes(u, 4):
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
264 result.append((hex(struct.unpack("<I", v)), "", True))
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 for u in self.__decodeField(ADV_TYPE_UUID128_INCOMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 for v in self.__splitBytes(u, 16):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 uid = uuid.UUID(bytes=bytes(reversed(v)))
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
269 result.append((str(uid), "", False))
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 for u in self.__decodeField(ADV_TYPE_UUID128_COMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 for v in self.__splitBytes(u, 16):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 uid = uuid.UUID(bytes=bytes(reversed(v)))
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
273 result.append((str(uid), "", True))
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 return result
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 def manufacturer(self, filterId=None, withName=False):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 Public method to get the manufacturer data.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 @param filterId manufacturer ID to filter on (defaults to None)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 @type int (optional)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 @param withName flag indicating to report the manufacturer name as well
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 (if available) (defaults to False)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 @type bool
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 @return tuple containing the manufacturer ID, associated data and manufacturer
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 name
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 @rtype tuple of (int, bytes, str)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 """
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
290 if ManufacturerIDs is None:
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
291 _loadManufacturerIDs()
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
292
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 result = []
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 for u in self.__decodeField(ADV_TYPE_MANUFACTURER):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 if len(u) < 2:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 continue
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 m = struct.unpack("<H", u[0:2])[0]
9858
6518c336fcd3 Fixed some bugs in MicroPython Bluetooth support.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9857
diff changeset
299 if filterId is None or m == filterId:
10090
8be7dd9460c5 MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10089
diff changeset
300 name = ManufacturerIDs.get(m, "") if withName else None
9857
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 result.append((m, u[2:], name))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 return result
10060
b946699e9e79 Corrected some issues related to unused global variables.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9952
diff changeset
303
10065
de4ae767b0e3 Corrected and checked some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10060
diff changeset
304
10060
b946699e9e79 Corrected some issues related to unused global variables.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9952
diff changeset
305 #
b946699e9e79 Corrected some issues related to unused global variables.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9952
diff changeset
306 # eflag: noqa = U200

eric ide

mercurial