package art.servers.etdserver.controller; import art.library.model.devices.DeviceStatus; import art.library.model.devices.etd.Etd; import art.library.model.devices.etd.EtdInformation; import art.library.interop.serialization.Serialization; import art.library.model.transactions.traces.Trace; import art.servers.etdserver.Shared; import java.io.InputStream; import java.io.OutputStream; import static java.lang.Thread.sleep; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Calendar; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.ws.BindingProvider; import trax.skp5.CheckSkpDataRequest; import trax.skp5.CheckSkpDataResponse; import trax.skp5.CheckSkpStatusRequest; import trax.skp5.CheckSkpStatusResponse; import trax.skp5.Response; import trax.skp5.SkpAlarmRequest; import trax.skp5.SkpData; import trax.skp5.SkpPortType; import trax.skp5.SkpPortTypeService; import trax.skp5.SkpStatus; public class ControllerSKP5 extends ControllerEtd { private DatatypeFactory datatypeFactory = null; private SkpPortTypeService skpService = null; private SkpPortType skpPort = null; private boolean connected = false; private SimpleDateFormat sdh = new SimpleDateFormat("HH:mm"); private Socket socket = null; private InputStream is = null; private OutputStream os = null; private long lastTimestamp = 0; private int status = DeviceStatus.STATUS_ALARM; public ControllerSKP5(Etd etd) { super(etd); this.device = etd; this.name = Shared.getMessage("Controller etd") + " " + etd.information.name; } public Etd getEtd() { return device; } public void run() { // art.servers.Shared.println(Trace.getTraceInformation(art.servers.Shared.getApplicationName(), name, art.servers.Shared.getMessage("Starting"), art.servers.Shared.getMessage("Success")), true); // while ((isInterrupted() == false) && (exit == false)) { long startTimestamp = System.currentTimeMillis(); try { if (art.servers.Shared.isServerEnabled() == true) { if (connected == false) { connect(); } update(); } } catch (Exception e) { } if (startTimestamp > System.currentTimeMillis()) { startTimestamp = System.currentTimeMillis(); } long stopTimestamp = startTimestamp + (device.getDeviceInformation().polling * 1000); while ((System.currentTimeMillis() < stopTimestamp) && (exit == false)) { try { sleep(50); } catch (Exception e) { } } if (art.servers.Shared.model.existsDevice(device.getIdentifier()) == false) { art.servers.Shared.println(name, art.servers.Shared.getMessage("Device no longer exists")); exit = true; } } // art.servers.Shared.println(Trace.getTraceInformation(art.servers.Shared.getApplicationName(), name, art.servers.Shared.getMessage("Finishing"), art.servers.Shared.getMessage("Success")), true); // } private void connect() { try { EtdInformation etdInformation = (EtdInformation)device.getDeviceInformation(); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); SkpPortTypeService skpService = new SkpPortTypeService(); SkpPortType etdPort = skpService.getSkpPortType(); String endpointURL = "http://" + etdInformation.connection.address + ":" + etdInformation.connection.port; BindingProvider bindingProvider = (BindingProvider)etdPort; bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); this.skpService = skpService; this.skpPort = etdPort; // skpPort; this.datatypeFactory = datatypeFactory; this.connected = true; } catch (Exception exception) { String message = art.servers.Shared.getMessage("Skp offline"); art.servers.Shared.println(name, exception); this.connected = false; } } private void update() throws Exception { Etd etdclone = (Etd)Serialization.clone(device); try { EtdInformation etdInformation = (EtdInformation)etdclone.getDeviceInformation(); // Status { CheckSkpStatusRequest request = new CheckSkpStatusRequest(); request.setDateTime(getCalendar()); request.setUserName(etdInformation.connection.user); request.setPassword(etdInformation.connection.password); request.setOperationCode("StatusRequest"); request.setDateTime(getCalendar()); request.setDeviceId(art.servers.Shared.getApplicationName()); CheckSkpStatusResponse response = skpPort.checkSkpStatus(request); status(etdclone, response.getSkpStatus()); } // Alarms { SkpAlarmRequest request = new SkpAlarmRequest(); request.setDateTime(getCalendar()); request.setUserName(etdInformation.connection.user); request.setPassword(etdInformation.connection.password); request.setOperationCode("AlarmRequest"); request.setDateTime(getCalendar()); request.setDeviceId(art.servers.Shared.getApplicationName()); Response response = skpPort.skpAlarmEvent(request); /// TODO diria que es un error (no hay alarm event request) } // Data { CheckSkpDataRequest request = new CheckSkpDataRequest(); request.setDateFrom(getCalendar(0)); request.setDateTo(getCalendar(0)); request.setUserName(etdInformation.connection.user); request.setPassword(etdInformation.connection.password); request.setOperationCode("DataRequest"); request.setDateTime(getCalendar()); request.setDeviceId(art.servers.Shared.getApplicationName()); CheckSkpDataResponse response = skpPort.checkSkpData(request); data(device, response.getSkpData()); } etdclone.setAlarm("alarm_offline", false); etdclone.setAlarm("alarm_invalid", false); art.servers.Shared.model.updateDevice(device, etdclone); return; } catch (Exception exception) { exception.printStackTrace(); String message = art.servers.Shared.getMessage("Etd offline"); art.servers.Shared.println(name, exception); this.connected = false; } if (etdclone.getAlarm("alarm_offline") <= 0) { etdclone.getDeviceAlarms().clear(); } etdclone.setAlarm("alarm_offline", true); art.servers.Shared.model.updateDevice(device, etdclone); } private void status(Etd etd, SkpStatus status) { // TODO } private void alarms(Etd etd, SkpData data) { // TODO } private void data(Etd etd, SkpData data) { // TODO // Mirar si ha cambiado el periodo y si no lo tenemos actualizar // Si el periodo en information no coivide actualizamos el atributo } private XMLGregorianCalendar getCalendar() { return getCalendar(System.currentTimeMillis()); } private XMLGregorianCalendar getCalendar(long timestamp) { XMLGregorianCalendar xmlGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(); { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timestamp); xmlGregorianCalendar.setYear(calendar.get(Calendar.YEAR)); xmlGregorianCalendar.setMonth(calendar.get(Calendar.MONTH) + 1); xmlGregorianCalendar.setDay(calendar.get(Calendar.DAY_OF_MONTH)); xmlGregorianCalendar.setHour(calendar.get(Calendar.HOUR_OF_DAY)); xmlGregorianCalendar.setMinute(calendar.get(Calendar.MINUTE)); xmlGregorianCalendar.setSecond(calendar.get(Calendar.SECOND)); xmlGregorianCalendar.setMillisecond(0); xmlGregorianCalendar.setTimezone(0); } return xmlGregorianCalendar; } }