package it.cnr.isti.telecom.integration; /** * * @author Giancarlo Riolo * */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Observable; import java.util.Observer; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import it.cnr.isti.telecom.integration.model.MongoConnector; import it.cnr.isti.telecom.integration.util.MessageBean; public class TelecomIntegration extends HttpServlet implements Observer { /** * */ private static final long serialVersionUID = -6552868766318089250L; private Logger log = LoggerFactory.getLogger(TelecomIntegration.class); private HttpClient client; private String applicationName = "prova"; private String baseUrl = "http://wsn1.x-monitor.it"; private String debugGETUrl = "http://httpbin.org/get/"; private String debugPOSTUrl = "http://httpbin.org/post"; String postTelecomPath = "/x/raw?q=Data"; private Gson gson = new GsonBuilder().disableHtmlEscaping().create(); boolean POSTDEBUG = false; private MongoConnector mongoConnector = new MongoConnector(); private ExecutorService executorService; public void init() throws ServletException { mongoConnector.addObserver(this); log.info("Building HTTP client..."); client = HttpClientBuilder.create().build(); executorService = Executors.newFixedThreadPool(10); executorService.execute(mongoConnector); if (POSTDEBUG) { baseUrl = debugPOSTUrl; postTelecomPath = ""; } } private void sendMessage(MessageBean message) { String url = baseUrl + postTelecomPath; String sensor = message.getID(); switch (sensor) { case "260:12:0@00:12:4B:00:02:6F:9F:4C:1": message.setMonitoredFeature("SocketPower"); message.setRoom("C69"); message.setSensorType("PowerMeter"); break; case "260:12:0@00:12:4B:00:02:6F:9F:4C:2": message.setMonitoredFeature("SocketPower"); message.setRoom("C69"); message.setSensorType("PowerMeter"); break; case "260:12:0@00:12:4B:00:02:6F:9F:4C:3": message.setMonitoredFeature("PeoplePresence"); message.setRoom("C69"); message.setSensorType("PIR"); if (Integer.parseInt(message.getMeasuredValue()) > 200) { message.setMeasuredValue("200"); } break; case "260:12:0@00:12:4B:00:02:6F:9F:4C:4": message.setMonitoredFeature("Noise"); message.setRoom("C69"); message.setSensorType("NoiseMonitor"); break; case "260:12:0@00:12:4B:00:02:6F:9F:4C:5": message.setMonitoredFeature("Temperature"); message.setRoom("C69"); message.setSensorType("Temperature"); if (Integer.parseInt(message.getMeasuredValue()) > 100) { return; } if (Integer.parseInt(message.getMeasuredValue()) < 15) { return; } break; case "260:12:0@00:12:4B:00:02:6F:9F:4C:6": message.setMonitoredFeature("Humidity"); message.setRoom("C69"); message.setSensorType("Humidity"); if (Integer.parseInt(message.getMeasuredValue()) > 100) { return; } break; case "260:12:0@00:12:4B:00:02:6F:9F:4C:7": message.setMonitoredFeature("LightPower"); message.setRoom("C69"); message.setSensorType("PowerMeter"); break; case "260:12:0@00:12:4B:00:02:6F:9F:4C:8": message.setMonitoredFeature("LightPower"); message.setRoom("C69"); message.setSensorType("PowerMeter"); break; case "260:12:0@00:12:4B:00:02:6F:9A:C9:1": message.setMonitoredFeature("SocketPower"); message.setRoom("C70"); message.setSensorType("PowerMeter"); break; case "260:12:0@00:12:4B:00:02:6F:9A:C9:3": message.setMonitoredFeature("PeoplePresence"); message.setRoom("C70"); message.setSensorType("PIR"); if (Integer.parseInt(message.getMeasuredValue()) > 200) { message.setMeasuredValue("200"); } break; case "260:12:0@00:12:4B:00:02:6F:9A:C9:4": message.setMonitoredFeature("Noise"); message.setRoom("C70"); message.setSensorType("NoiseMonitor"); break; case "260:12:0@00:12:4B:00:02:6F:9A:C9:5": message.setMonitoredFeature("Temperature"); message.setRoom("C70"); message.setSensorType("Temperature"); if (Integer.parseInt(message.getMeasuredValue()) > 100) { return; } if (Integer.parseInt(message.getMeasuredValue()) < 15) { return; } break; case "260:12:0@00:12:4B:00:02:6F:9A:C9:6": message.setMonitoredFeature("Humidity"); message.setRoom("C70"); message.setSensorType("Humidity"); if (Integer.parseInt(message.getMeasuredValue()) > 100) { return; } break; case "260:12:0@00:12:4B:00:02:6F:9A:C9:7": message.setMonitoredFeature("LightPower"); message.setRoom("C70"); message.setSensorType("PowerMeter"); break; case "260:12:0@00:12:4B:00:02:6F:9A:C9:8": message.setMonitoredFeature("LightPower"); message.setRoom("C70"); message.setSensorType("PowerMeter"); break; case "occupancySensorID1": message.setID("OccupancySensorID1"); message.setMonitoredFeature("Occupancy"); message.setRoom("C69"); message.setSensorType("OccupancyVirtualSensor"); break; case "occupancySensorID2": message.setID("OccupancySensorID2"); message.setMonitoredFeature("Occupancy"); message.setRoom("C70"); message.setSensorType("OccupancyVirtualSensor"); break; default: break; } String jsonMessage = gson.toJson(message); log.info("Message is {}", jsonMessage); HttpResponse response = null; try { HttpPost request = new HttpPost(url); StringEntity params = new StringEntity(jsonMessage); request.addHeader("User-Agent", applicationName + "-AGENT"); request.addHeader("content-type", "application/json"); request.setEntity(params); response = client.execute(request); } catch (IOException e) { e.printStackTrace(); } if (response != null) { log.info("Sensor registration Response Code : {} ", response.getStatusLine().getStatusCode()); BufferedReader rd = null; try { rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); } catch (UnsupportedOperationException | IOException e) { e.printStackTrace(); } StringBuffer result = new StringBuffer(); String line = ""; try { while ((line = rd.readLine()) != null) { result.append(line); } } catch (IOException e) { e.printStackTrace(); } log.info("Message Sent Response : {} ", result); } } @Override public void update(Observable observable, Object message) { /// log.info("Message from Observable is {}", message); sendMessage((MessageBean) message); } public void destroy() { log.info("Closing Telecom Integration Servlet"); mongoConnector.deleteObservers(); mongoConnector.stop(); executorService.shutdownNow(); } }