Guten Tag. Dieses Thema wird im Web nur sehr schlecht veröffentlicht, da es nur in engen Kreisen von Interesse ist. Um diese Lücke ein wenig zu füllen, scheint mir dieser Ort am besten geeignet zu sein.
Die CORBA AlarmIRP-Schnittstelle ist in allen Steuerungssystemen der Gerätehersteller vorhanden, mit denen ich mich befassen musste, da sie durch den Standard 3GPP 3G TS 32.106-2 vorgeschrieben ist. Betrachten Sie das OSS-RC Ericsson als Beispiel, in dessen Dokumentation der Prozess zumindest irgendwie beschrieben ist. Für NetAct Nokia und Huawei M-2000 ist der Code ungefähr gleich, mit Unterschieden in den Nuancen der Implementierung eines Standards. Ich werde versuchen, den Prozess der Erstellung einer Anwendung zum Lesen der Liste der Alarmmeldungen so klar wie möglich zu beschreiben. Da ich jedoch noch nie etwas in Java geschrieben und nicht mit CORBA gearbeitet habe, werde ich mir erlauben, einige Details außerhalb des Geltungsbereichs dieses Artikels zu belassen.
Die gesamte Anwendung kann in 3 Teile unterteilt werden:
- IOR-Schnittstelle erhalten
- Erstellen eines Objekts, das auf eine Schnittstelle verweist
- Aufrufen von Schnittstellenmethoden
Entsprechend der Dokumentation wird die IOR an zwei Stellen gespeichert: in der Datei
/var/opt/ericsson/blkcm/data/bulkcm.nameservice
und auf dem Webserver
http: // "masterhost ip": 80 / ior / ExternalNameService.ior
Wir werden die erste Methode verwenden:
private String readIOR() { String mastersvc = "/var/opt/ericsson/blkcm/data/bulkcm.nameservice"; File f = new File(mastersvc); BufferedReader br; String iorContents = null; try { br = new BufferedReader(new FileReader(f)); iorContents = br.readLine(); br.close(); } catch (IOException e) { e.printStackTrace(); } return iorContents; }
Um genau zu sein, gibt die oben beschriebene Methode keine IOR zurück, sondern einen Link zu einem NameService (CORBA-Terminologie), den wir aus einer IOR-Datei auf einem Webserver erhalten könnten. Wenn es einfacher ist: Wir werden das Ergebnis verwenden, um die Verbindung zu initialisieren.
Die zweite Stufe ist die Initialisierung des ORB-Verbindungsobjekts:
public void createAlarmObj(){ org.omg.CORBA.Object rootObj = null; NamingContextExt rootNameCon = null; Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitRef", "NameService=" + readIOR()); org.omg.CORBA.ORB orb = ORB.init(new String[0], props);
Jetzt haben wir einen Link zu einem Objekt, auf das wir zugreifen können, indem wir seine Methoden aufrufen. Insbesondere gibt die Methode
get_alarm_list die Liste zurück, die wir benötigen. Hier ist seine Schriftstelle aus 3GPP:
Diese Methode gibt Alarminformationen zurück. Wenn Flagge ist
TRUE, alle zurückgegebenen Alarminformationen müssen in AlarmInformationSeq enthalten sein
das enthält 0,1 oder mehr Alarminformationen. Ausgabeparameter iter
soll nutzlos sein. Wenn das Flag FALSE ist, dürfen keine Alarminformationen vorhanden sein
in AlarmInformationSeq. IRPAgent muss iter verwenden, um sie abzurufen.
public void getActiveAlarms(){ BooleanHolder flag = new BooleanHolder(false);
Diese Methode empfängt einen Iterator mit einer Liste von Alarmen in Form von Objekten vom Typ
StructuredEvent, die dann
alarmPrint (Alarm) in der Konsole
anzeigen . Der
StructuredEvent- Eintrag enthält den
Header und tatsächlich die
filterable_data- Daten. Daten sind auch ein Datensatz mit dem
Namen und dem
Wert . Die Beschreibung der Felder ist ebenfalls im Standard enthalten:
const string NV_NOTIFICATION_ID = "a";
const string NV_CORRELATED_NOTIFICATIONS = "b";
const string NV_EVENT_TIME = "c";
const string NV_SYSTEM_DN = "d";
const string NV_MANAGED_OBJECT_CLASS = "e";
const string NV_MANAGED_OBJECT_INSTANCE = "f";
const string NV_SPECIFIC_PROBLEM = "i";
...
Jetzt werden wir all dies zusammen sammeln und zum Beispiel
Instanz und
spezifisches Problem ableiten:
private void alarmPrint(StructuredEvent alarm){ String result = "" if (alarm.filterable_data != null) { for (Property filterableData: alarm.filterable_data) { String fieldName = filterableData.name; switch (fieldName){ case "f": result = result + filterableData.value.extract_string() + ";"; break; case "i": result = result + filterableData.value.extract_string(); break; } } } System.out.println(result); }
Schließlich der vollständige Code für den resultierenden Entwurf:
Vollständiger Code import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.omg.CORBA.*; import org.omg.CORBA.ORBPackage.InvalidName; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.CosNaming.NamingContextPackage.CannotProceed; import org.omg.CosNaming.NamingContextPackage.NotFound; import org.omg.CosNotification.EventBatchHolder; import org.omg.CosNotification.Property; import org.omg.CosNotification.StructuredEvent; import com.ericsson.irp.AlarmIRPSystem.GetAlarmList; import com.ericsson.irp.AlarmIRPSystem.InvalidParameter; import com.ericsson.irp.AlarmIRPSystem.NextAlarmInformations; import com.ericsson.irp.AlarmIRPSystem.ParameterNotSupported; public class AlarmClient { private com.ericsson.irp.AlarmIRPSystem._AlarmIRPOperations _alarmIrp = null; public static void main(String[] args) { AlarmClient ac = new AlarmClient(); ac.createAlarmObj(); ac.getActiveAlarms(); } private String readIOR() { File f = new File("/var/opt/ericsson/blkcm/data/bulkcm.nameservice"); BufferedReader br; String iorContents = null; try { br = new BufferedReader(new FileReader(f)); iorContents = br.readLine(); br.close(); } catch (IOException e) { e.printStackTrace(); } return iorContents; } public void createAlarmObj(){ org.omg.CORBA.Object rootObj = null; NamingContextExt rootNameCon = null; Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitRef", "NameService=" + readIOR()); org.omg.CORBA.ORB orb = ORB.init(new String[0], props);
Der Start erfolgt über den Befehl
java -cp.: / opt / ericsson / fm_core / classes / alarmirp.jar AlarmClient
Was ist das Ergebnis: Neben dem "Lüfter" verwende ich noch keine anderen Anwendungen. In Zukunft gibt es
NotificationIRP - Empfangen von Ereignissen unmittelbar nach ihrem Auftreten,
BulkCmIRP - Konfiguration von einem externen System usw. Die Technologie ist ähnlich, aber bei Bedarf können Sie einen separaten Artikel schreiben. Vielleicht ist das alles zu diesem Thema. Ich kann Fragen in den Kommentaren beantworten. Vielen Dank!