مرحبًا. تم الكشف عن هذا الموضوع بشكل سيء للغاية على الويب لأنه لا يهم إلا في الدوائر الضيقة. لملء هذه الفجوة قليلاً ، يبدو لي هذا المكان الأنسب.
توجد واجهة CORBA AlarmIRP في جميع أنظمة التحكم في الشركات المصنعة للمعدات التي كان عليّ التعامل معها ، لأنها موصوفة بمعيار 3GPP 3G TS 32.106-2. اعتبر OSS-RC Ericsson كمثال ، حيث يتم وصف العملية في وثائقها على الأقل بطريقة أو بأخرى. بالنسبة إلى NetAct Nokia و Huawei M-2000 ، سيكون الرمز هو نفسه تقريبًا ، مع وجود اختلافات في الفروق الدقيقة في تطبيق معيار واحد. سأحاول أن أوضح بشكل واضح قدر الإمكان عملية إنشاء تطبيق لقراءة قائمة رسائل التنبيه ، ولكن بما أنني لم أكتب أي شيء في Java من قبل ولم أعمل مع CORBA ، فسأسمح لنفسي بترك بعض التفاصيل خارج نطاق هذه المقالة.
يمكن تقسيم التطبيق بالكامل إلى 3 أجزاء:
- الحصول على واجهة IOR
- إنشاء كائن يشير إلى واجهة
- طرق واجهة الاتصال
لذلك ، وفقًا للوثائق ، يتم تخزين IOR في مكانين: في الملف
/var/opt/ericsson/blkcm/data/bulkcm.nameservice
وعلى خادم الويب
http: // "masterhost ip": 80 / ior / ExternalNameService.ior
سنستخدم الطريقة الأولى:
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; }
على وجه الدقة ، لن تعيدنا الطريقة المذكورة أعلاه إلى IOR ، ولكن إلى رابط إلى NameService (مصطلحات CORBA) ، والتي يمكن أن نحصل عليها من ملف IOR على خادم الويب. إذا كان أبسط: سنستخدم النتيجة لتهيئة الاتصال.
المرحلة الثانية هي تهيئة كائن اتصال 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);
الآن لدينا رابط إلى كائن يمكننا الوصول إليه عن طريق استدعاء أساليبه. بشكل خاص ، تُرجع طريقة
get_alarm_list القائمة التي نحتاجها. هنا هو كتابه من 3GPP:
تقوم هذه الطريقة بإرجاع معلومات الإنذار. إذا كان العلم
صحيح ، يجب أن تكون جميع معلومات الإنذار التي تم إرجاعها في AlarmInformationSeq
يحتوي على 0.1 أو أكثر من معلومات الإنذار. تكرار معلمة الإخراج
يجب أن تكون عديمة الفائدة. إذا كان العلم خاطئًا ، فلن تكون هناك معلومات إنذار
في AlarmInformationSeq. يحتاج IRPAgent إلى استخدام iter لاستردادها.
public void getActiveAlarms(){ BooleanHolder flag = new BooleanHolder(false);
تستقبل هذه الطريقة مكررًا يحتوي على قائمة من الإنذارات في شكل كائنات من نوع
StructuredEvent والتي تعرض بعد ذلك
التنبيه (التنبيه) في وحدة التحكم. يحتوي إدخال
StructuredEvent على
الرأس ، وفي الواقع ، بيانات البيانات
filterable_data . البيانات هي أيضًا سجل باسم
الاسم وقيمة
القيمة . وصف الحقول موجود أيضًا في المعيار:
سلسلة الشرط NV_NOTIFICATION_ID = "a" ؛
سلسلة الشرط NV_CORRELATED_NOTIFICATIONS = "b" ؛
سلسلة الشرط NV_EVENT_TIME = "c" ؛
سلسلة الثوابت NV_SYSTEM_DN = "d" ؛
سلسلة الثوابت NV_MANAGED_OBJECT_CLASS = "e" ؛
سلسلة الثوابت NV_MANAGED_OBJECT_INSTANCE = "f" ؛
سلسلة الثوابت NV_SPECIFIC_PROBLEM = "i" ؛
...
الآن سنقوم بتجميع كل هذا معًا ونشتق على سبيل المثال
والمشكلة الخاصة :
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); }
أخيرًا ، الكود الكامل للمسودة الناتجة:
كود كامل 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);
يتم تنفيذ الإطلاق بواسطة الأمر:
java -cp .: / opt / ericsson / fm_core / classes / alarmirp.jar AlarmClient
ما هي النتيجة: إلى جانب "المعجبين" ، لا أستخدم تطبيقات أخرى بعد. في المستقبل هناك
NotificationIRP - استقبال الأحداث مباشرة بعد ظهورها ،
BulkCmIRP - التكوين من نظام خارجي ، إلخ. التكنولوجيا متشابهة ، ولكن إذا لزم الأمر ، يمكنك كتابة مقال منفصل. ربما ، هذا كل شيء عن هذا الموضوع. يمكنني الإجابة على الأسئلة في التعليقات. شكرا لك!