import 'package:agrilink_vocpro/core/state/result_state.dart'; import 'package:mqtt_client/mqtt_client.dart'; import 'package:mqtt_client/mqtt_server_client.dart'; class MQTTService { MqttServerClient? client; Future setupMqtt() async { client = MqttServerClient('armadillo.rmq.cloudamqp.com', ''); client!.port = 1883; client!.connectionMessage = MqttConnectMessage() .authenticateAs('obyskxhx:obyskxhx', 'Fe_3_tBuwmc8vMMqT2hYiboTsBlBmPz1') .withClientIdentifier('mobile_client_controller') .startClean() // reset session .withWillQos(MqttQos.atLeastOnce); try { print('MQTT: Connecting....'); await client!.connect(); print('MQTT: Connected'); return ResultState.hasData; } catch (e) { print('MQTT: Error: $e'); return ResultState.error; } } Future publishMessage(String topic, String message) async { final builder = MqttClientPayloadBuilder(); try { final bool isConnected = await isMqttConnected(); // Cek apakah terhubung if (!isConnected) { print('MQTT: Tidak terhubung ke broker. Tidak bisa publish message.'); return ResultState.error; } print('MQTT: Published message to $topic: $message'); builder.addString(message); client!.publishMessage(topic, MqttQos.atMostOnce, builder.payload!); print('MQTT: Message published'); return ResultState.hasData; } catch (e) { print('MQTT: Error: $e'); return ResultState.error; } } Future disconnectMqtt() async { final bool isConnected = await isMqttConnected(); if (isConnected) { print('Memutus koneksi dari broker...'); client!.disconnect(); await Future.delayed(const Duration(seconds: 1)); print('Koneksi telah terputus.'); return ResultState.hasData; } else { print('Tidak ada koneksi yang sedang aktif.'); return ResultState.error; } } Future isMqttConnected() async { if (client != null && client!.connectionStatus!.state == MqttConnectionState.connected) { return true; //connected } else { return false; //not connected } } Future subscribeToTopic(String topic) async { bool isActive = false; if (client != null && client!.connectionStatus!.state == MqttConnectionState.connected) { try { print('MQTT: Subscribing to $topic'); client!.subscribe(topic, MqttQos.atMostOnce); print('MQTT: Subscribed to $topic'); // Tambahkan log ini untuk memastikan bahwa listener dijalankan if (client!.updates != null) { print('MQTT: Listening for updates...'); } else { print('MQTT: No updates stream available'); } client!.updates!.listen( (List>? messages) { print('MQTT: Message received!'); if (messages != null && messages.isNotEmpty) { final MqttPublishMessage recMessage = messages[0].payload as MqttPublishMessage; final String payload = MqttPublishPayload.bytesToStringAsString( recMessage.payload.message); print( 'MQTT: Message received on topic ${messages[0].topic}: $payload'); if (payload == 'ON') { isActive = true; // Update UI atau provider untuk menandakan relay ON } else if (payload == 'OFF') { isActive = false; // Update UI atau provider untuk menandakan relay OFF } } else { print('MQTT: No messages received'); } }, ); return isActive; } catch (e) { print('MQTT: Error subscribing to $topic: $e'); return isActive; } } else { print('MQTT: Not connected, cannot subscribe.'); return false; } } }