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.