Ошибка Java Corba BAD_PARAM

Я пытаюсь установить соединение с Huawei U2000 NBI corba, чтобы получать сигналы тревоги, используя файл .ior для подключения. У меня уже есть файлы IDL, скомпилированные в Java. Ниже мой основной код, инициализирующий ORB.

package com.be.u2k;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import org.omg.CORBA.ORB;

import AlarmIRPSystem.AlarmIRP;
import AlarmIRPSystem.AlarmIRPHelper;

public class Main {

    public static void main(String[] args) {

        try {
          String filename = System.getProperty ("user.home") + System.getProperty ("file.separator")+"u2k.ior";

          File f = new File(filename);

          if (!f.exists()) {
            System.out.println("File " + filename + " does not exist.");
            System.exit(-1);
          } else if (f.isDirectory()) {
            System.out.println("File " + filename + " is a directory.");
            System.exit(-1);
          }

          BufferedReader br = new BufferedReader(new FileReader(f));
          String iorContents = br.readLine();
          br.close();

          ORB orbWithIor = ORB.init(args, null);
          org.omg.CORBA.Object obj = orbWithIor.string_to_object(iorContents);

          AlarmIRP alarmIrp = AlarmIRPHelper.narrow(obj);
          System.out.println("AlarmIRPHelper.narrow success!") ;
        } catch (Exception e) {
          System.out.println("ERROR : " + e) ;
          e.printStackTrace(System.out);
        }
    }
}

Почему я продолжаю получать ошибку BAD_PARAM при запуске с

java -jar ServerU2kAlarm.jar

admin@ip-10-44-0-10:~$ java -jar ServerU2kAlarm.jar
ERROR : org.omg.CORBA.BAD_PARAM:   vmcid: 0x0  minor code: 0  completed: No
org.omg.CORBA.BAD_PARAM:   vmcid: 0x0  minor code: 0  completed: No
    at AlarmIRPSystem.AlarmIRPHelper.narrow(AlarmIRPHelper.java:60)
    at com.be.u2k.Main.main(Main.java:36)

Я ничего не пропустил с моим объектом ORB? Спасибо.


person Roxxy    schedule 26.07.2017    source источник


Ответы (1)


Я сейчас занимаюсь тем же вопросом. Сначала вам нужно получить EPIRP для HW U2000. Вот пример кода AlarmIRP.Code, который еще не завершен. Чтобы перейти к IOR используемой службы, в методе get_IRP_reference должны быть указаны соответствующие irpId и irpClassName.

Для managerIdentifier прочитайте это объяснение: managerIdentifier value

