java访问华为网管软件iMaster NCE的北向接口时传递参数问题

news2024/11/15 4:09:10

上一篇文章介绍了利用《java访问华为网管软件iMaster NCE的北向接口》的一般性步骤,这里详细介绍其中一个读取性能数据的示例。原因是读取华为网管软件北向接口,完全找不到可供参考的例子。如果不需要传递什么参数,就能获取到结果,比如获取全部网元数据,这种相对还比较简单。但如果需要指定参数,比如读取指定网元的性能数据,如何传递参数就是个大问题。我上周尝试去读取NCE软件的性能接口时,反复向NCE软件请求,结果总是返回冷冰冰的报错信息:“Object type error”,说是传递参数不对,后来才知道,要将网元信息完整的传过去才可以。关于NCE软件北向接口的数据类型,真是异常复杂。阅读官方文档,一种类型,实质包含的是另一种类型,结果指来指去,让人晕头转向。

以下是一些代表性的例子。

一、无须特别指定参数

以下是一个获取全部网元信息的例子。

1、官方文档

在这里插入图片描述

2、代码实例

以下代码可见,request的设置相对简单。

代码中的WebServiceUtil是一个自定义的访问工具,专用于连接NCE北向接口和发起请求,具体代码可见上一篇文章《java访问华为网管软件iMaster NCE的北向接口》。

/**
 * 查询指定管理域的所有网元信息
 */
