Skip to content
Snippets Groups Projects
Subscriber.java 5.58 KiB
Newer Older
  • Learn to ignore specific revisions
  • A C's avatar
    A C committed
    package code;
    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;
    
    public class Subscriber implements MqttCallback{
    
    	private Luci luci;
    	private Esecutore esec;
    	public String sensM;
    	
    	public Subscriber(Luci luci, Esecutore esec, String sensm) {
    		this.luci=luci;
    		this.esec = esec;
    		this.sensM = sensm;
    	}
    
    	@Override
    	public void connectionLost(Throwable arg0) {
    		Helper.print("connessione persa\t"+arg0);
    		final Date d = new Date();
    		Date d2 = new Date();
    		long time = Math.abs(d2.getTime()-d.getTime());
    
    		while (time<600000) {
    			try {
    				Helper.print("retrying...");
    
    				Luci.main(null);
    				return;
    			} catch (MqttException | JSONException | IOException e) {
    				Helper.print("non sono riusciuto");
    				d2 = new Date();
    				time = Math.abs(d2.getTime()-d.getTime());
    			}
    		}
    		Helper.print("fuori dal while");
    		if(time>=600000) {
    			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 {
    				
    		Helper.print("new message: "+topic+"  "+message.toString());
    		
    		if(topic.equals(Luci.getMqttTree("rpc/","luci"))) {
    			Helper.print("invio la mia configurazione");
    
    A C's avatar
    A C committed
    			sendFile(Luci.getMqttTree("from/","luci"),true);
    			return;
    		}
    		
    		if(topic.equals("to/all")) {
    			Helper.print("invio il mio stato");
    			sendStatus(Luci.getMqttTree("from/","luci"),true);
    
    A C's avatar
    A C committed
    			return;
    		}
    
    		JSONObject msgJson = new JSONObject(message.toString());
    
    		//la beaglebone risponde sutopic {"event":1} se è acceso, 0 altrimenti
    		
    		if(topic.equals(Luci.getMqttTree("to", "luci/new"))){
    	
    			JSONObject config = new JSONObject(Helper.leggiFile(Luci.FILE_ZONA));
    			
    			String nome= msgJson.getString("nome");
    			for(Luce k: Luci.luciList) {
    				if(k.getNome().equalsIgnoreCase(nome)) {
    					
    					//luci.sendMqttMessage(topic, topic)//che ci scrivo se fallisco?
    					
    					//rispondi impossibile su topic
    					System.out.println("Nome gia' presente, inserimento annullato\n");
    					
    					return;
    				}
    			}
    			int k=Luci.luciList.size();
    			config.put("lamp"+k, msgJson);
    			Luci.luciList.add(new Luce(msgJson));//,"lamp"+k
    			Helper.scriviFile(config, Luci.FILE_ZONA);
    		}
    		
    		if(topic.equals(Luci.getMqttTree("to", "luci/sensore"))){
    			//salvati il sensore di movimento
    			
    			sensM=msgJson.getString("sensM");
    			//devo aggiornare in file
    			JSONObject config = new JSONObject(Helper.leggiFile(Luci.FILE_ZONA));
    			config.put("sensM", sensM);
    			Helper.scriviFile(config, Luci.FILE_ZONA);
    			
    			
    		}//gruppo2/luci/luci/sensore
    		
    		
    		
    		//controllo i topic su cui mi arrivano gli on/off
    		if(topic.startsWith(Luci.getMqttTree("from", "luci/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}";
    					
    					
    //					if(Luci.luciList.get(i).getStato()) {
    //						req = "{cmd:0}";
    //					//topic corretto? poi risponde, se risposta è ok allora setto stato e scrivo
    //					}
    //					else {req="{cmd:1}";}
    					
    					luci.sendMqttMessage(luci.getMqttTree("to", "gpio/" + Luci.luciList.get(i).getOUT()), req);
    					//to/gruppo2/luci/gpio/OUTn
    					//JSON {cmd:1} o 0 accendi/spegni
    					
    					Luci.luciList.get(i).setStato(!Luci.luciList.get(i).getStato());
    					
    					JSONObject config = new JSONObject(Helper.leggiFile(Luci.FILE_ZONA));
    					
    					JSONObject lux=new JSONObject();
    					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());
    					
    					config.put("lamp"+i, lux);
    					
    					Helper.scriviFile(config, Luci.FILE_ZONA);
    					
    					
    				}
    			}
    			//sensM tempo
    			if(topic.startsWith(Luci.getMqttTree("from", "luci/gpio/IN"))){
    				//prendo l'ultimo pezzo del topic, diventa il mio nome
    				String nomeSensM =topic.substring(23);//seleziono solo il nome della lamp
    				System.out.println("nome lamp\t"+pezzo);
    				if(nomeSensM==sensM) {
    					Esecutore es=new Esecutore(luci);
    					es.run();
    				}
    				
    			}
    					
    		}//gruppo2/luci/luci/sensore
    		
    		Helper.print("Impossibile");
    	}
    	
    
    A C's avatar
    A C committed
    	private void sendFile(String topic,boolean moreInfo) throws MqttException, JSONException, IOException {
    		JSONObject j = new JSONObject(luci.FILE_ZONA);
    		//System.out.println(luci.FILE_ZONA);
    		
    		//j.put("stato", luci.luciList.toString());
    		luci.sendMqttMessage(topic, j.toString());
    	}
    	
    	private void sendStatus(String topic,boolean moreInfo) throws MqttException, JSONException, IOException {
    
    A C's avatar
    A C committed
    		JSONObject j = new JSONObject(luci.FILE_ZONA);
    
    A C's avatar
    A C committed
    		j.remove("sensM");
    		//System.out.println(luci.FILE_ZONA);
    
    A C's avatar
    A C committed
    		
    
    A C's avatar
    A C committed
    		//j.put("stato", luci.luciList.toString());
    
    A C's avatar
    A C committed
    		luci.sendMqttMessage(topic, j.toString());
    	}
    
    
    
    }