Annahmedialog auf Auftragsliste unterdrückt und MQTT-Wiederholungen abgesichert

This commit is contained in:
Sven committed 2026-11-09 14:57:37 +01:00
1 parent 684e8a57fc
commit c63018918b
3 files changed
+353 -9

No files matched your search

+33 -8
View File
@@ -6,6 +6,7 @@ import 'dart:math';
import 'package:archive/archive.dart';
import 'package:dart_mq/dart_mq.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:geolocator/geolocator.dart';
import 'package:http/http.dart' as http;
import 'package:mqtt5_client/mqtt5_client.dart';
@@ -98,6 +99,22 @@ class MqttCore with ProducerMixin, ConsumerMixin {
_processBootstrap();
}
/// Ermöglicht Tests des Nachrichtenflusses ohne Bootstrap und Netzwerkzugriff.
@visibleForTesting
MqttCore.withClient({
required MqttServerClient client,
required String clientId,
required String fromServerTopic,
required String toServerTopic,
}) : _mqttClient = client,
_clientId = clientId,
_fromServerTopic = fromServerTopic,
_toServerTopic = toServerTopic {
instance = this;
initMessages();
_setupMqtt();
}
ConnectionStateEnum getConnectionStatus() {
return connectionState;
}
@@ -185,15 +202,24 @@ class MqttCore with ProducerMixin, ConsumerMixin {
}
}
bool _publishMessage(String topic, Map<String, dynamic> message, bool acknowledgeRequired, {bool enqueueOnError = true}) {
bool _publishMessage(String topic, Map<String, dynamic> message, bool acknowledgeRequired) {
try {
String messageId = const Uuid().v4();
String messageText = jsonEncode(message);
final messageId = const Uuid().v4();
if (acknowledgeRequired) {
_enqueueMessage(messageId, topic, messageText);
// Vor dem ersten Versand speichern; erst die Serverbestätigung entfernt den Eintrag.
_enqueueMessage(messageId, topic, jsonEncode(message));
}
return _sendMessage(topic, message, acknowledgeRequired, messageId);
} catch (ex) {
Util.logInfo("send failed: $ex");
return false;
}
}
bool _sendMessage(String topic, Map<String, dynamic> message, bool acknowledgeRequired, String messageId) {
try {
var encapsulatedMessageText = _encapsulateMessage(messageId, acknowledgeRequired, message);
var buffer = Uint8Buffer();
@@ -761,7 +787,7 @@ class MqttCore with ProducerMixin, ConsumerMixin {
}
}
void _enqueueMessage(String uuid, String receiver, String payload) async {
void _enqueueMessage(String uuid, String receiver, String payload) {
var enqueuedMessage = EnqueuedMessage();
enqueuedMessage.messageId = uuid;
enqueuedMessage.topic = receiver;
@@ -780,9 +806,8 @@ class MqttCore with ProducerMixin, ConsumerMixin {
try {
var json = jsonDecode(enqueuedMessage.payload);
if (_publishMessage(enqueuedMessage.topic, json, false, enqueueOnError: false)) {
box.remove(enqueuedMessage.id);
}
// Wiederholungen behalten ihre ID und benötigen weiterhin eine Bestätigung.
_sendMessage(enqueuedMessage.topic, json, true, enqueuedMessage.messageId);
} catch (ex) {
Util.logInfo("resend enqueued message failed: $ex");
}