Изображение для отношений HW U2000 между IRP

        ***
        Properties properties = new Properties();
        properties.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
        properties.put("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
        properties.put("ORBInitRef.NameService", settings.getIorString());

        // Connect to name service
        ORB orb = ORB.init((String[]) null, properties);
        POA poa = POAHelper.narrow(orb.resolve_initial_references(settings.getRootPoaName()));
        poa.the_POAManager().activate();
        logger.info("ORB init success");

        org.omg.CORBA.Object obj = orb.string_to_object(settings.getIorString());

        String epirpVersion = null;
        String systemDn = null;
        String irpId = null;
        String irpClassName = null;
        EPIRP epirp = EPIRPHelper.narrow(obj);
        String[] epirpVersions = epirp.get_EP_IRP_versions();
        for (String str : epirpVersions) {
            if (null != str && !"".equals(str.trim())) {
                epirpVersion = str;
            }
        }

        SupportedIRPListTypeHolder supportedIrpList = new SupportedIRPListTypeHolder();
        if (ResultType._OK == epirp.get_IRP_outline("", supportedIrpList).value()) {
            SupportedIRPListTypeElement[] typeHolder = supportedIrpList.value;
            for (SupportedIRPListTypeElement irpListEle : typeHolder) {
                systemDn = irpListEle.systemDN;

                logger.info("dnType:    " + systemDn);
                for (IRPElement irpElement : irpListEle.irpList) {
                    irpId = irpElement.irpId;
                    logger.info("irpId: " + irpId);
                    irpClassName = irpElement.irpClassName;
                    logger.info("irpClassName: " + irpClassName);
                    logger.info("irpVersion: " + irpElement.irpVersion);
                    logger.info("irpManagementScope: ");
                    for (String s : irpElement.irpManagementScope.value()) {
                        logger.info(s);
                    }
                }
            }
        } else {
            logger.error("Failed");
        }

        StringHolder alarmIrpIOR = new StringHolder();
        epirp.get_IRP_reference(managerIdentifier, systemDn, irpId, irpClassName, alarmIrpIOR);
        logger.info("AlarmIRP:" + alarmIrpIOR.value);

        //Connect to AlarmIRP
        AlarmIRP alarmIRP = AlarmIRPHelper.narrow(orb.string_to_object(alarmIrpIOR.value));
person Erdi Gürbüz    schedule 30.07.2017
comment
Привет, egcodes, мне удалось инициализировать соединение CORBA с U2000 с помощью предоставленного вами ответа. Я еще раз просмотрел документы и нашел это Отношения между IRP. Означает ли это, что мне нужно сначала перейти к NotificationIRP, прежде чем я перейду к AlarmIRP? Если я собираюсь передать другое строковое значение ior методу AlarmIRPHelper.narrow, то как мне получить строковое значение ior из объекта NotificationIRP? Я проверил класс NotificationIRP, и там не было метода get_IRP_outline. - person Roxxy; 31.07.2017
comment
Во-первых, вы должны сузить этот сервис EPIRP. Затем вы получаете другую услугу (тревога, уведомление) IOR от EPRIP obj. - person Erdi Gürbüz; 31.07.2017
comment
Спасибо egcodes. Благодаря вашему ответу удалось сузить EPIRP. Но теперь я получаю сообщение об ошибке ниже, а затем использую ior, полученный из объекта EPIRP. NotificationIRP notifIrp = NotificationIRPHelper.narrow(orb.string_to_object(notifIrpIOR.value)); Именно в этой части произошла ошибка. Это та же ошибка для NotificationIRP и AlarmIRP. ERROR : org.omg.CORBA.BAD_PARAM: Narrow failed vmcid: 0x0 minor code: 0 completed: No org.omg.CORBA.BAD_PARAM: Narrow failed vmcid: 0x0 minor code: 0 полный журнал - person Roxxy; 31.07.2017
comment
Я думаю, что тревога IOR или уведомление IOR неверны, которые вы получили от EPIRP. Видели ли вы идентификатор AlarmIRP и имя класса или NotficationIrp в списке поддерживаемых IrpList? Я больше не писал код, так как в моей системе HWU2000 нет сервисов alarmIRP,notificationIRP. - person Erdi Gürbüz; 31.07.2017
comment
Я не видел ни одного. Это то, что я получил только из списка поддерживаемых IrpList dnType: DC=www.huawei.com , SubNetwork=1 , ManagementNode=1 , IRPAgent=1 irpId: 8 irpClassName: EPIRP irpVersion: EP IRP V1.2.0 irpManagementScope: Что это значит, если имя класса AlarmIRP или NotificationIRP отсутствует? - person Roxxy; 31.07.2017
comment
Я застрял на том же месте. Поэтому мне интересно, активны ли эти службы? Потому что если да, то они должны появиться здесь. - person Erdi Gürbüz; 31.07.2017
comment
Привет, egcodes, спасибо, ты очень помог. Мне удалось получить IOR для AlarmIRP после повторного просмотра документации таблицы 3-9 вместо передачи Версия EPIRP в метод get_IRP_outline epirp.get_IRP_outline(epirpVersion, supportedIrpList) я передал пустую строку epirp.get_IRP_outline("", supportedIrpList). Он возвратил все все IRP, поддерживаемые EPIRP агента IRPA. - person Roxxy; 01.08.2017
comment
Вы успешно получили и прочитали значения данных списка аварийных сигналов? Я продолжаю получать эту ошибку ОШИБКА: org.omg.CORBA.MARSHAL : Слишком большая длина последовательности при чтении значений списка сигналов тревоги - person Roxxy; 03.08.2017
comment
Я ответил на ваш вопрос этой ссылкой: stackoverflow.com/questions/45475682/ - person Erdi Gürbüz; 03.08.2017