import 'dart:convert'; import 'package:mqtt_client/mqtt_client.dart'; import 'package:mqtt_client/mqtt_server_client.dart'; import 'package:myhomie_app/Models/homieContext.dart'; import 'package:myhomie_app/app_context.dart'; import 'package:uuid/uuid.dart'; class MQTTHelper { MQTTHelper._privateConstructor(); bool isInstantiated = false; static final MQTTHelper instance = MQTTHelper._privateConstructor(); void onConnected(AppContext appContext) { print('Connected !!!!!!!!!!!! ----------------------------------'); HomieAppContext homieAppContext = appContext.getContext(); homieAppContext.clientMQTT.subscribe("test/rpi", MqttQos.atLeastOnce); print(homieAppContext.clientMQTT); homieAppContext.clientMQTT.updates!.listen((List> c) async { print("IN Received message"); final MqttMessage? message = c[0].payload; /*final payload = MqttPublishPayload.bytesToStringAsString(message!); print('Received message:$payload from topic: ${c[0].topic}');*/ appContext.setLastMessage('Received message:$message from topic: ${c[0].topic}'); var topic = c[0].topic.split('/')[0]; switch(topic) { case "config": print('Get message in topic config = $message'); break; case "player": print('Get message in topic player = $message'); // refresh device info try { } catch(e) { print('Error = $e'); } break; } }); } // unconnected void onDisconnected() { print('Disconnected'); } // subscribe to topic succeeded void onSubscribed(String topic) { print('Subscribed topic: $topic'); } // subscribe to topic failed void onSubscribeFail(String topic) { print('Failed to subscribe $topic'); } // unsubscribe succeeded void onUnsubscribed(String topic) { print('Unsubscribed topic: $topic'); } Future connect(dynamic appContext) async { HomieAppContext homieAppContext = appContext.getContext(); // TO DEBUG print(homieAppContext.host); if(homieAppContext.host != null) { homieAppContext.clientMQTT = MqttServerClient.withPort(homieAppContext.host!.replaceAll('http://', ''), 'homie_app_'+ Uuid().v1(), 1883); isInstantiated = true; homieAppContext.clientMQTT.logging(on: false); homieAppContext.clientMQTT.keepAlivePeriod = 20; homieAppContext.clientMQTT.onDisconnected = onDisconnected; homieAppContext.clientMQTT.onConnected = () => onConnected(appContext); homieAppContext.clientMQTT.onSubscribed = onSubscribed; var message = { "userId": homieAppContext.userId, "connected": false }; print("Try connect mqtt"); final connMessage = MqttConnectMessage().authenticateAs('user', 'user') // TODO ONLINE .keepAliveFor(60) .withWillTopic('player/status') .withWillMessage(jsonEncode(message)) .withClientIdentifier('tablet_app_'+homieAppContext.userId!) .startClean() .withWillQos(MqttQos.atLeastOnce); homieAppContext.clientMQTT.connectionMessage = connMessage; homieAppContext.clientMQTT.autoReconnect = true; try { await homieAppContext.clientMQTT.connect(); } catch (e) { print('Exception: $e'); homieAppContext.clientMQTT.disconnect(); } appContext.setContext(homieAppContext); // TODO CLEAN return homieAppContext.clientMQTT; } return null; } }