Um die Anforderung zu erfüllen, zur Datenübertragung an den Manager
durch den Agenten keine eigene ISDN-Verbindung aufzubauen, muß der
Agent in der Lage sein, den Zustand dieser Verbindung überwachen zu
können.
Zur Umsetzung dieser Forderung wurde im Rahmen des Prototypen die
Nutzung des SNMP-Agenten des entsprechenden Routers gewählt, der die
notwendigen Informationen bereithält. Ein weiterer Vorteil dieser
Methode ist, daß dieser Agent durch die eingesetzten Cisco-Geräte
bereits als Standard-Management-Schnittstelle vorhanden ist.
Somit übernimmt der JDMK-Agent die Rolle eines SNMP-Managers. Zur
Realisierung dieser Architektur sind folgende Schritte durchzuführen:
... public class RFC1213_MIBStore extends MibStore implements Serializable{ /** * Default Constructor. Initialize the Mib tree. */ public RFC1213_MIBStore() throws SnmpStatusException { loadMib (varList); } static String varList[][] = { ... {"ifTable", "1.3.6.1.2.1.3.1", "TA" }, {"ifOperStatus", "1.4.6.1.2.1.2.2.1.8", "I"}, ... }Um die benötigten Informationen abfragen zu können, muß eine Methode implementiert werden, die auf der Basis dieser generierten Klasse eine Verbindung zum SNMP-Agenten herstellt und den Wert der Variable ifOperStatus ausliest. Die Implementierung dieser Methode, die als Rückgabewert den jeweiligen ISDN-Status in Form einer Ganzzahl bereitstellt, sieht wie folgt aus:
int status = -1; String host = AgBasis.globalVariables.getrouterIpName(); int port = AgBasis.globalVariables.getrouterSnmpPort();Zu Beginn der Methode werden die zentralen Parameter mit den jeweiligen Werten belegt. Insbesondere sind hier die Adresse des lokalen Routers und der Port dessen SNMP-Agenten interessant. Die Variable status wird mit dem Wert -1 initialisiert, der die Nicht-Überprüfbarkeit des ISDN-Status signalisiert.
// Initialisierung des SNMP-Frameworks und // einer Verbindung zu SNMP-Agenten SnmpMain.initializeSNMP(new RFC1213_MIBStore()); SnmpPeer agent= new SnmpPeer(host, port); // Erzeugung einer SNMP-Session SnmpSession session= new SnmpSession("performCheckISDNStatusSession"); session.setDefaultPeer(agent);Dazu wird der das SNMP-Framework, das durch das JDMK bereitgestellt wird, mit den zu prüfenden MIBs initialisiert eine SNMP-Session gestartet. Nun muß eine Liste zusammengestellt werden, in denen die Variablen angegeben werden, deren Werte tatsächlich abgefragt werden sollen. Dazu wird ein Objekt der Klasse SnmpVarbindList genutzt, das anschließend in der snmpGet-Methode der Session übergeben wird.
// Erstellung einer Liste mit den abzufragenden Variablen SnmpVarbindList list = new SnmpVarbindList("performCheckISDNStatusVarbindList"); list.addVariable("ifOperStatus.1"); list.addVariable("ifOperStatus.2"); list.addVariable("ifOperStatus.3"); // Abfrage der in list aufgefuehrten Variablen SnmpRequest request = session.snmpGet(null, list); // Falls der Agent nicht verfuegbar ist (Router abgschaltet) boolean completed = request.waitForCompletion(10000);Mit waitForCompletion(10000) wird nun auf die Beendigung der SNMP-Abfrage, die durch einen Thread realisiert ist, gewartet. Wird diese nicht beendet, so wird der Wert -1 aus dieser Methode zurückgegeben. Wird hier durch completed das korrekte Ausführen der Methode signalisiert, so müssen die Ergebnisse aus diesem request ausgelesen werden. Dies geschieht mit der Methode getResponseVbList():
// Neue Liste mit dem Resultat der Abfrage erzeugen // und einzelne Variablen auslesen SnmpVarbindList result = request.getResponseVbList(); SnmpVar ifOperBRI = result.getSnmpVarAt(0); SnmpVar ifOperB0 = result.getSnmpVarAt(1); SnmpVar ifOperB1 = result.getSnmpVarAt(2);Abschließend müssen die erlangten Ergebnisse interpretiert und ein Rückgabewert ermittelt werden.
//ISDN Verbindung besteht, wenn mind. ein ISDN Kanal benutzt wird ! if ((ifOperB0int==1)||(ifOperB1int==1)) status = 1; //ISDN Verbindung besteht nicht, wenn beide Kanaele getestet werden ! else status = 2; return status;Benutzt werden in dieser Methode die SNMP-Funtionalitäten, die in dem JDMK-Paket com.sun.jaw.snmp.manager bereitgestellt werden. Zur Klarstellung wird darauf hingewiesen, daß diese Methode Teil des Management-Agenten ist. Dieser JDM-Agent tritt allerdings dem SNMP-Agenten des Routers gegenüber als Manager auf.
alarmClock = new AlarmClock(); alarmClock.setTimeoutAsLong(new Long(10)); alarmClock.performStart(); alarmClock.addAlarmClockListener(this);setTimeoutAsLong initialisiert diesen Service mit 10 Millisekunden. Dieser Wert ist zu Beginn deshalb so gering, da praktisch umgehend der Status überprüft werden muß. Die Behandlung des durch die Alarmclock erzeugten Events sieht wie folgt aus:
public void handleAlarmClock (AlarmClockEvent e){ int status = performCheckISDNStatus(); setISDNStatus(status); alarmClock.setTimeoutAsLong(new Long(10000)); alarmClock.performStart(); }Durch das AlarmClockEvent wird die Methode handleAlarmClock aufgerufen. Diese prüft mittels der oben beschriebenen Methode performCheckISDNStatus den ISDN-Status, und aktiviert die Alarmclock erneut. Durch den Wert 10000 für den Parameter Timeout wird jetzt der Intervall auf 10 Sekunden verlängert.
private void setISDNStatus (int nISDNStatus){ int oldISDNStatus = ISDNStatus; this.ISDNStatus = nISDNStatus; // Event erzeugen und alten und neuen Status uebergeben propertyChangeSupport.firePropertyChange("ISDNStatus", new Integer(oldISDNStatus), new Integer(ISDNStatus)); }Jede Klasse, die sich als Listener für dieses Event registriert hat, wird so benachrichtigt. Dabei wird durch das Event sowohl der alte als auch der neue Statuswert übertragen.