Skip to content
Snippets Groups Projects
Subscriber.java 6.31 KiB
Newer Older
  • Learn to ignore specific revisions
  • A C's avatar
    A C committed
    package code;
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    import java.io.File;
    import java.io.IOException;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
    import java.util.ArrayList;
    import java.util.Date;
    
    import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
    import org.eclipse.paho.client.mqttv3.MqttCallback;
    import org.eclipse.paho.client.mqttv3.MqttException;
    import org.eclipse.paho.client.mqttv3.MqttMessage;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    //import scenari.Automa;
    //import scenari.Scenari;
    
    
    A C's avatar
    A C committed
    public class Subscriber implements MqttCallback {
    
    A C's avatar
    A C committed
    
    	private Luci luci;
    	private Esecutore esec;
    
    A C's avatar
    A C committed
    	static Boolean runningEsec;
    
    A C's avatar
    A C committed
    	public String sensM;
    
    A C's avatar
    A C committed
    	Boolean giorno=false;
    
    
    A C's avatar
    A C committed
    	public Subscriber(Luci luci, Esecutore esec, String sensm) {
    
    A C's avatar
    A C committed
    		this.luci = luci;
    
    A C's avatar
    A C committed
    		this.esec = esec;
    		this.sensM = sensm;
    
    A C's avatar
    A C committed
    		Subscriber.runningEsec = false;
    
    A C's avatar
    A C committed
    	}
    
    	@Override
    	public void connectionLost(Throwable arg0) {
    
    A C's avatar
    A C committed
    		Helper.print("connessione persa\t" + arg0);
    
    A C's avatar
    A C committed
    		final Date d = new Date();
    		Date d2 = new Date();
    
    A C's avatar
    A C committed
    		long time = Math.abs(d2.getTime() - d.getTime());
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    		while (time < 600000) {
    
    A C's avatar
    A C committed
    			try {
    				Helper.print("retrying...");
    
    				Luci.main(null);
    				return;
    			} catch (MqttException | JSONException | IOException e) {
    				Helper.print("non sono riusciuto");
    				d2 = new Date();
    
    A C's avatar
    A C committed
    				time = Math.abs(d2.getTime() - d.getTime());
    
    A C's avatar
    A C committed
    			}
    		}
    		Helper.print("fuori dal while");
    
    A C's avatar
    A C committed
    		if (time >= 600000) {
    
    A C's avatar
    A C committed
    			Helper.print("Tentativo di riconnessione fallito");
    			System.exit(1);
    		}
    	}
    
    	@Override
    	public void deliveryComplete(IMqttDeliveryToken arg0) {
    		Helper.print("inviato");
    	}
    
    	@Override
    	public void messageArrived(String topic, MqttMessage message) throws MqttException, JSONException, IOException {
    
    A C's avatar
    A C committed
    
    		Helper.print("new message: " + topic + "  " + message.toString());
    
    		if (topic.equals(Luci.getMqttTree("rpc/", "luci"))) {
    
    A C's avatar
    A C committed
    			Helper.print("invio la mia configurazione");
    
    A C's avatar
    A C committed
    			sendFile(Luci.getMqttTree("from/", "luci"));
    
    A C's avatar
    A C committed
    			return;
    		}
    
    A C's avatar
    A C committed
    
    		if (topic.equals("to/all")) {
    
    A C's avatar
    A C committed
    			Helper.print("invio il mio stato");
    
    A C's avatar
    A C committed
    			sendStatus(Luci.getMqttTree("from/", "luci"));
    
    A C's avatar
    A C committed
    			return;
    		}
    
    		JSONObject msgJson = new JSONObject(message.toString());
    
    
    A C's avatar
    A C committed
    		// la beaglebone risponde sutopic {"event":1} se è acceso, 0 altrimenti
    
    		if (topic.equals(Luci.getMqttTree("to", "luci/new"))) {
    
    
    A C's avatar
    A C committed
    			JSONObject config = new JSONObject(Helper.leggiFile(Luci.FILE_ZONA));
    
    A C's avatar
    A C committed
    
    			String nome = msgJson.getString("nome");
    			for (Luce k : Luci.luciList) {
    				if (k.getNome().equalsIgnoreCase(nome)) {
    
    A C's avatar
    A C committed
    					System.out.println("Nome gia' presente, inserimento annullato\n");
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    					return;
    				}
    			}
    
    A C's avatar
    A C committed
    			int k = Luci.luciList.size();
    			config.put("lamp" + k, msgJson);
    			// System.out.println("---"+config);
    			Luci.luciList.add(new Luce(msgJson));// ,"lamp"+k
    
    A C's avatar
    A C committed
    			Helper.scriviFile(config, Luci.FILE_ZONA);
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    			luci.sendMqttMessage(Luci.getMqttTree("from", "luci/new"), msgJson.toString());
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    			return;
    
    A C's avatar
    A C committed
    		}
    
    A C's avatar
    A C committed
    
    		if (topic.equals(Luci.getMqttTree("to", "luci/sensore"))) {
    			// salvati il sensore di movimento
    
    			sensM = msgJson.getString("sensM");
    			// devo aggiornare in file
    
    A C's avatar
    A C committed
    			JSONObject config = new JSONObject(Helper.leggiFile(Luci.FILE_ZONA));
    			config.put("sensM", sensM);
    			Helper.scriviFile(config, Luci.FILE_ZONA);
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    			luci.sendMqttMessage(Luci.getMqttTree("from", "luci/sensore"), msgJson.toString());
    
    A C's avatar
    A C committed
    			return;
    
    A C's avatar
    A C committed
    
    		} // gruppo2/luci/luci/sensore
    
    		// sensM tempo
    		if (topic.equals(Luci.getMqttTree("from", "gpio/" + sensM))) {
    			System.out.println(giorno);
    			if(giorno)return;
    
    A C's avatar
    A C committed
    			
    
    A C's avatar
    A C committed
    			if (msgJson.has("event") && msgJson.getInt("event") == 1) {
    				if (runningEsec) {
    					Esecutore.timer.cancel();
    					Esecutore.timer.purge();
    				} else {
    					for (Luce k : Luci.luciList) {
    						if (k.getStato())
    							Esecutore.j.add(k);
    					}
    				}
    				runningEsec = true;
    				esec.run(runningEsec);
    //				
    			}
    
    A C's avatar
    A C committed
    			return;
    		}
    
    A C's avatar
    A C committed
    
    		// controllo i topic su cui mi arrivano gli on/off
    		if (topic.startsWith(Luci.getMqttTree("from", "gpio/IN"))) {
    			// prendo l'ultimo pezzo del topic, diventa il mio nome
    
    			String pezzo = topic.substring(23);// seleziono solo il nome della lamp
    			System.out.println("nome lamp\t" + pezzo);
    
    			for (int i = 0; i < Luci.luciList.size(); i++) {
    				if (Luci.luciList.get(i).getIN().equalsIgnoreCase(pezzo) && msgJson.has("event")
    						&& msgJson.getInt("event") == 1) {// non è k.getIN()?
    
    					String req = Luci.luciList.get(i).getStato() ? "{cmd:0}" : "{cmd:1}";
    					luci.sendMqttMessage(Luci.getMqttTree("to", "gpio/" + Luci.luciList.get(i).getOUT()), req);
    
    A C's avatar
    A C committed
    				}
    			}
    
    A C's avatar
    A C committed
    			return;
    		} // gruppo2/luci/luci/sensore
    
    		if (topic.startsWith(Luci.getMqttTree("from", "gpio/OUT"))) {
    			if (msgJson.has("status"))
    				return;
    			String pezzo = topic.substring(23);// seleziono solo il nome della lamp
    			System.out.println("nome lamp\t" + pezzo);
    
    			for (int i = 0; i < Luci.luciList.size(); i++) {
    				if (Luci.luciList.get(i).getOUT().equalsIgnoreCase(pezzo) && msgJson.has("event")) {
    					// && msgJson.getInt("event")==1)
    
    					boolean stato = msgJson.getInt("event") == 1;
    
    					Luci.luciList.get(i).setStato(stato);// (!Luci.luciList.get(i).getStato());
    
    
    A C's avatar
    A C committed
    					JSONObject config = new JSONObject(Helper.leggiFile(Luci.FILE_ZONA));
    
    A C's avatar
    A C committed
    
    					JSONObject lux = new JSONObject();
    
    A C's avatar
    A C committed
    					lux.put("nome", Luci.luciList.get(i).getNome());
    					lux.put("stato", Luci.luciList.get(i).getStato());
    					lux.put("input", Luci.luciList.get(i).getIN());
    					lux.put("output", Luci.luciList.get(i).getOUT());
    
    A C's avatar
    A C committed
    
    					config.put("lamp" + i, lux);
    
    					Helper.scriviFile(config, Luci.FILE_ZONA);
    					// mando conferma
    
    A C's avatar
    A C committed
    					lux.remove("input");
    					lux.remove("nome");
    
    A C's avatar
    A C committed
    					luci.sendMqttMessage(Luci.getMqttTree("from", "luci/luce"), lux.toString());
    
    
    A C's avatar
    A C committed
    				}
    			}
    
    A C's avatar
    A C committed
    			return;
    		}
    
    A C's avatar
    A C committed
    		
    
    A C's avatar
    A C committed
    		if (topic.startsWith(Luci.getMqttTree("from", "arduino/AN0"))) {
    			if (msgJson.has("event")){
    //				
    //				if(msgJson.getInt("event")<200)giorno=false;
    //				else giorno=true;
    				
    				giorno=(msgJson.getInt("event")>=200);
    			}
    		return;
    		}
    		
    
    
    A C's avatar
    A C committed
    		Helper.print("Impossibile");
    	}
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    	private void sendFile(String topic) throws MqttException, JSONException, IOException {
    
    A C's avatar
    A C committed
    		JSONObject j = new JSONObject(Helper.leggiFile(Luci.FILE_ZONA));
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    		luci.sendMqttMessage(topic, j.toString());
    	}
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    	private void sendStatus(String topic) throws MqttException, JSONException, IOException {
    
    A C's avatar
    A C committed
    		JSONObject j = new JSONObject(Helper.leggiFile(Luci.FILE_ZONA));
    
    A C's avatar
    A C committed
    		j.remove("sensM");
    
    A C's avatar
    A C committed
    
    
    A C's avatar
    A C committed
    		luci.sendMqttMessage(topic, j.toString());
    	}
    
    }