import 'dart:convert'; import 'package:agrilink_vocpro/core/constant/app_constant.dart'; 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(AppConstant.mqttServer, ''); client!.port = 1883; client!.connectionMessage = MqttConnectMessage() .authenticateAs(AppConstant.mqttUsername, AppConstant.mqttPassword) .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: Subscribe 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: Subscribe 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: Invalid Subscribe message received'); } } else { print('MQTT: No Subscribe messages received'); } }, ); return isActive; } catch (e) { print('MQTT: Error subscribing to $topic: $e'); return isActive; } } else { print('MQTT: Not connected, cannot subscribe.'); return false; } } Future subscribeToRelayStatus() async { if (client != null && client!.connectionStatus!.state == MqttConnectionState.connected) { try { print('MQTT: Subscribing to /smartfarming/getRelayStatus'); client!.subscribe('smartfarming/getRelayStatus', MqttQos.atMostOnce); print('MQTT: Subscribed to /smartfarming/getRelayStatus'); client!.updates! .listen((List>? messages) { 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'); // Parse the received JSON payload final Map relayStatus = jsonDecode(payload); print('MQTT: Relay status: $relayStatus'); // Assuming you are using provider, notify it with new relay status // _updateRelayStatus(relayStatus); } else { print('MQTT: No messages received'); } }); return ResultState.hasData; } catch (e) { print('MQTT: Error subscribing: $e'); return ResultState.error; } } else { print('MQTT: Not connected, cannot subscribe.'); return ResultState.error; } } }