public List<ManagedElementType> getAllManagedElements() {
    List<ManagedElementType> list = null;

    ManagedElementRetrieval_RPC ws = WebServiceUtil.getWebService("ManagedElementRetrieval", ManagedElementRetrieval_RPC.class);

    //设置request
    GetAllManagedElementsRequest request = new GetAllManagedElementsRequest();
    NamingAttributeType mdOrMlsnRef = new NamingAttributeType();
    RelativeDistinguishNameType rd = new RelativeDistinguishNameType();
    rd.setType("MD");
    rd.setValue(WebServiceUtil.getStrMD());
    mdOrMlsnRef.getRdn().add(rd);
    request.setMdOrMlsnRef(mdOrMlsnRef);

    try {
        MultipleMeObjectsResponseType response = ws.getAllManagedElements(WebServiceUtil.getHeader(), request);
        list = response.getMeList().getMe();
        //可查看ManagedElementType结构,在《北向 XML 开发指南(存量)》里
        meList = list;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return list;
}

二、需要特别指定参数

以下是一个获取全部网元的性能数据例子。

1、官方文档

在这里插入图片描述

2、代码实例

思想:首先获取全体 网元,然后分别查找这些网元的性能数据。将网元作为参数传递。

/**
* 查询所有网元的当前性能数据
*
* String[] parameters:待查询的性能类型
*/
public List<Map<String, Object>> getAllCurrentPerformanceMonitoringData(String[] parameters) {
   List<Map<String, Object>> data = new ArrayList<>();

   List<ManagedElementType> lis = this.getAllManagedElements();//读取全部网元
   if (lis != null) {
       for (ManagedElementType el : lis) {
           getAllCurrentPerformanceMonitoringData(el, data,parameters);
       }
   }

   return data.stream()//按名称排序
           .sorted(Comparator.comparing(m -> Optional.ofNullable(m.get("tpName"))
                   .map(Object::toString)
                   .orElse("")))
           .collect(Collectors.toList());
}

/**
 * 查询指定网元的性能数据
 *
 * ManagedElementType el,网元
 * List<Map<String, Object>> data,接收返回数据的数组
 * String[] parameters,待查询的性能类型
 */
private void getAllCurrentPerformanceMonitoringData(ManagedElementType el,
                                                   List<Map<String, Object>> data,
                                                   String[] parameters) {
   PerformanceManagementRetrieval ws = WebServiceUtil.getWebService("PerformanceManagementRetrieval", PerformanceManagementRetrieval.class);
   GetAllCurrentPerformanceMonitoringDataRequest request = getPerformanceRequest(el,parameters);

   /**
    * tpName NamingAttributeType 对象名称 -
    * layerRate LayerRateType 对象的层速率 -
    * granularity String 监视周期 15min|24h|NA|30s|30min -
    * pmMeasurementList PerformanceMonitoringMeasurementListType 测量数据列表 -
    *      pmParameterName String 性能记录的参数名称 -
    *      pmLocation PerformanceMonitoringLocationType 性能记录的发生位置 -
    *      value Float 性能值 -
    *      measurementUnits String 性能记录的单位 -
    *      pmIntervalStatus PerformanceMonitoringIntervalStatusType 区段状态
    *          PMIS_Valid 历史性能|PMIS_Incomplete 当前性能
    * retrievalTime XMLGregorianCalendar 网管系统从网元上获取性能数据的时间
    */
   try {
       MultiplePerformanceMonitoringDataObjectsResponseType response = ws.getAllCurrentPerformanceMonitoringData(WebServiceUtil.getHeader(), request);
       List<PerformanceMonitoringDataType> list = response.getPmDataList().getPmData();
       for (PerformanceMonitoringDataType item : list) {
           Map<String, Object> row = new HashMap<>();
           row.put("tpName", getNameAttributeTypeValue(item.getTpName().getValue().getRdn()));//对象名称
           row.put("layerRate", item.getLayerRate().getValue().getValue());//层速率
           row.put("granularity", item.getGranularity().getValue());//监视周期: 15min|24h|NA|30s|30min
           row.put("retrievalTime", item.getRetrievalTime().toGregorianCalendar().getTime());//网管系统从网元上获取性能数据的时间
           //测量数据列表
           List<PerformanceMonitoringMeasurementType> lisPmm = item.getPmMeasurementList().getValue().getPmMeasurement();
           List<Map<String, Object>> dataPmm = new ArrayList<>();
           for (PerformanceMonitoringMeasurementType pmm : lisPmm) {
               Map<String, Object> row2 = new HashMap<>();
               row2.put("pmParameterName", pmm.getPmParameterName().getValue());//性能记录的参数名称
               row2.put("pmLocation", pmm.getPmLocation().getValue().value());//性能记录的发生位置
               row2.put("value", pmm.getValue().getValue());//float
               row2.put("measurementUnits", pmm.getMeasurementUnits().getValue());//性能记录单位
               row2.put("pmIntervalStatus", pmm.getPmIntervalStatus().getValue().value());//区段状态:PMIS_Valid 历史性能|PMIS_Incomplete 当前性能
               dataPmm.add(row2);
           }
           row.put("pmms", dataPmm);

           data.add(row);
       }
   } catch (GetAllCurrentPerformanceMonitoringDataException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
   }
}

//构造request
private GetAllCurrentPerformanceMonitoringDataRequest getPerformanceRequest(ManagedElementType el,String[] parameters) {
   GetAllCurrentPerformanceMonitoringDataRequest request = null;

   List<RelativeDistinguishNameType> rdn = el.getName().getRdn();
   if (rdn != null && rdn.size() > 0) {
       request = new GetAllCurrentPerformanceMonitoringDataRequest();

       /**
        * GetAllCurrentPerformanceMonitoringDataRequest:
        *
        * pmObjectSelectList
        * 类型:PerformanceMonitoringObjectSelectListType
        * 按该监视条件对查询结果进行过滤
        *
        *      PerformanceMonitoringObjectSelectListType:
        *      pmObjectSelect List<PerformanceMonitoringObjectSelectType> 监视条件列表
        *
        *          PerformanceMonitoringObjectSelectType:
        *              name 非空 NamingAttributeType
        *              layerRateList
        *              pmLocationList
        *              granularityList
        *
        * pmParameterList
        * 类型:PerformanceMonitoringParameterNameListType
        * 只查询列表中存在的参数类型的性能(为空代表查所有参数类型的性能)
        *      pmParameterName List<String>
        *
        */
       NamingAttributeType namingAttribute = new NamingAttributeType();
       for (RelativeDistinguishNameType rd : rdn) {
           namingAttribute.getRdn().add(rd);
       }

       ObjectFactory objFac = new ObjectFactory();
       JAXBElement<NamingAttributeType> nameElement = objFac.createPerformanceMonitoringObjectSelectTypeName(namingAttribute);

       PerformanceMonitoringObjectSelectType pmos = new PerformanceMonitoringObjectSelectType();
       pmos.setName(nameElement);
//            pmos.setLayerRateList(null);
//            pmos.setGranularityList(null);
//            pmos.setPmLocationList(null);

       PerformanceMonitoringObjectSelectListType selectList = new PerformanceMonitoringObjectSelectListType();
       selectList.getPmObjectSelect().add(pmos);
       request.setPmObjectSelectList(selectList);

       //查询哪些性能?
       PerformanceMonitoringParameterNameListType pmParameterList = getPmParameterList(parameters);
       request.setPmParameterList(pmParameterList);
   }

   return request;
}

//指定待查找的性能类型
private PerformanceMonitoringParameterNameListType getPmParameterList(String[] parameters) {
   if(parameters == null) return null;

   PerformanceMonitoringParameterNameListType pmParameterList =
           new PerformanceMonitoringParameterNameListType();

//        String[] myParameters = parameters != null ? parameters : new String[] {
//                "丢包事件",
//                "收到的错误超长包",
//                "收到的坏包字节",
//                "发送的坏包字节",
//                "发送丢包事件",
//                "发送的超长包",
//                "FCS错误帧(MAC_FCS)",
//                "接收方向端口带宽利用率平均值",
//                "发送方向端口带宽利用率平均值",
//                "单板温度最大值",
//                "单板温度最小值",
//                "单板温度当前值",
//                "OSC通道不可用秒",
//                "风扇转速最大值",
//                "风扇转速最小值",
//                "风扇转速当前值"
//        };
   // 将数组中的每个元素添加到 pmParameterList 中
   for (String parameter : parameters) {
       pmParameterList.getPmParameterName().add(parameter);
   }

   return pmParameterList;
}

3、调用实例

调用刚才写的方法 getAllCurrentPerformanceMonitoringData()

public String getPerformanceInfo() {
    JSONArray jsonArray = new JSONArray();

    List<Map<String, Object>> lis = getAllCurrentPerformanceMonitoringData(new String[]{
            "丢包事件",
            "发送丢包事件",
            "接收方向端口带宽利用率平均值",
            "发送方向端口带宽利用率平均值",
            "收到的字节",
            "发送的字节"
    });
}

4、关于性能类型

由上可知,性能类型都是一些字符串,比如:

new String[]{
        "丢包事件",
        "发送丢包事件",
        "接收方向端口带宽利用率平均值",
        "发送方向端口带宽利用率平均值",
        "收到的字节",
        "发送的字节"
}

它们从哪里获取?很遗憾,官方文档没有给出,至少我是没有看到。我用了一个笨办法,写了一个方法,通过访问NCE获取,然后将它们一一列举。

思想:调用上面写的方法 getAllCurrentPerformanceMonitoringData(),但不指定待查询的性能类型,于是系统会查询所有的性能类型,获取后将性能类型去重、输出:

public String getPerformanceParams() {//性能参数
    List<String> params = new ArrayList<>();

    List<Map<String, Object>> lis = nceApiService.getAllCurrentPerformanceMonitoringData(null);
    if (lis != null && lis.size() > 0) {
        JSONObject jParam = new JSONObject();
        for (Map<String, Object> map : lis) {
            List<Map<String, Object>> pmms = (List<Map<String, Object>>) map.get("pmms");
            for (Map<String, Object> pmm : pmms) {
                String name = pmm.get("pmParameterName").toString();
                if (!params.contains(name)) { // 检查是否已存在
                    params.add(name); // 仅当不存在时才添加
                }
            }
        }
    }

    // 用 <br> 分隔每个参数,这样浏览器中会显示为每行一个
    return String.join("<br>", params);
}

结果得到了清单如下:

收到的包(64字节)
收到的包(65~127字节)
收到的包(128~255字节)
收到的包(256~511字节)
收到的包(512~1023字节)
收到的包(1024~1518字节)
发送的包(64字节)
发送的包(65~127字节)
发送的包(128~255字节)
发送的包(256~511字节)
发送的包(512~1023字节)
发送的包(1024~1518字节)
收到的单播包
收到的组播包
收到的广播包
发送的单播包
发送的组播包
发送的广播包
收到的“PAUSE”帧
发送的“PAUSE”帧
丢包事件
收到的超短包
收到的超长包
收到的碎片
收到的错误超长包
收到的好包字节
发送的好包字节
收到的坏包字节
发送的坏包字节
收到的包(1519~MTU字节)
发送的包(1519~MTU字节)
发送丢包事件
发送的超长包
FCS错误帧(MAC_FCS)
收到的字节
收到的包
发送的字节
发送的包
接收方向端口带宽利用率
接收方向端口带宽利用率最小值
接收方向端口带宽利用率最大值
接收方向端口带宽利用率平均值
发送方向端口带宽利用率
发送方向端口带宽利用率最小值
发送方向端口带宽利用率最大值
发送方向端口带宽利用率平均值
激光器偏置电流最大值
激光器偏置电流最小值
激光器偏置电流当前值
激光器输入光功率最大值
激光器输入光功率最小值
激光器输入光功率当前值
激光器输出光功率最大值
激光器输出光功率最小值
激光器输出光功率当前值
激光器工作温度最大值
激光器工作温度最小值
激光器工作温度当前值
单板温度最大值
单板温度最小值
单板温度当前值
ODU0的PM段不可用秒
ODU0的PM段远端不可用秒
OTU2的SM段不可用秒
OTU2的SM段远端不可用秒
OTU2的SM段后向进入定位错误秒
OTU2的SM段进入定位错误秒
ODU2的PM段不可用秒
ODU2的PM段远端不可用秒
总输入光功率最大值
总输入光功率最小值
总输入光功率当前值
激光器工作电流最大值
激光器工作电流最小值
激光器工作电流当前值
激光器背光电流最大值
激光器背光电流最小值
激光器背光电流当前值
掺铒光纤放大器激光器制冷电流最大值
掺铒光纤放大器激光器制冷电流最小值
掺铒光纤放大器激光器制冷电流当前值
激光器温度最大值
激光器温度最小值
激光器温度当前值
总输出光功率最大值
总输出光功率最小值
总输出光功率当前值
信道光功率最大值
信道光功率最小值
信道光功率当前值
OSC通道不可用秒
风扇转速最大值
风扇转速最小值
风扇转速当前值
风扇转速波动值
单板物理内存最大值
单板物理内存最小值
单板物理内存当前值
单板当前温度
ODU0的PM段远端背景误码块
ODU0的PM段远端误码秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙 入门——ArkUI 自定义组件间的“后代“双向同步@Provide和@Consume装饰器小结(五)

文章大纲 引言一、Provide和Consume装饰器概述1、Provide和Consume关系的绑定2、使用规则3、变量的传递/访问规则4、支持的观察变化的场景5、Provide和Consume变量的值初始化和更新机制5.1、初始渲染5.2、当Provide装饰的数据变化时&#xff1a;5.3、当Consume装饰的数据变化时…

【MySQL从入门到放弃】InnoDB磁盘结构(一)

前言 从MySQL 5.5版本开始默认 使用InnoDB作为引擎&#xff0c;它擅长处理事务&#xff0c;具有自动崩溃恢复的特性&#xff0c;在日常开发中使用非常广泛。 下面是官方的InnoDB引擎架构图&#xff0c;主要分为内存结构和磁盘结构两大部分。 上一篇文章&#xff0c;我们解析了…

C哈的刷题计划之输出数字螺旋矩阵(1)

1、盲听C哈说 都说数据结构与算法是编程的核心&#xff0c;它们两个是内功与心法&#x1f600;&#xff0c;其它编程工具只是招式&#xff0c;学会了内功与心法&#xff0c;学习新事物&#xff08;这里特指层出不穷的IT技术&#xff09;就没有那么难了&#xff0c;实际上&#…

cv::RotatedRect::points误差较大

最后发现不是point的精度问题&#xff0c;float不至于产生这么大误差&#xff0c;是自己代码里缓存了顶点坐标&#xff0c;后面由手动修改了旋转矩形的角度&#xff0c;导致不匹配&#xff01; 下文可以忽略了-_-! 发现一个天坑&#xff0c;通过高宽和角度构造了一个旋转矩形 …

ThinkServer SR658H V2服务器BMC做raid与装系统

目录 前提准备 一. 给磁盘做raid 二. 安装系统 前提准备 磁盘和系统BMC地址都已经准备好&#xff0c;可正常使用。 例&#xff1a; 设备BMC地址&#xff1a;10.99.240.196 一. 给磁盘做raid 要求&#xff1a; 1. 将两个894G的磁盘做成raid1 2. 将两块14902G的磁盘各自做…

7天用Go从零实现分布式缓存GeeCache(学习)(2)

参考:https://geektutu.com/post/geecache-day2.html // Cache 是一个 LRU 缓存&#xff08;最近最少使用缓存&#xff09;&#xff0c;它不是并发安全的。 type Cache struct { maxBytes int64 // 缓存的最大字节数 nbytes int64 …

Ajax 与 Vue 框架应用点——随笔谈

老式 在老式的技术中&#xff0c;一个网页通常由前端工程师直接使用 HTML、CSS、JavaScript 编写而成 这种方式的优点很明显&#xff1a;简单粗暴&#xff0c;方便工程师以简单的思维完成工作 当然&#xff0c;缺点也很明显&#xff0c;包括但不限于&#xff1a; 直接原生开发…

鸿蒙动画开发06——打断动画

1、前 言 UI界面除了运行动画之外&#xff0c;还承载着与用户进行实时交互的功能。当用户行为根据意图变化发生改变时&#xff0c;UI界面应做到即时响应。 例如用户在应用启动过程中&#xff0c;上滑退出&#xff0c;那么启动动画应该立即过渡到退出动画&#xff0c;而不应该…

vue2和vue3的区别详解

vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 1.Eureka两个核心组件 Eureka Server &#xff1a;服务注册中心…

用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种架构模式&#xff0c;广泛应用于现代前端开发&#xff0c;尤其是在微软的WPF&#xff08;Windows Presentation Foundation&#xff09;应用程序中。它旨在通过将视图&#xff08;UI&#xff09;与业务逻辑&#xff08;…

飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 本文旨在详细介绍如何在飞牛云NAS上利用Docker部署WordPress&a…

论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION

SUDORMRF: EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION 人的精神寄托可以是音乐&#xff0c;可以是书籍&#xff0c;可以是运动&#xff0c;可以是工作&#xff0c;可以是山川湖海&#xff0c;唯独不可以是人。 Depthwise Separable Convolution 深度分离卷积&a…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

/// ts中的三斜线指令 | 前端

第一次看到注意到这行代码&#xff0c;不知道的还以为是注释呢&#xff0c;查了资料才知道这是typescript中的三斜线指令&#xff0c;那有什么作用呢&#xff1f; 1. 这行代码是TypeScript中的一个三斜线指令&#xff08;Triple-Slash Directive&#xff09;&#xff0c;用于…

学习日记_20241110_聚类方法(K-Means)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

SMA-BP基于黏菌算法优化BP神经网络时间序列预测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

ssm103宠物领养系统+vue(论文+源码)_kaic

毕业设计&#xff08;论文&#xff09; 宠物领养系统的设计与实现 学生姓名&#xff1a; 二级学院&#xff1a; 班级名称&#xff1a; 指导教师&#xff1a; 年 月 日 录 摘 …

Elasticsearch如果集群出现节点故障,我应该如何快速定位问题?

当 Elasticsearch (ES) 集群发生故障时&#xff0c;快速定位问题源头非常重要。Elasticsearch 是一个分布式系统&#xff0c;故障可能由多种原因引起&#xff0c;涉及到硬件、配置、网络、集群本身的健康状况等多个层面。以下是一些定位问题的步骤和工具&#xff1a; 检查集群…

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不同服务pod内部间访问 1、service 在K8S中&#xff0c;Service是一种抽象&#xff0c;定义了一组Pod的逻辑集合和访问这些Pod的策略。首先&#xff0c;我们需…