@@ -1163,15 +1163,18 @@ def _split_message(message_pack, datapoints_max_count, max_payload_size):
1163
1163
final_message_item = {'data' : [], 'datapoints' : 0 }
1164
1164
1165
1165
message_item_values_with_allowed_size = {}
1166
+ ts = None
1166
1167
current_size = 0
1167
1168
1168
1169
for (message_index , message ) in enumerate (message_pack ):
1169
1170
if not isinstance (message , dict ):
1170
1171
log .error ("Message is not a dictionary!" )
1171
1172
log .debug ("Message: %s" , message )
1172
1173
continue
1173
-
1174
+ old_ts = ts if ts is not None else message . get ( "ts" )
1174
1175
ts = message .get ("ts" )
1176
+ ts_changed = ts is not None and old_ts != ts
1177
+
1175
1178
values = message .get ("values" , message )
1176
1179
values_data_keys = list (values )
1177
1180
@@ -1189,14 +1192,19 @@ def _split_message(message_pack, datapoints_max_count, max_payload_size):
1189
1192
data_key_size = len (data_key ) + len (str (value ))
1190
1193
1191
1194
if ((datapoints_max_count == 0 or len (message_item_values_with_allowed_size ) < datapoints_max_count )
1192
- and current_size + data_key_size < max_payload_size ):
1195
+ and current_size + data_key_size < max_payload_size ) and not ts_changed :
1193
1196
message_item_values_with_allowed_size [data_key ] = value
1194
1197
current_size += data_key_size
1195
1198
1196
- if ((datapoints_max_count > 0 and len (message_item_values_with_allowed_size ) >= datapoints_max_count + current_size // 1024 )
1197
- or current_size + data_key_size >= max_payload_size ):
1199
+ if ((TBDeviceMqttClient ._datapoints_limit_reached (datapoints_max_count , len (message_item_values_with_allowed_size ), current_size ))
1200
+ or TBDeviceMqttClient ._payload_size_limit_reached (max_payload_size , current_size , data_key_size )) \
1201
+ or ts_changed :
1198
1202
if ts :
1199
- message_chunk = {"ts" : ts , "values" : message_item_values_with_allowed_size .copy ()}
1203
+ ts_to_write = ts
1204
+ if old_ts is not None and old_ts != ts :
1205
+ ts_to_write = old_ts
1206
+ old_ts = ts
1207
+ message_chunk = {"ts" : ts_to_write , "values" : message_item_values_with_allowed_size .copy ()}
1200
1208
if 'metadata' in message :
1201
1209
message_chunk ['metadata' ] = message ['metadata' ]
1202
1210
final_message_item ['data' ].append (message_chunk )
@@ -1208,6 +1216,10 @@ def _split_message(message_pack, datapoints_max_count, max_payload_size):
1208
1216
final_message_item = {'data' : [], 'datapoints' : 0 }
1209
1217
1210
1218
message_item_values_with_allowed_size .clear ()
1219
+ if ts_changed :
1220
+ message_item_values_with_allowed_size [data_key ] = value
1221
+ current_size += data_key_size
1222
+ ts_changed = False
1211
1223
current_size = 0
1212
1224
1213
1225
if (message_index == len (message_pack ) - 1
@@ -1221,10 +1233,19 @@ def _split_message(message_pack, datapoints_max_count, max_payload_size):
1221
1233
final_message_item ['data' ].append (message_item_values_with_allowed_size .copy ())
1222
1234
1223
1235
final_message_item ['datapoints' ] = len (message_item_values_with_allowed_size )
1224
- append_split_message (final_message_item .copy ())
1236
+ if final_message_item ['data' ]:
1237
+ append_split_message (final_message_item .copy ())
1225
1238
1226
1239
return split_messages
1227
1240
1241
+ @staticmethod
1242
+ def _datapoints_limit_reached (datapoints_max_count , current_datapoints_size , current_size ):
1243
+ return 0 < datapoints_max_count <= current_datapoints_size + current_size // 1024
1244
+
1245
+ @staticmethod
1246
+ def _payload_size_limit_reached (max_payload_size , current_size , additional_size ):
1247
+ return current_size + additional_size >= max_payload_size
1248
+
1228
1249
def add_attrs_request_timeout (self , attr_request_number , timeout ):
1229
1250
self .__attrs_request_timeout [attr_request_number ] = timeout
1230
1251
0 commit comments