import 'package:mqtt5_client/mqtt5_client.dart'; import 'package:mqtt5_client/mqtt5_server_client.dart'; class Mqtt { final MqttConfig _config; MqttClient? _client; Mqtt(this._config); static late Mqtt _mqtt; static Mqtt getInstance() { return _mqtt; } static void setInstance(Mqtt server) { _mqtt = server; } Future connect() async { if (_client != null) { return true; } _client = MqttServerClient.withPort(_config.host, _config.clientId, _config.port); _client?.autoReconnect = true; await _client?.connect(_config.username, _config.password); _client?.updates.listen((List> message) { final recMess = message[0].payload as MqttPublishMessage; final payload = MqttUtilities.bytesToStringAsString(recMess.payload.message!); _config.messgae(message[0].topic!, payload); }); _config.topic?.forEach((topic) { subscribe(topic, _config.qos); }); return true; } void disconnect() { _client?.disconnect(); _client = null; } void subscribe(String topic, int qos) { _client?.subscribe(topic, MqttUtilities.getQosLevel(qos)); } void unSubscribe(String topic) { _client?.unsubscribeStringTopic(topic); } void publish(String topic, String msg, {int qos = 0}) { var payload = MqttPayloadBuilder(); payload.addString(msg); _client?.publishMessage( topic, MqttUtilities.getQosLevel(qos), payload.payload!); } } class MqttConfig { final String host; final int port; final String clientId; String? username; String? password; List? topic; int qos; Function(String topic, String message) messgae; MqttConfig( {required this.host, this.port = 1883, required this.clientId, required this.messgae, this.topic, this.qos = 0, this.username, this.password}); }