diff --git a/.gitignore b/.gitignore index 1ec2945..f68d109 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ out/ !**/src/main/**/out/ !**/src/test/**/out/ -config.json ### Eclipse ### .apt_generated diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..146ab09 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/hivemq_mqtt_client.xml b/.idea/libraries/hivemq_mqtt_client.xml new file mode 100644 index 0000000..c39a92c --- /dev/null +++ b/.idea/libraries/hivemq_mqtt_client.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FA_Gateway_Java.iml b/FA_Gateway_Java.iml index 0a81566..043fe26 100644 --- a/FA_Gateway_Java.iml +++ b/FA_Gateway_Java.iml @@ -13,5 +13,6 @@ + \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..d9d6734 --- /dev/null +++ b/config.json @@ -0,0 +1 @@ +{"Modbus_Port":502,"Modbus_MasterIP":"192.168.10.1","Modbus_SlaveID":"1","VX3KTargetIP":"192.168.14.1","VX3KTargetPort":5000,"Email_SMTPServer":"mail.galva.co.id","Email_SMTPPort":587,"Email_SMTPSSL":true,"Email_SMTPUsername":"admin","Email_SMTPPassword":"admin","Email_SMTPFrom":"fa@galva.co.id","Email_SenderName":"Fire Alarm Gateway","Email_Subject":"Fire Alarm Gateway Notification","MQTT_Broker":"34.101.202.96","MQTT_Port":1883,"MQTT_Topic":"FA_Gateway/status","MQTT_ClientID":"Pekojan","MQTT_Username":"gtcdev","MQTT_Password":"gtcdev2025"} \ No newline at end of file diff --git a/lib/annotations-26.0.2.jar b/lib/annotations-26.0.2.jar new file mode 100644 index 0000000..dbe2620 Binary files /dev/null and b/lib/annotations-26.0.2.jar differ diff --git a/lib/dagger-2.27.jar b/lib/dagger-2.27.jar new file mode 100644 index 0000000..8173b5d Binary files /dev/null and b/lib/dagger-2.27.jar differ diff --git a/lib/hivemq-mqtt-client-1.3.6.jar b/lib/hivemq-mqtt-client-1.3.6.jar new file mode 100644 index 0000000..0854e07 Binary files /dev/null and b/lib/hivemq-mqtt-client-1.3.6.jar differ diff --git a/lib/javax.inject-1.jar b/lib/javax.inject-1.jar new file mode 100644 index 0000000..b2a9d0b Binary files /dev/null and b/lib/javax.inject-1.jar differ diff --git a/lib/jctools-core-2.1.2.jar b/lib/jctools-core-2.1.2.jar new file mode 100644 index 0000000..1fb34fc Binary files /dev/null and b/lib/jctools-core-2.1.2.jar differ diff --git a/lib/netty-buffer-4.1.122.Final.jar b/lib/netty-buffer-4.1.122.Final.jar new file mode 100644 index 0000000..9176880 Binary files /dev/null and b/lib/netty-buffer-4.1.122.Final.jar differ diff --git a/lib/netty-codec-4.1.122.Final.jar b/lib/netty-codec-4.1.122.Final.jar new file mode 100644 index 0000000..28c881f Binary files /dev/null and b/lib/netty-codec-4.1.122.Final.jar differ diff --git a/lib/netty-common-4.1.122.Final.jar b/lib/netty-common-4.1.122.Final.jar new file mode 100644 index 0000000..0d4e215 Binary files /dev/null and b/lib/netty-common-4.1.122.Final.jar differ diff --git a/lib/netty-handler-4.1.122.Final.jar b/lib/netty-handler-4.1.122.Final.jar new file mode 100644 index 0000000..283ce82 Binary files /dev/null and b/lib/netty-handler-4.1.122.Final.jar differ diff --git a/lib/netty-resolver-4.1.122.Final.jar b/lib/netty-resolver-4.1.122.Final.jar new file mode 100644 index 0000000..3ba617e Binary files /dev/null and b/lib/netty-resolver-4.1.122.Final.jar differ diff --git a/lib/netty-transport-4.1.122.Final.jar b/lib/netty-transport-4.1.122.Final.jar new file mode 100644 index 0000000..4389627 Binary files /dev/null and b/lib/netty-transport-4.1.122.Final.jar differ diff --git a/lib/netty-transport-native-unix-common-4.1.122.Final.jar b/lib/netty-transport-native-unix-common-4.1.122.Final.jar new file mode 100644 index 0000000..e458369 Binary files /dev/null and b/lib/netty-transport-native-unix-common-4.1.122.Final.jar differ diff --git a/lib/reactive-streams-1.0.4.jar b/lib/reactive-streams-1.0.4.jar new file mode 100644 index 0000000..e58c483 Binary files /dev/null and b/lib/reactive-streams-1.0.4.jar differ diff --git a/lib/rxjava-2.2.21.jar b/lib/rxjava-2.2.21.jar new file mode 100644 index 0000000..377d311 Binary files /dev/null and b/lib/rxjava-2.2.21.jar differ diff --git a/src/Main.java b/src/Main.java index 13df46a..88fed90 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,8 +1,27 @@ +import mqtt.MqttClient; +import org.tinylog.Logger; + //TIP To Run code, press or // click the icon in the gutter. public class Main { private static config config; + private static MqttClient mqttClient; public static void main(String[] args) { + Logger.info("Application started"); config = new config(); + mqttClient = new MqttClient(config.getMQTT_Broker(), config.getMQTT_Port(), config.getMQTT_Username(), config.getMQTT_Password(), connected -> { + if (connected) { + Logger.info("MQTT client connected successfully."); + mqttClient.Publish(config.getMQTT_Topic(), config.getMQTT_ClientID(), "Fire Alarm Gateway Online", published -> { + if (published) { + Logger.info("Online Message published successfully."); + } else { + Logger.error("Failed to publish Online Message."); + } + }); + } else { + Logger.error("Failed to connect MQTT client."); + } + }); } } \ No newline at end of file diff --git a/src/config.java b/src/config.java index dd55083..8720384 100644 --- a/src/config.java +++ b/src/config.java @@ -6,6 +6,9 @@ import java.nio.file.Files; import java.nio.file.Path; public class config { + private @Getter @Setter int Modbus_Port = 502; + private @Getter @Setter String Modbus_MasterIP = "192.168.10.1"; + private @Getter @Setter String Modbus_SlaveID = "1"; private @Getter @Setter String VX3KTargetIP; private @Getter @Setter int VX3KTargetPort; private @Getter @Setter String Email_SMTPServer; @@ -42,6 +45,9 @@ public class config { config loadedConfig = Somecodes.gson.fromJson(configContent, config.class); if (loadedConfig != null) { // Copy values from loadedConfig to this instance + this.Modbus_MasterIP = loadedConfig.Modbus_MasterIP; + this.Modbus_Port = loadedConfig.Modbus_Port; + this.Modbus_SlaveID = loadedConfig.Modbus_SlaveID; this.VX3KTargetIP = loadedConfig.VX3KTargetIP; this.VX3KTargetPort = loadedConfig.VX3KTargetPort; this.Email_SMTPServer = loadedConfig.Email_SMTPServer; @@ -59,7 +65,6 @@ public class config { this.MQTT_Username = loadedConfig.MQTT_Username; this.MQTT_Password = loadedConfig.MQTT_Password; - Logger.info("Loaded config from {}", configPath.toAbsolutePath()); } else { Logger.error("Loaded config is null, creating Default Config"); MakeDefaults(); @@ -80,7 +85,9 @@ public class config { */ private void MakeDefaults() { // Set default values if needed - + Modbus_MasterIP = "192.168.10.1"; + Modbus_Port = 502; + Modbus_SlaveID = "1"; VX3KTargetIP = "192.168.14.1"; VX3KTargetPort = 5000; Email_SMTPServer = "mail.galva.co.id"; diff --git a/src/mqtt/MqttClient.java b/src/mqtt/MqttClient.java new file mode 100644 index 0000000..b69c141 --- /dev/null +++ b/src/mqtt/MqttClient.java @@ -0,0 +1,75 @@ +package mqtt; + +import com.hivemq.client.mqtt.mqtt3.Mqtt3AsyncClient; +import com.hivemq.client.mqtt.mqtt3.Mqtt3Client; +import com.hivemq.client.mqtt.mqtt3.message.auth.Mqtt3SimpleAuth; +import org.tinylog.Logger; + +import java.nio.charset.StandardCharsets; +import java.util.function.Consumer; + +public class MqttClient { + + Mqtt3AsyncClient client; + + /** + * Constructor to create an MQTT client and connect to the broker. + * + * @param host The hostname of the MQTT broker. + * @param port The port of the MQTT broker. + * @param username The username for authentication. + * @param password The password for authentication. + * @param connectedCallback A callback that is called when the connection is established or fails. + */ + public MqttClient(String host, int port, String username, String password, Consumer connectedCallback) { + Mqtt3AsyncClient clientx = Mqtt3Client.builder() + .simpleAuth(Mqtt3SimpleAuth.builder().username(username).password(password.getBytes(StandardCharsets.UTF_8)).build()) + .serverHost(host) + .serverPort(port) + .buildAsync(); + + clientx.connect() + .whenComplete((conn, throwable) -> { + if (throwable != null) { + client = null; + Logger.error("Failed to connect to MQTT broker at {}:{}, Message : {}", host, port, throwable.getMessage()); + if (connectedCallback != null) { + connectedCallback.accept(false); + } + } else { + client = clientx; + Logger.info("Connected to MQTT broker at {}:{}", host, port); + if (connectedCallback != null) { + connectedCallback.accept(true); + } + } + }); + } + + public void Publish(String topic, String clientID, String message, Consumer publishCallback) { + if (client == null) { + Logger.error("Cannot publish message, MQTT client is not connected."); + if (publishCallback != null) { + publishCallback.accept(false); + } + return; + } + client.publishWith() + .topic(topic+"/" + clientID) + .payload(message.getBytes(StandardCharsets.UTF_8)) + .send() + .whenComplete((pub, throwable) -> { + if (throwable != null) { + Logger.error("Failed to publish message to topic '{}', Message : {}", topic, throwable.getMessage()); + if (publishCallback != null) { + publishCallback.accept(false); + } + } else { + Logger.info("Message published to topic '{}'", topic); + if (publishCallback != null) { + publishCallback.accept(true); + } + } + }); + } +}