package art.servers.signalsboardserver.controller.pollers; import art.library.model.devices.signalsboard.SignalsBoard; import art.library.model.devices.signalsboard.SignalsBoardStatus; import art.library.model.devices.signalsboard.alarms.SignalAlarm; import art.library.model.devices.signalsboard.alarms.SignalAlarm_SNMP; import art.library.model.devices.signalsboard.information.SignalInformation; import art.library.model.devices.signalsboard.information.SignalInformation_SNMP; import art.library.model.devices.signalsboard.information.SignalsInformation_SNMP; import art.library.model.devices.signalsboard.status.SignalStatus; import art.library.model.devices.signalsboard.status.SignalStatusGroup; import art.library.net.snmp.SNMPReader; import art.servers.Shared; import art.servers.signalsboardserver.configuration.ConfigurationDetail_Definition; import art.servers.signalsboardserver.configuration.ConfigurationDetail_Model; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import org.snmp4j.smi.SMIConstants; import org.snmp4j.smi.TimeTicks; import org.snmp4j.smi.VariableBinding; public class PollerSNMP extends Thread { private SignalsBoard device = null; private SignalsInformation_SNMP signalsInformation_SNMP = null; private ConfigurationDetail_Model model = null; private ScriptEngineManager factory = new ScriptEngineManager(); private ScriptEngine engine = factory.getEngineByName("JavaScript"); private String name = null; private SNMPReader reader = null; public PollerSNMP(String name, ConfigurationDetail_Model model, SignalsBoard device, SignalsInformation_SNMP signalsInformation_SNMP) { this.name = name; this.model = model; this.device = device; this.signalsInformation_SNMP = signalsInformation_SNMP; this.reader = new SNMPReader(signalsInformation_SNMP.address, signalsInformation_SNMP.port, signalsInformation_SNMP.version, signalsInformation_SNMP.publicCommunity, signalsInformation_SNMP.timeout, signalsInformation_SNMP.retries); } public void run() { try { update(); } catch (Exception exception) { } } public boolean update() throws Exception { try { SignalsBoardStatus status = device.getDeviceStatus(); boolean result = true; // Inputs if (signalsInformation_SNMP.inputs != null) { List groups = new ArrayList(); result = result & read(groups, signalsInformation_SNMP.inputs); if (groups.size() > 0) { if (status.inputs == null) { status.inputs = new ArrayList(); } status.inputs.addAll(groups); } } // Inouts if (signalsInformation_SNMP.inouts != null) { List groups = new ArrayList(); result = result & read(groups, signalsInformation_SNMP.inouts); if (groups.size() > 0) { if (status.inouts == null) { status.inouts = new ArrayList(); } status.inouts.addAll(groups); } } // Alarms if (signalsInformation_SNMP.alarms != null) { result = result & read(signalsInformation_SNMP.alarms, status); } // Update values with definitions updateDefinitions(status); return result; } catch (Exception exception) { Shared.traceError(name + ", " + this.signalsInformation_SNMP.address, Shared.getMessage("Update"), exception); return false; } finally { if (reader != null) { reader.disconnect(); } } } private void updateDefinitions(SignalsBoardStatus status) throws Exception { try { // Inputs if (status.inputs != null) { updateDefinitions(status.inputs); } // Inouts if (status.inouts != null) { updateDefinitions(status.inouts); } } catch (Exception exception) { Shared.traceError(name + ", " + this.signalsInformation_SNMP.address, Shared.getMessage("Update"), exception); } } private void updateDefinitions(List signalStatusGroup) { for (SignalStatusGroup group : signalStatusGroup) { for (SignalStatus signalStatus : group.signals) { ConfigurationDetail_Definition definition = model.getDefinition(signalStatus.name); if (definition != null) { signalStatus.format = SignalStatus.FORMAT_STRING; String value = definition.values.get(signalStatus.value); if (value != null) signalStatus.value = value; } } } } private boolean read(List groups, List signalsInformation) { HashMap mapGroups = new HashMap(); HashMap mapSignalsStatus = new HashMap(); // Initialise all status signals for (SignalInformation signalInformation : signalsInformation) { SignalStatus signalStatus = new SignalStatus(); signalStatus.name = signalInformation.name; signalStatus.units = signalInformation.units; signalStatus.description = signalInformation.description; mapSignalsStatus.put(signalStatus.name, signalStatus); SignalStatusGroup group = mapGroups.get(signalInformation.group); if (group == null) { group = new SignalStatusGroup(); group.name = signalInformation.group; group.signals = new ArrayList(); groups.add(group); mapGroups.put(group.name, group); } group.signals.add(signalStatus); } // Read all signals try { for (SignalInformation signal : signalsInformation) { if (signal instanceof SignalInformation_SNMP) { SignalInformation_SNMP signalInformation = (SignalInformation_SNMP)signal; SignalStatus signalStatus = mapSignalsStatus.get(signalInformation.name); read(signalInformation, signalStatus); } } return true; } catch (Exception exception) { return false; } } private boolean read(List signalsAlarm, SignalsBoardStatus status) { try { for (SignalAlarm signalAlarm : signalsAlarm) { if (signalAlarm instanceof SignalAlarm_SNMP) { read(reader, (SignalAlarm_SNMP)signalAlarm); } else if (signalAlarm instanceof SignalAlarm) { read(signalAlarm, status); } } return true; } catch (Exception exception) { return false; } finally { if (reader != null) reader.disconnect(); } } private void read(SignalInformation_SNMP signalInformation, SignalStatus signalStatus) throws Exception { try { VariableBinding variable = reader.getVariableBinding(signalInformation.oid); try { if (signalInformation.oid.substring(1).equalsIgnoreCase(variable.getOid().toDottedString()) == false) { Shared.println(name, "Info: " + signalInformation.name + " - " + signalInformation.oid); Shared.println(name, "Var: " + variable.getOid().toDottedString()); } } catch (Exception e) { } switch(variable.getSyntax()) { case SMIConstants.EXCEPTION_END_OF_MIB_VIEW: case SMIConstants.EXCEPTION_NO_SUCH_INSTANCE: case SMIConstants.EXCEPTION_NO_SUCH_OBJECT: case SMIConstants.SYNTAX_NULL: signalStatus.format = SignalStatus.FORMAT_UNKNOWN; signalStatus.value = null; break; case SMIConstants.SYNTAX_COUNTER32: case SMIConstants.SYNTAX_UNSIGNED_INTEGER32: case SMIConstants.SYNTAX_COUNTER64: case SMIConstants.SYNTAX_INTEGER: if (signalInformation.factor != 1.0) { signalStatus.format = SignalStatus.FORMAT_DOUBLE; double value = (Double.parseDouble(variable.toValueString()) * signalInformation.factor); int valueInt = (int)(value * 100d); value = (double)((double)valueInt / 100d); signalStatus.value = "" + value; } else { signalStatus.format = SignalStatus.FORMAT_LONG; signalStatus.value = variable.toValueString(); } break; case SMIConstants.SYNTAX_TIMETICKS: TimeTicks ticks = (TimeTicks)variable.getVariable(); signalStatus.format = SignalStatus.FORMAT_DURATION; signalStatus.value = "" + ticks.toMilliseconds(); break; case SMIConstants.SYNTAX_OCTET_STRING: case SMIConstants.SYNTAX_OBJECT_IDENTIFIER: case SMIConstants.SYNTAX_IPADDRESS: case SMIConstants.SYNTAX_OPAQUE: signalStatus.format = SignalStatus.FORMAT_STRING; signalStatus.value = variable.toValueString(); break; default: signalStatus.format = SignalStatus.FORMAT_UNKNOWN; signalStatus.value = null; } } catch (Exception exception) { Shared.println(name, "Group: " + signalInformation.group + " Name: " + signalInformation.name + " Oid: " + signalInformation.oid + " - " + exception); signalStatus.format = SignalStatus.FORMAT_UNKNOWN; signalStatus.value = null; } } private void read(SNMPReader reader, SignalAlarm_SNMP signalAlarm) throws Exception { VariableBinding variable = reader.getVariableBinding(signalAlarm.oid); switch(variable.getSyntax()) { case SMIConstants.EXCEPTION_END_OF_MIB_VIEW: case SMIConstants.EXCEPTION_NO_SUCH_INSTANCE: case SMIConstants.EXCEPTION_NO_SUCH_OBJECT: case SMIConstants.SYNTAX_NULL: device.setAlarm(signalAlarm.name, 0); return; case SMIConstants.SYNTAX_COUNTER32: case SMIConstants.SYNTAX_UNSIGNED_INTEGER32: case SMIConstants.SYNTAX_COUNTER64: case SMIConstants.SYNTAX_INTEGER: if (signalAlarm.eval != null) { String assignment = Double.parseDouble(variable.toValueString()) + " " + signalAlarm.eval; device.setAlarm(signalAlarm.name, (Boolean)engine.eval(assignment)); } else { device.setAlarm(signalAlarm.name, Double.parseDouble(variable.toValueString()) > 0); } return; case SMIConstants.SYNTAX_TIMETICKS: TimeTicks ticks = (TimeTicks)variable.getVariable(); if (signalAlarm.eval != null) { String assignment = Double.parseDouble(variable.toValueString()) + " " + ticks.toMilliseconds(); boolean result = (Boolean)engine.eval(assignment); device.setAlarm(signalAlarm.name, result); } else { device.setAlarm(signalAlarm.name, ticks.toMilliseconds() > 0); } return; case SMIConstants.SYNTAX_OCTET_STRING: case SMIConstants.SYNTAX_OBJECT_IDENTIFIER: case SMIConstants.SYNTAX_IPADDRESS: case SMIConstants.SYNTAX_OPAQUE: if (signalAlarm.eval != null) { String assignment = variable.toValueString() + " " + signalAlarm.eval; device.setAlarm(signalAlarm.name, (Boolean)engine.eval(assignment)); return; } break; } device.setAlarm(signalAlarm.name, 0); } private void read(SignalAlarm signalAlarm, SignalsBoardStatus status) throws Exception { SignalStatus signalStatus = status.getSignal(signalAlarm.signal); if (signalStatus.value == null) device.setAlarm(signalAlarm.name, true); if (signalAlarm.eval != null) { String assignment = Double.parseDouble(signalStatus.value) + " " + signalAlarm.eval; Boolean b = (Boolean)engine.eval(assignment); device.setAlarm(signalAlarm.name, b); } else { device.setAlarm(signalAlarm.name, Double.parseDouble(signalStatus.value) > 0); } } }