Bonjour Ce sujet est très mal divulgué sur le Web car il ne présente d'intérêt que dans des cercles étroits. Pour combler un peu cette lacune, cet endroit me semble le plus approprié.
L'interface CORBA AlarmIRP est présente dans tous les systèmes de contrôle des fabricants d'équipements auxquels j'ai dû faire face, car elle est prescrite par la norme 3GPP 3G TS 32.106-2. Prenons l'exemple de l'OSS-RC Ericsson, dans la documentation de laquelle le processus est au moins en quelque sorte décrit. Pour NetAct Nokia et Huawei M-2000, le code sera sensiblement le même, avec des différences dans les nuances de la mise en œuvre d'une norme. Je vais essayer de décrire le plus clairement possible le processus de création d'une application pour lire la liste des messages d'alarme, mais comme je n'ai jamais rien écrit en Java auparavant et que je n'ai pas travaillé avec CORBA, je me permettrai de laisser quelques détails en dehors du cadre de cet article.
L'ensemble de la demande peut être divisé en 3 parties:
- obtenir l'interface IOR
- création d'un objet référençant une interface
- appel des méthodes d'interface
Ainsi, selon la documentation, l'IOR est stocké à deux endroits: dans le fichier
/var/opt/ericsson/blkcm/data/bulkcm.nameservice
et sur le serveur web
http: // "masterhost ip": 80 / ior / ExternalNameService.ior
Nous utiliserons la première méthode:
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; }
Pour être précis, la méthode ci-dessus nous renverra non pas un IOR, mais un lien vers un NameService (terminologie CORBA), que nous pourrions obtenir à partir d'un fichier IOR sur un serveur Web. Si plus simple: nous utiliserons le résultat pour initialiser la connexion.
La deuxième étape est l'initialisation de l'objet de connexion ORB:
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);
Nous avons maintenant un lien vers un objet auquel nous pouvons accéder en appelant ses méthodes. En particulier, la méthode
get_alarm_list renvoie la liste dont nous avons besoin. Voici son écriture de 3GPP:
Cette méthode renvoie les informations d'alarme. Si le drapeau est
VRAI, toutes les informations d'alarme renvoyées doivent être dans AlarmInformationSeq
qui contient 0,1 ou plus d'informations sur les alarmes. Itérateur de paramètre de sortie
sera inutile. Si l'indicateur est FAUX, aucune information d'alarme ne doit être
dans AlarmInformationSeq. IRPAgent doit utiliser iter pour les récupérer.
public void getActiveAlarms(){ BooleanHolder flag = new BooleanHolder(false);
Cette méthode reçoit un itérateur contenant une liste d'alarmes sous forme d'objets de type
StructuredEvent qui affiche ensuite
alarmPrint (alarm) dans la console. L'entrée
StructuredEvent contient l'en-
tête et, en fait, les données
filterable_data . Les données sont également un enregistrement avec le nom, le
nom et la
valeur . La description des champs est également dans la norme:
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";
...
Maintenant, nous allons collecter tout cela ensemble et dériver par exemple
instance et
specific_problem :
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); }
Enfin, le code complet du projet résultant:
Code complet 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);
Le lancement est effectué par la commande:
java -cp .: / opt / ericsson / fm_core / classes / alarmirp.jar AlarmClient
Quel est le résultat: à part le "fan", je n'utilise pas encore d'autres applications. À l'avenir, il y a
NotificationIRP - réception d'événements immédiatement après leur apparition,
BulkCmIRP - configuration à partir d'un système externe, etc. La technologie est similaire, mais si nécessaire, vous pouvez écrire un article séparé. Peut-être, c'est tout à ce sujet. Je peux répondre aux questions dans les commentaires. Je vous remercie!