diff --git a/lib/main.dart b/lib/main.dart index 9699e03..2d56d7f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,6 +18,7 @@ import 'package:stadtbote/tools/connection_status.dart'; import 'package:stadtbote/tools/message_service.dart'; import 'package:stadtbote/tools/messages/job_received_message.dart'; import 'package:stadtbote/tools/messages/refresh_badges_message.dart'; +import 'package:stadtbote/tools/mqtt_core.dart'; import 'content_views/main_page.dart'; import 'content_views/utils/content_view_widget.dart'; @@ -66,26 +67,13 @@ class MyApp extends StatefulWidget { State createState() => _MyAppState(); } -class _MyAppState extends State with WidgetsBindingObserver { - @override - void initState() { - WidgetsBinding.instance.addObserver(this); +class _MyAppState extends State { + final MqttCore mqttCore = MqttCore(); + + @override void initState() { + super.initState(); _startLocationService(); - - super.initState(); - } - - @override - void dispose() { - WidgetsBinding.instance.removeObserver(this); - super.dispose(); - } - - @override - void didChangeAppLifecycleState(AppLifecycleState state) async { - super.didChangeAppLifecycleState(state); - Util.logInfo('Lifecylcle changes: $state'); } @override diff --git a/lib/tools/mqtt_core.dart b/lib/tools/mqtt_core.dart index 0dee30d..af78d80 100644 --- a/lib/tools/mqtt_core.dart +++ b/lib/tools/mqtt_core.dart @@ -180,61 +180,56 @@ class MqttCore { Util.logInfo('_setupMqtt called'); _mqttClient!.updates?.listen((List> c) { - try { - final MqttPublishMessage message = c[0].payload as MqttPublishMessage; - String payload = utf8.decode(MqttPublishPayload.bytesToStringAsString(message.payload.message).codeUnits); - var topic = message.variableHeader?.topicName; + for (var message in c) { + try { + if (message.topic.endsWith(_clientId)) { + var messageBytes = message.payload.; + String payload = utf8.decode(GZipDecoder().decodeBytes(messageBytes)); - Util.logInfo('message received\ntopic: $topic\nmessage: $payload'); + var topicArray = message.variableHeader?.topicName; + var topicArraySplited = topicArray!.split("/"); + var topic = topicArraySplited[3]; - Map messageData = jsonDecode(payload); + Util.logInfo('message received\ntopic: $topic\nmessage: $payload'); - for (var entry in messageData.keys) { - if (entry == 'payload') { - var payload = messageData[entry]; - for (var payloadEntry in payload.keys) { - var payloadData = payload[payloadEntry]; + switch(topic) { + case 'session': + _sessionMessageReceived(jsonDecode(payload)); + break; - switch (payloadEntry) { - case 'session': - _sessionMessageReceived(payloadData); - break; + case 'status': + _statusMessageReceived(jsonDecode(payload)); + break; - case 'location_status': - _locationSatusMessageReceived(jsonDecode(payload)); - break; + case 'ranks': + _rankingMessageReceived(jsonDecode(payload)); + break; - case 'ranking': - _rankingMessageReceived(jsonDecode(payload)); - break; + case 'job': + _jobMessageReceived(jsonDecode(payload)); + break; - case 'job': - _jobMessageReceived(jsonDecode(payload)); - break; + case 'job_del': + _jobDeleteReceived(jsonDecode(payload)); + break; - case 'job_del': - _jobDeleteReceived(jsonDecode(payload)); - break; + case 'sync_request': + _syncRequestReceived(jsonDecode(payload)); + break; - case 'sync_request': - _syncRequestReceived(jsonDecode(payload)); - break; + case "mssg": + _messageMessageReceived(jsonDecode(payload)); + break; - case "mssg": - _messageMessageReceived(jsonDecode(payload)); - break; + case "upload_device_log": + _messageUploadDeviceLogReceived(jsonDecode(payload)); + break; - case "upload_device_log": - _messageUploadDeviceLogReceived(jsonDecode(payload)); - break; - - default: - Util.logInfo('Unknown topic: $topic'); - break; - } + default: + Util.logInfo('Unknown topic: $topic'); + break; } } - } } catch(ex) { Util.logException(ex.toString()); } @@ -277,6 +272,16 @@ class MqttCore { _startTrackTimer(); } + void _statusMessageReceived(payloadData) async { + var statusMessage = Status.fromJson(payloadData); + + await MyApp.isarInstance.writeTxn(() async { + await MyApp.isarInstance.status.clear(); + await MyApp.isarInstance.status.put(statusMessage); + }); + + MessageService().publish(Constants.messageTopicStatusInfoUpdated, arguments: StatusInfoUpdate(status: statusMessage)); + } void _locationSatusMessageReceived(payloadData) async { var locationStatus = LocationStatus.fromJson(payloadData);