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

上一篇文章介绍了利用《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);//设置requestGetAllManagedElementsRequest 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 blocke.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|30minrow.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());//floatrow2.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 blocke.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.mzph.cn/bicheng/60770.shtml

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

相关文章

深度学习之pytorch常见的学习率绘制

文章目录 0. Scope1. StepLR2. MultiStepLR3. ExponentialLR4. CosineAnnealingLR5. ReduceLROnPlateau6. CyclicLR7. OneCycleLR小结参考文献 https://blog.csdn.net/coldasice342/article/details/143435848 0. Scope 在深度学习中&#xff0c;学习率&#xff08;Learning R…

【扩散——BFS】

题目 代码 #include <bits/stdc.h> using namespace std; const int t 2020, off 2020; #define x first #define y second typedef pair<int, int> PII; int dx[] {0, 0, 1, -1}, dy[] {-1, 1, 0, 0}; int dist[6080][6080]; // 0映射到2020&#xff0c;2020…

Linux软件包管理与Vim编辑器使用指南

目录 一、Linux软件包管理器yum 1.什么是软件包&#xff1f; 2.什么是软件包管理器&#xff1f; 3.查看软件包 4.安装软件 ​编辑 5.卸载软件 Linux开发工具&#xff1a; 二、Linux编辑器---vim 1.vim的基本概念 (1) 正常/普通模式&#xff08;Normal mode&#xff0…

R门 - rust第一课陈天 -内存知识学习笔记

内存 #mermaid-svg-1NFTUW33mcI2cBGB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1NFTUW33mcI2cBGB .error-icon{fill:#552222;}#mermaid-svg-1NFTUW33mcI2cBGB .error-text{fill:#552222;stroke:#552222;}#merm…

数据结构--数组

一.线性和非线性 线性&#xff1a;除首尾外只有一个唯一的前驱和后继。eg&#xff1a;数组&#xff0c;链表等。 非线性&#xff1a;不是线性的就是非线性。 二.数组是什么&#xff1f; 数组是一个固定长度的存储相同数据类型的数据结构&#xff0c;数组中的元素被存储在一…

Vue的基础使用

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架…

unity单例模式的不同声明(待完善

总结&#xff1a; 这段代码实现了一个泛型单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;用于确保某个类&#xff08;由泛型参数 T 指定&#xff09;在整个应用程序中只有一个实例&#xff0c;并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…

SpringBoot后端解决跨域问题

1.全局方式 新建一个conifg配置类&#xff0c;内容如下&#xff1a; Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//是否发送Cookie.allowCrede…

群控系统服务端开发模式-应用开发-前端登录接口开发

一、修改验证方法 1、修改验证器 loginRules: {username: [{required: true, trigger: blur, validator: validateUsername}],password: [{required: true, trigger: blur, validator: validatePassword}],captcha_code: [{required: true, trigger: blur, validator: validat…

stream学习

Stream流 定义 Steam流&#xff0c;用于操作集合或者数组中的数据&#xff0c;大量结合了Lamda表达式的语法风格&#xff0c;代码简洁。 重点&#xff1a; 流只能收集一次 ​ 获取Stream流 Stream流要与数据源建立连接。 1.list ​ 直接调用steam()即可 // list List<Stri…

计算机三级 数据库技术

第一章 数据库应用系统开发方法 1.1 数据库应用系统生命周期 软件工程:软件工程的思想&#xff0c;即用工程的概念、原理、技术和方法对软件生产、开发的全过程进行跟踪和管理 软件开发方法:瀑布模型、快速原型模型、螺旋模型 DBAS生命周期模型 1.2 规划与分析 系统规划与定…

YOLOv11实战垃圾分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对4种垃圾数据集进行训练和优化&#xff0c;该数据集包含丰富的垃圾图像样本&am…

【初阶二】认识C语言—上

【初阶二】认识C语言—上 1.数据类型2.变量3.常量4.字符串5.转义字符6.注释7.选择语句 认识C语言讲的是C语言的基础知识&#xff0c;目的是让大家认识这些知识&#xff0c;后续文章会把这些知识深入讲解&#xff0c;知识点很多&#xff0c;篇幅原因分为上下两篇 1.数据类型 每…

线性DP 区间DP C++

线性DP 题一 数字三角形 解题思路 三角形内的某个点&#xff0c;可以从这个点的左上方或右上方来到这个点&#xff0c;因此有状态转移方程&#xff1a; f[i, j] max(f[i - 1, j - 1] a[i][j], f[i - 1][j] a[i][j]) 代码实现 #include<iostream> #include<algor…

D68【python 接口自动化学习】- python基础之数据库

day68 Python执行SQL语句 学习日期&#xff1a;20241114 学习目标&#xff1a;MySQL数据库-- 137 Python执行SQL语句插入到数据库 学习笔记&#xff1a; commit提交 自动commit 总结 commit提交&#xff1a;pymysql库在执行对数据库有修改操作的行为时&#xff0c;是需要通…

【项目组件】第三方库——websocketpp

目录 第三方协议&#xff1a;websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …

超越传统:探索ONLYOFFICE的革命性办公新纪元

目录 &#x1f341;引言 &#x1f341;一、ONLYOFFICE产品简介 &#xff08;一&#xff09;、介绍 &#xff08;二&#xff09;、基本功能简介 &#x1f341;二、核心功能具体介绍 1、编辑操作 2、文本与段落&#xff1a; 3、样式与图形&#xff1a; 4、表格与图表&…

python解析网页上的json数据落地到EXCEL

安装必要的库 import requests import pandas as pd import os import sys import io import urllib3 import json测试数据 网页上的数据结构如下 {"success": true,"code": "CIFM_0000","encode": null,"message": &quo…

115页PDF | 埃森哲_XX集团信息化能力成熟度评估及能力提升方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息化能力成熟度评估及能力提升方案&#xff0c;报告首先分析了集团的战略规划&#xff0c;包括调整优化期、转型升级期和跨越发展期的目标&#xff0c;然后识别了集团面临的内部挑战和外部压力&#xff0c;如管控体系不完善、业务板块多样化…

PostgreSQL中表的数据量很大且索引过大时怎么办

在PostgreSQL中&#xff0c;当表的数据量很大且索引过大时&#xff0c;可能会导致性能问题。以下是一些优化索引和表数据的方法&#xff1a; 1. 评估和删除不必要的索引 识别未使用的索引&#xff1a;使用pg_stat_user_indexes和pg_index系统视图来查找未被使用的索引&#x…