Hola Este tema se divulga muy poco en la Web porque es de interés solo en círculos estrechos. Para llenar este vacío un poco, este lugar me parece el más adecuado.
La interfaz CORBA AlarmIRP está presente en todos los sistemas de control de los fabricantes de equipos con los que tuve que lidiar, ya que está prescrita por el estándar 3GPP 3G TS 32.106-2. Considere el OSS-RC Ericsson como un ejemplo, en cuya documentación el proceso se describe al menos de alguna manera. Para NetAct Nokia y Huawei M-2000, el código será aproximadamente el mismo, con diferencias en los matices de la implementación de un estándar. Trataré de describir lo más claramente posible el proceso de creación de una aplicación para leer la lista de mensajes de alarma, pero como nunca he escrito nada en Java antes y no he trabajado con CORBA, me permitiré dejar algunos detalles fuera del alcance de este artículo.
Toda la aplicación se puede dividir en 3 partes:
- obtener la interfaz IOR
- crear un objeto que haga referencia a una interfaz
- métodos de interfaz de llamada
Entonces, de acuerdo con la documentación, el IOR se almacena en dos lugares: en el archivo
/var/opt/ericsson/blkcm/data/bulkcm.nameservice
y en el servidor web
http: // "masterhost ip": 80 / ior / ExternalNameService.ior
Usaremos el primer método:
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; }
Para ser precisos, el método anterior no nos devolverá un IOR, sino un enlace a un NameService (terminología CORBA), que podríamos obtener de un archivo IOR en un servidor web. Si es más simple: usaremos el resultado para inicializar la conexión.
La segunda etapa es la inicialización del objeto de conexión 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);
Ahora tenemos un enlace a un objeto al que podemos acceder llamando a sus métodos. En particular, el método
get_alarm_list devuelve la lista que necesitamos. Aquí está su escritura de 3GPP:
Este método devuelve información de alarma. Si la bandera es
VERDADERO, todas las informaciones de alarma devueltas deben estar en AlarmInformationSeq
que contiene 0.1 o más informaciones de alarma. Parámetro de salida iter
será inútil Si la bandera es FALSA, no se debe mostrar información de alarma
en AlarmInformationSeq. IRPAgent necesita usar iter para recuperarlos.
public void getActiveAlarms(){ BooleanHolder flag = new BooleanHolder(false);
Este método recibe un iterador que contiene una lista de alarmas en forma de objetos de tipo
StructuredEvent que luego muestra
alarmPrint (alarma) en la consola. La entrada
StructuredEvent contiene el
encabezado y, de hecho, los datos de datos
filtrables . Los datos también son un registro con el nombre, el
nombre y el valor del
valor . La descripción de los campos también está en el estándar:
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";
cadena constante NV_MANAGED_OBJECT_INSTANCE = "f";
const string NV_SPECIFIC_PROBLEM = "i";
...
Ahora recopilaremos todo esto y derivaremos, por ejemplo,
instancia y problema_específico:
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); }
Finalmente, el código completo para el borrador resultante:
Código completo 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);
El lanzamiento se realiza mediante el comando:
java -cp .: / opt / ericsson / fm_core / classes / alarmirp.jar AlarmClient
¿Cuál es el resultado? Además del "fan", todavía no estoy usando otras aplicaciones. En el futuro hay
NotificationIRP , que recibe eventos inmediatamente después de su aparición,
BulkCmIRP , configuración desde un sistema externo, etc. La tecnología es similar, pero si es necesario, puede escribir un artículo por separado. Quizás, eso es todo sobre este tema. Puedo responder preguntas en los comentarios. Gracias