src/eric7/MicroPython/BluetoothDialogs/BluetoothAdvertisement.py

Wed, 08 Mar 2023 14:25:24 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 08 Mar 2023 14:25:24 +0100
branch
mpy_network
changeset 9857
0122ae72618d
child 9858
6518c336fcd3
permissions
-rw-r--r--

MicroPython
- Added support for Bluetooth scans for CircuitPython devices.

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
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import struct
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import uuid
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 ADV_IND = 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 ADV_SCAN_IND = 2
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 ADV_NONCONN_IND = 3
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 SCAN_RSP = 4
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 ADV_TYPE_UUID16_INCOMPLETE = 0x02
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 ADV_TYPE_UUID16_COMPLETE = 0x03
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 ADV_TYPE_UUID32_INCOMPLETE = 0x04
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 ADV_TYPE_UUID32_COMPLETE = 0x05
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 ADV_TYPE_UUID128_INCOMPLETE = 0x06
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 ADV_TYPE_UUID128_COMPLETE = 0x07
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 ADV_TYPE_SHORT_NAME = 0x08
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 ADV_TYPE_COMPLETE_NAME = 0x09
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 ADV_TYPE_TX_POWER_LEVEL = 0x0A
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 ADV_TYPE_SVC_DATA = 0x16
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 ADV_TYPE_MANUFACTURER = 0xFF
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 ManufacturerId = {
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 0x4C: "Apple, Inc.",
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 0xE0: "Google",
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 0x75: "Samsung Electronics Co. Ltd.",
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 0x87: "Garmin International Inc.",
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 }
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 class BluetoothAdvertisement:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 Class to parse and store the Bluetooth device advertisement data.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 def __init__(self, address):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 Constructor
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @param address address of the device advertisement
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @type str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 self.__address = address
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 self.__name = ""
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 self.__rssi = 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 self.__connectable = False
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.__advData = None
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 self.__respData = None
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 def update(self, advType, rssi, advData):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 Public method to update the advertisement data.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 @param advType type of advertisement data
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 @type int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 @param rssi RSSI value in dBm
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 @type int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 @param advData advertisement data
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 @type bytes
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 if rssi != self.__rssi:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 self.__rssi = rssi
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 if advType in (ADV_IND, ADV_NONCONN_IND):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 if advData != self.__advData:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 self.__advData = advData
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 self.__connectable = advType == ADV_IND
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 elif advType == ADV_SCAN_IND:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 self.__advData = advData
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 elif advType == SCAN_RSP and advData and advData != self.__respData:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 self.__respData = advData
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 def __str__(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 Special method to generate a string representation.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 @return string representation
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 @rtype str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 return "Scan result: {0} {1}".format(self.__address, self.__rssi)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 def __decodeField(self, *advType):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 Private method to get all fields of the specified types.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 @param *advType type of fields to be extracted
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 @type int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 @yield requested fields
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @ytype bytes
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 # Advertising payloads are repeated packets of the following form:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 # 1 byte data length (N + 1)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 # 1 byte type (see constants below)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 # N bytes type-specific data
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 for payload in (self.__advData, self.__respData):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 if not payload:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 continue
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 i = 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 while i + 1 < len(payload):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 if payload[i + 1] in advType:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 yield payload[i + 2 : i + payload[i] + 1]
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 i += 1 + payload[i]
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 def __splitBytes(self, data, chunkSize):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 Private method to split some data into chunks of given size.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 @param data data to be chunked
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 @type bytes, bytearray, str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 @param chunkSize size for each chunk
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 @type int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 @return list of chunks
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 @rtype list of bytes, bytearray, str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 start = 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 dataChunks = []
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 while start < len(data):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 end = start + chunkSize
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 dataChunks.append(data[start:end])
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 start = end
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 return dataChunks
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 def name(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 Public method to get the complete or shortened advertised name, if available.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 @return advertised name
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 @rtype str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 for n in self.__decodeField(ADV_TYPE_COMPLETE_NAME, ADV_TYPE_SHORT_NAME):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 return str(n, "utf-8").replace("\x00", "") if n else ""
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 return ""
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 def rssi(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 Public method to get the RSSI value.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 @return RSSI value in dBm
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 @rtype int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 return self.__rssi
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 def address(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 Public method to get the address string.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 @return address of the device
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 @rtype str
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 return self.__address
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 def txPower(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 Public method to get the advertised power level in dBm.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 @return transmit power of the device (in dBm)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 @rtype int
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 for txLevel in self.__decodeField(ADV_TYPE_TX_POWER_LEVEL):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 return struct.unpack("<b", txLevel)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 return 0
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 @property
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 def services(self):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 Public method to get the service IDs.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 @return list of tuples containing the advertised service ID and a
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 flag indicating a complete ID
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 @rtype list of tuple of (str, bool)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 result = []
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 for u in self.__decodeField(ADV_TYPE_UUID16_INCOMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 for v in self.__splitBytes(u, 2):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 result.append((hex(struct.unpack("<H", v)[0]), False))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 for u in self.__decodeField(ADV_TYPE_UUID16_COMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 for v in self.__splitBytes(u, 2):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 result.append((hex(struct.unpack("<H", v)[0]), True))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 for u in self.__decodeField(ADV_TYPE_UUID32_INCOMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 for v in self.__splitBytes(u, 4):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 result.append((hex(struct.unpack("<I", v)), False))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 for u in self.__decodeField(ADV_TYPE_UUID32_COMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 for v in self.__splitBytes(u, 4):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 result.append((hex(struct.unpack("<I", v)), True))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 for u in self.__decodeField(ADV_TYPE_UUID128_INCOMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 for v in self.__splitBytes(u, 16):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 uid = uuid.UUID(bytes=bytes(reversed(v)))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 result.append((str(uid), False))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 for u in self.__decodeField(ADV_TYPE_UUID128_COMPLETE):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 for v in self.__splitBytes(u, 16):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 uid = uuid.UUID(bytes=bytes(reversed(v)))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 result.append((str(uid), True))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 return result
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 def manufacturer(self, filterId=None, withName=False):
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 manufacturer data.
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 @param filterId manufacturer ID to filter on (defaults to None)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 @type int (optional)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 @param withName flag indicating to report the manufacturer name as well
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 (if available) (defaults to False)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 @type bool
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 @return tuple containing the manufacturer ID, associated data and manufacturer
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 name
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 @rtype tuple of (int, bytes, str)
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 """
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 result = []
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 for u in self.__decodeField(ADV_TYPE_MANUFACTURER):
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 if len(u) < 2:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 continue
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 m = struct.unpack("<H", u[0:2])[0]
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 if filter is None or m == filterId:
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 name = ManufacturerId.get(m, "") if withName else None
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 result.append((m, u[2:], name))
0122ae72618d MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 return result

eric ide

mercurial