alter mqttservice to gradle
This commit is contained in:
		@@ -8,31 +8,31 @@ import com.wasteinformationserver.website.Webserver
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
 | 
			
		||||
fun main() {
 | 
			
		||||
    Log.Log.setLevel(Log.Log.DEBUG)
 | 
			
		||||
    Log.setLevel(Log.DEBUG)
 | 
			
		||||
    Info.init()
 | 
			
		||||
 | 
			
		||||
    Log.Log.info("startup of WasteInformationServer")
 | 
			
		||||
    Log.info("startup of WasteInformationServer")
 | 
			
		||||
 | 
			
		||||
    Runtime.getRuntime().addShutdownHook(Thread(Runnable {
 | 
			
		||||
        try {
 | 
			
		||||
            Thread.sleep(200)
 | 
			
		||||
            Log.Log.warning("Shutting down ...")
 | 
			
		||||
            Log.warning("Shutting down ...")
 | 
			
		||||
            //shutdown routine
 | 
			
		||||
        } catch (e: InterruptedException) {
 | 
			
		||||
            e.printStackTrace()
 | 
			
		||||
        }
 | 
			
		||||
    }))
 | 
			
		||||
 | 
			
		||||
    Log.Log.info("Server version: " + Info.getVersion())
 | 
			
		||||
    Log.Log.debug("Build date: " + Info.getBuilddate())
 | 
			
		||||
    Log.info("Server version: " + Info.getVersion())
 | 
			
		||||
    Log.debug("Build date: " + Info.getBuilddate())
 | 
			
		||||
 | 
			
		||||
    //initial connect to db
 | 
			
		||||
    Log.Log.message("initial login to db")
 | 
			
		||||
    Log.message("initial login to db")
 | 
			
		||||
    try {
 | 
			
		||||
        JDBC.init("ingproject", "Kb9Dxklumt76ieq6", "ingproject", "db.power4future.at", 3306)
 | 
			
		||||
        //JDBC.init("users", "kOpaIJUjkgb9ur6S", "wasteinformation", "192.168.65.15", 3306);
 | 
			
		||||
    } catch (e: IOException) { //e.printStackTrace();
 | 
			
		||||
        Log.Log.error("no connection to db")
 | 
			
		||||
        Log.error("no connection to db")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -42,7 +42,7 @@ fun main() {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //startup mqtt service
 | 
			
		||||
    Log.Log.message("starting mqtt service")
 | 
			
		||||
    Log.message("starting mqtt service")
 | 
			
		||||
 | 
			
		||||
    val m = MqttService("mqtt.heili.eu", "1883")
 | 
			
		||||
    m.startupService()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,200 +0,0 @@
 | 
			
		||||
package com.wasteinformationserver.mqtt;
 | 
			
		||||
 | 
			
		||||
import com.wasteinformationserver.basicutils.Log;
 | 
			
		||||
import com.wasteinformationserver.db.JDBC;
 | 
			
		||||
import org.eclipse.paho.client.mqttv3.*;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.sql.ResultSet;
 | 
			
		||||
import java.sql.SQLException;
 | 
			
		||||
import java.text.ParseException;
 | 
			
		||||
import java.text.SimpleDateFormat;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Mqtt Service to receive and send back messages to the Hardware
 | 
			
		||||
 * todo
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lukas Heiligenbrunner
 | 
			
		||||
 * @author Gregor Dutzler
 | 
			
		||||
 */
 | 
			
		||||
public class MqttService {
 | 
			
		||||
    private MqttClient client = null;
 | 
			
		||||
    private String serveruri;
 | 
			
		||||
    private JDBC db;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * init mqtt service
 | 
			
		||||
     * JDBC has to be inited before
 | 
			
		||||
     *
 | 
			
		||||
     * @param serverurl mqtt server ip or hostname
 | 
			
		||||
     * @param port      mqtt server port
 | 
			
		||||
     */
 | 
			
		||||
    public MqttService(String serverurl, String port) {
 | 
			
		||||
        serveruri = "tcp://" + serverurl + ":" + port;
 | 
			
		||||
        try {
 | 
			
		||||
            db = JDBC.getInstance();
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            Log.Log.error("no connetion to db");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * startup of the mqtt service
 | 
			
		||||
     */
 | 
			
		||||
    public void startupService() {
 | 
			
		||||
        try {
 | 
			
		||||
            client = new MqttClient(serveruri, "JavaSample42");
 | 
			
		||||
            MqttConnectOptions connOpts = new MqttConnectOptions();
 | 
			
		||||
            connOpts.setCleanSession(true);
 | 
			
		||||
            client.connect(connOpts);
 | 
			
		||||
 | 
			
		||||
            client.setCallback(new MqttCallback() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void connectionLost(Throwable throwable) {
 | 
			
		||||
                    Log.Log.error("connection lost");
 | 
			
		||||
                    // TODO: 12.01.20 reconnect
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void messageArrived(String s, MqttMessage mqttMessage) {
 | 
			
		||||
                    String deviceid = new String(mqttMessage.getPayload());
 | 
			
		||||
                    Log.Log.message("received Request from PCB");
 | 
			
		||||
 | 
			
		||||
                    ResultSet res = db.executeQuery("SELECT * from devices WHERE DeviceID=" + deviceid);
 | 
			
		||||
                    try {
 | 
			
		||||
                        res.last();
 | 
			
		||||
                        if (res.getRow() != 0) {
 | 
			
		||||
                            //existing device
 | 
			
		||||
                            res.first();
 | 
			
		||||
 | 
			
		||||
                            ResultSet devicecities = db.executeQuery("SELECT * from device_city WHERE DeviceID='" + deviceid + "'");
 | 
			
		||||
                            devicecities.last();
 | 
			
		||||
                            if (devicecities.getRow() == 0) {
 | 
			
		||||
                                //not configured
 | 
			
		||||
                                tramsmitMessage(deviceid + ",-1");
 | 
			
		||||
                            } else {
 | 
			
		||||
                                devicecities.first();
 | 
			
		||||
                                devicecities.previous();
 | 
			
		||||
                                // TODO: 23.01.20 Test this stuff
 | 
			
		||||
                                while (devicecities.next()) {
 | 
			
		||||
                                    int cityid = devicecities.getInt("CityID");
 | 
			
		||||
                                    checkDatabase(cityid, Integer.parseInt(deviceid));
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                        } else {
 | 
			
		||||
                            //new device
 | 
			
		||||
                            db.executeUpdate("INSERT INTO devices (DeviceID) VALUES (" + deviceid + ")");
 | 
			
		||||
                            Log.Log.info("new device registered to server");
 | 
			
		||||
                            tramsmitMessage(deviceid + ",-1");
 | 
			
		||||
                        }
 | 
			
		||||
                    } catch (SQLException e) {
 | 
			
		||||
                        e.printStackTrace();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            client.subscribe("TopicIn");
 | 
			
		||||
        } catch (MqttException e) {
 | 
			
		||||
            Log.Log.error("Connection to the Broker failed");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void checkDatabase(int citywastezoneid, int deviceid) {
 | 
			
		||||
        int wastetype = -1;
 | 
			
		||||
        ResultSet set2 = db.executeQuery("SELECT * FROM cities WHERE `id`='" + citywastezoneid + "'");
 | 
			
		||||
        try {
 | 
			
		||||
            set2.last();
 | 
			
		||||
            if (set2.getRow() != 1) {
 | 
			
		||||
                //error
 | 
			
		||||
            } else {
 | 
			
		||||
                String typ = set2.getString("wastetype");
 | 
			
		||||
                wastetype = getIntTyp(typ);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (SQLException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ResultSet result = db.executeQuery("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=" + citywastezoneid);
 | 
			
		||||
        try {
 | 
			
		||||
            result.last();
 | 
			
		||||
            if (result.getRow() == 0) {
 | 
			
		||||
                //if not found in db --> send zero
 | 
			
		||||
                Log.Log.debug("not found in db");
 | 
			
		||||
 | 
			
		||||
                tramsmitMessage(deviceid + "," + wastetype + "," + 0);
 | 
			
		||||
            } else {
 | 
			
		||||
                Log.Log.debug(result.getString("pickupdate"));
 | 
			
		||||
 | 
			
		||||
                result.first();
 | 
			
		||||
                do {
 | 
			
		||||
                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
 | 
			
		||||
                    long timestamp = formatter.parse(result.getString("pickupdate")).getTime();
 | 
			
		||||
                    long timestampnow = formatter.parse(formatter.format(new Date())).getTime();
 | 
			
		||||
                    Log.Log.debug("timestamp is :" + timestamp);
 | 
			
		||||
 | 
			
		||||
                    if (timestamp == timestampnow || timestamp == timestampnow + 86400000) { // 86400000 == one day
 | 
			
		||||
                        // valid time
 | 
			
		||||
                        tramsmitMessage(deviceid + "," + wastetype + "," + 1);
 | 
			
		||||
                        Log.Log.debug("valid time");
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                } while (result.next());
 | 
			
		||||
                tramsmitMessage(deviceid + "," + wastetype + "," + 0); //transmit zero if not returned before
 | 
			
		||||
            }
 | 
			
		||||
        } catch (SQLException | ParseException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private void tramsmitMessage(String temp) {
 | 
			
		||||
        Log.Log.debug("sending message >>>" + temp);
 | 
			
		||||
        MqttMessage message = new MqttMessage(temp.getBytes());
 | 
			
		||||
        message.setQos(2);
 | 
			
		||||
        try {
 | 
			
		||||
            client.publish("TopicOut", message);
 | 
			
		||||
        } catch (MqttException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String getTyp(int number) {
 | 
			
		||||
        if (number == 1) {
 | 
			
		||||
            return "Plastic";
 | 
			
		||||
        } else if (number == 2) {
 | 
			
		||||
            return "Metal";
 | 
			
		||||
        } else if (number == 3) {
 | 
			
		||||
            return "Residual waste";
 | 
			
		||||
        } else if (number == 4) {
 | 
			
		||||
            return "Biowaste";
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int getIntTyp(String temp) {
 | 
			
		||||
        int number = 0;
 | 
			
		||||
        switch (temp) {
 | 
			
		||||
            case "Plastic":
 | 
			
		||||
                number = 1;
 | 
			
		||||
                break;
 | 
			
		||||
            case "Metal":
 | 
			
		||||
                number = 2;
 | 
			
		||||
                break;
 | 
			
		||||
            case "Residual waste":
 | 
			
		||||
                number = 3;
 | 
			
		||||
                break;
 | 
			
		||||
            case "Biowaste":
 | 
			
		||||
                number = 4;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        return number;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										178
									
								
								src/java/com/wasteinformationserver/mqtt/MqttService.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								src/java/com/wasteinformationserver/mqtt/MqttService.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,178 @@
 | 
			
		||||
package com.wasteinformationserver.mqtt
 | 
			
		||||
 | 
			
		||||
import com.wasteinformationserver.basicutils.Log.Log.debug
 | 
			
		||||
import com.wasteinformationserver.basicutils.Log.Log.error
 | 
			
		||||
import com.wasteinformationserver.basicutils.Log.Log.info
 | 
			
		||||
import com.wasteinformationserver.basicutils.Log.Log.message
 | 
			
		||||
import com.wasteinformationserver.db.JDBC
 | 
			
		||||
import org.eclipse.paho.client.mqttv3.*
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
import java.sql.SQLException
 | 
			
		||||
import java.text.ParseException
 | 
			
		||||
import java.text.SimpleDateFormat
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Mqtt Service to receive and send back messages to the Hardware
 | 
			
		||||
 * todo
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lukas Heiligenbrunner
 | 
			
		||||
 * @author Gregor Dutzler
 | 
			
		||||
 */
 | 
			
		||||
class MqttService(serverurl: String, port: String) {
 | 
			
		||||
    private var client: MqttClient? = null
 | 
			
		||||
    private val serveruri: String
 | 
			
		||||
    private var db: JDBC? = null
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * init mqtt service
 | 
			
		||||
     * JDBC has to be inited before
 | 
			
		||||
     *
 | 
			
		||||
     * @param serverurl mqtt server ip or hostname
 | 
			
		||||
     * @param port      mqtt server port
 | 
			
		||||
     */
 | 
			
		||||
    init {
 | 
			
		||||
        serveruri = "tcp://$serverurl:$port"
 | 
			
		||||
        connect()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * startup of the mqtt service
 | 
			
		||||
     */
 | 
			
		||||
    fun startupService() {
 | 
			
		||||
        try {
 | 
			
		||||
            client = MqttClient(serveruri, "JavaSample42")
 | 
			
		||||
            val connOpts = MqttConnectOptions()
 | 
			
		||||
            connOpts.isCleanSession = true
 | 
			
		||||
            client!!.connect(connOpts)
 | 
			
		||||
            client!!.setCallback(object : MqttCallback {
 | 
			
		||||
                override fun connectionLost(throwable: Throwable) {
 | 
			
		||||
                    error("connection lost")
 | 
			
		||||
                    connect()
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                override fun messageArrived(s: String, mqttMessage: MqttMessage) {
 | 
			
		||||
                    val deviceid = String(mqttMessage.payload)
 | 
			
		||||
                    message("received Request from PCB")
 | 
			
		||||
                    val res = db!!.executeQuery("SELECT * from devices WHERE DeviceID=$deviceid")
 | 
			
		||||
                    try {
 | 
			
		||||
                        res.last()
 | 
			
		||||
                        if (res.row != 0) { //existing device
 | 
			
		||||
                            res.first()
 | 
			
		||||
                            val devicecities = db!!.executeQuery("SELECT * from device_city WHERE DeviceID='$deviceid'")
 | 
			
		||||
                            devicecities.last()
 | 
			
		||||
                            if (devicecities.row == 0) { //not configured
 | 
			
		||||
                                tramsmitMessage("$deviceid,-1")
 | 
			
		||||
                            } else {
 | 
			
		||||
                                devicecities.first()
 | 
			
		||||
                                devicecities.previous()
 | 
			
		||||
 | 
			
		||||
                                while (devicecities.next()) {
 | 
			
		||||
                                    val cityid = devicecities.getInt("CityID")
 | 
			
		||||
                                    checkDatabase(cityid, deviceid.toInt())
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        } else { //new device
 | 
			
		||||
                            db!!.executeUpdate("INSERT INTO devices (DeviceID) VALUES ($deviceid)")
 | 
			
		||||
                            info("new device registered to server")
 | 
			
		||||
                            tramsmitMessage("$deviceid,-1")
 | 
			
		||||
                        }
 | 
			
		||||
                    } catch (e: SQLException) {
 | 
			
		||||
                        e.printStackTrace()
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                override fun deliveryComplete(iMqttDeliveryToken: IMqttDeliveryToken) {}
 | 
			
		||||
            })
 | 
			
		||||
            client!!.subscribe("TopicIn")
 | 
			
		||||
        } catch (e: MqttException) {
 | 
			
		||||
            error("Connection to the Broker failed")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun checkDatabase(citywastezoneid: Int, deviceid: Int) {
 | 
			
		||||
        var wastetype = -1
 | 
			
		||||
        val set2 = db!!.executeQuery("SELECT * FROM cities WHERE `id`='$citywastezoneid'")
 | 
			
		||||
        try {
 | 
			
		||||
            set2.last()
 | 
			
		||||
            if (set2.row != 1) { //error
 | 
			
		||||
            } else {
 | 
			
		||||
                val typ = set2.getString("wastetype")
 | 
			
		||||
                wastetype = getIntTyp(typ)
 | 
			
		||||
            }
 | 
			
		||||
        } catch (e: SQLException) {
 | 
			
		||||
            e.printStackTrace()
 | 
			
		||||
        }
 | 
			
		||||
        val result = db!!.executeQuery("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=$citywastezoneid")
 | 
			
		||||
        try {
 | 
			
		||||
            result.last()
 | 
			
		||||
            if (result.row == 0) { //if not found in db --> send zero
 | 
			
		||||
                debug("not found in db")
 | 
			
		||||
                tramsmitMessage("$deviceid,$wastetype,0")
 | 
			
		||||
            } else {
 | 
			
		||||
                debug(result.getString("pickupdate"))
 | 
			
		||||
                result.first()
 | 
			
		||||
                do {
 | 
			
		||||
                    val formatter = SimpleDateFormat("yyyy-MM-dd")
 | 
			
		||||
                    val timestamp = formatter.parse(result.getString("pickupdate")).time
 | 
			
		||||
                    val timestampnow = formatter.parse(formatter.format(Date())).time
 | 
			
		||||
                    debug("timestamp is :$timestamp")
 | 
			
		||||
                    if (timestamp == timestampnow || timestamp == timestampnow + 86400000) { // 86400000 == one day
 | 
			
		||||
                        // valid time
 | 
			
		||||
                        tramsmitMessage("$deviceid,$wastetype,1")
 | 
			
		||||
                        debug("valid time")
 | 
			
		||||
                        return
 | 
			
		||||
                    }
 | 
			
		||||
                } while (result.next())
 | 
			
		||||
                tramsmitMessage("$deviceid,$wastetype,0") //transmit zero if not returned before
 | 
			
		||||
            }
 | 
			
		||||
        } catch (e: SQLException) {
 | 
			
		||||
            e.printStackTrace()
 | 
			
		||||
        } catch (e: ParseException) {
 | 
			
		||||
            e.printStackTrace()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun tramsmitMessage(temp: String) {
 | 
			
		||||
        debug("sending message >>>$temp")
 | 
			
		||||
        val message = MqttMessage(temp.toByteArray())
 | 
			
		||||
        message.qos = 2
 | 
			
		||||
        try {
 | 
			
		||||
            client!!.publish("TopicOut", message)
 | 
			
		||||
        } catch (e: MqttException) {
 | 
			
		||||
            e.printStackTrace()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun getTyp(number: Int): String? {
 | 
			
		||||
        if (number == 1) {
 | 
			
		||||
            return "Plastic"
 | 
			
		||||
        } else if (number == 2) {
 | 
			
		||||
            return "Metal"
 | 
			
		||||
        } else if (number == 3) {
 | 
			
		||||
            return "Residual waste"
 | 
			
		||||
        } else if (number == 4) {
 | 
			
		||||
            return "Biowaste"
 | 
			
		||||
        }
 | 
			
		||||
        return null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun getIntTyp(temp: String): Int {
 | 
			
		||||
        var number = 0
 | 
			
		||||
        when (temp) {
 | 
			
		||||
            "Plastic" -> number = 1
 | 
			
		||||
            "Metal" -> number = 2
 | 
			
		||||
            "Residual waste" -> number = 3
 | 
			
		||||
            "Biowaste" -> number = 4
 | 
			
		||||
        }
 | 
			
		||||
        return number
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun connect() {
 | 
			
		||||
        try {
 | 
			
		||||
            db = JDBC.getInstance()
 | 
			
		||||
        } catch (e: IOException) {
 | 
			
		||||
            error("no connetion to db")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user