@@ -61,13 +61,16 @@ def broadcast(measurement, *, broadcast_time=0.1, extended=False):
61
61
if not hasattr (os , "environ" ) or (
62
62
"GITHUB_ACTION" not in os .environ and "READTHEDOCS" not in os .environ
63
63
):
64
- device_address = "{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}" .format ( # pylint: disable=invalid-name
65
- * reversed (
66
- list (
67
- _ble ._adapter .address .address_bytes # pylint: disable=protected-access
64
+ if _ble ._adapter .address :
65
+ device_address = "{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}" .format ( # pylint: disable=invalid-name
66
+ * reversed (
67
+ list (
68
+ _ble ._adapter .address .address_bytes # pylint: disable=protected-access
69
+ )
68
70
)
69
71
)
70
- )
72
+ else :
73
+ device_address = "000000000000"
71
74
"""Device address as a string."""
72
75
73
76
_MANUFACTURING_DATA_ADT = const (0xFF )
@@ -79,7 +82,8 @@ class AdafruitSensorMeasurement(Advertisement):
79
82
80
83
# This prefix matches all
81
84
match_prefixes = (
82
- struct .pack ("<BBH" , 3 , _MANUFACTURING_DATA_ADT , _ADAFRUIT_COMPANY_ID ),
85
+ # Matches the sequence number field header (length+ID)
86
+ struct .pack ("<BHBH" , _MANUFACTURING_DATA_ADT , _ADAFRUIT_COMPANY_ID , 0x03 , 0x0003 ),
83
87
)
84
88
85
89
manufacturer_data = LazyObjectField (
@@ -174,6 +178,13 @@ def __str__(self):
174
178
if value is not None :
175
179
parts .append ("{}={}" .format (attr , str (value )))
176
180
return "<{} {} >" .format (self .__class__ .__name__ , " " .join (parts ))
181
+
182
+ def __bytes__ (self ):
183
+ """The raw packet bytes."""
184
+ # Must reorder the ManufacturerData contents so the sequence number field is always first.
185
+ # Necessary to ensure that match_prefixes works right to reconstruct on the receiver.
186
+ self .data_dict [255 ].data .move_to_end (3 , last = False )
187
+ return super ().__bytes__ ()
177
188
178
189
def split (self , max_packet_size = 31 ):
179
190
"""Split the measurement into multiple measurements with the given max_packet_size. Yields
0 commit comments