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