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.rhkb.cn/news/468704.html

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

相关文章

基于SpringBoot的“在线考试系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线考试系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统登录界面图 用户注册界面图 管…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

科大讯飞面经,蛮简单的

先来看面经&#xff1a; 下面我来简单聊聊这些问题。 自我介绍 关于如何自我介绍&#xff0c;这个如果还不会或者还没有准备&#xff0c;请先准备好你要如何向面试官介绍自己。 面试本来就是一个自我推销的方式之一&#xff0c;如果自我介绍都不会说&#xff0c;你如何卖个好价…

首次超越扩散模型和非自回归Transformer模型!字节开源RAR:自回归生成最新SOTA!

文章链接&#xff1a;https://arxiv.org/pdf/2411.00776 项目链接&#xff1a;https://yucornetto.github.io/projects/rar.html 代码&模型链接&#xff1a;https://github.com/bytedance/1d-tokenizer 亮点直击 RAR&#xff08;随机排列自回归训练策略&#xff09;&#x…

通义千问API调用测试 (colab-python,vue)

文章目录 代码&#xff08;来自官网&#xff09;colab中用python测试Qwen2.5在官网上查看并确定过期时间这里看到我的免费额度到25年5月在同一个页面&#xff0c;点击API示例 前端调用直接在前端调用的优缺点以vue为例&#xff08;代码是基于官网node.js的代码转换而来&#xf…

立体工业相机提升工业自动化中的立体深度感知

深度感知对仓库机器人应用至关重要&#xff0c;尤其是在自主导航、物品拾取与放置、库存管理等方面。 通过将深度感知与各种类型的3D数据&#xff08;如体积数据、点云、纹理等&#xff09;相结合&#xff0c;仓库机器人可以在错综复杂环境中实现自主导航&#xff0c;物品检测…

LSTM+LightGBM+Catboost的stacking融合模型

基本介绍 针对目前大部分数据同时具有特征连续和特征不连续的特点&#xff0c;将神经网络模型如LSTM和回归树模型如XGboost,基于stacking集成学习原理进行融合 附有模型评价指标R2、RMSE、MAE、MSE&#xff0c;代码包含注释&#xff0c;可以直接运行。 融合过程 在机器学习中…

人工智能 | 文生视频大模型

简介 文生视频指的是将文本描述转化为视频内容的技术&#xff0c;2024年2月15日 OpenAI 正式对外发布 Sora 人工智能模型&#xff0c;在人工智能领域掀起了一场风波&#xff0c;这是计算机视觉领域的一个突破。 Sora 这一名称起源于日文中“空”的含义&#xff0c;暗示了其具…

测试实项中的偶必现难测bug--一键登录失败

问题描述:安卓和ios有出现部分一键登录失败的场景,由于场景比较极端,衍生了很多不好评估的情况。 产生原因分析: 目前有解决过多次这种行为的问题,每次的产生原因都有所不同,这边根据我个人测试和收集复现的情况列举一些我碰到的: 1、由于我们调用的是友盟的一键登录的…

Pr:视频过渡快速参考(合集 · 2025版)

Adobe Premiere Pro 自带七组约四十多个视频过渡 Video Transitions效果&#xff0c;包含不同风格和用途&#xff0c;可在两个剪辑之间创造平滑、自然的转场&#xff0c;用来丰富时间、地点或情绪的变化。恰当地应用过渡可让观众更好地理解故事或人物。 提示&#xff1a; 点击下…

Jest项目实战(7):部署文档网站到 GitHub Pages

关于部署网站&#xff0c;理论上来讲&#xff0c;只要你有一个服务器&#xff0c;你要采用什么样的方式来部署都是可以的。但是前提是你需要有一个服务器&#xff08;物理机、云服务器&#xff09;。 这一小节我们部署文档网站选择使用 github 来进行部署&#xff0c;因为 Git…

第十九周:机器学习

目录 摘要 Abstract 一、吴恩达机器学习Exp1——线性回归 1、单变量线性回归 1.1数据集的读取及可视化 1.2分割训练集和验证集 1.3扩展维度 1.4线性回归模型 1.5训练过程可视化 2、多变量线性回归 2.1加载数据集并可视化 2.2划分训练集和验证集 2.3线性回归模型 …

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中&#xff0c;如何延长电池的使用寿命是大家非常关心的问题&#xff0c;而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池&#xff0c;因此长时间的充电与长时间放点都不可取&#xff0c;但是在日常的使用过程中…

Python 爬虫数据清洗与存储:基础教程

Python 爬虫数据清洗与存储&#xff1a;基础教程 在爬虫数据获取完成后&#xff0c;数据往往是“原始”的&#xff0c;不适合直接使用。清洗和存储是将爬取到的原始数据转化为有用信息的关键步骤。本文将系统地介绍 Python 中进行数据清洗与存储的基本方法&#xff0c;帮助新手…

【博主推荐】VUE开发常用技术点收集

文章目录 1.系统主题的全局颜色变量申明和使用2.样式里面导入样式3.页面返回顶部功能4.页面实时更新时间功能5.页面条件判断的几种方式6.页面v-for使用7.页面路由跳转的几种方式8.vue3 js引用的几种方式9.Vue中引用和使用一个组件10.页面传参的几种方式VUE系列前端模板源码其他…

day08(单片机)时钟系统+定时器+PWM

目录 时钟系统定时器PWM 时钟系统 时钟基本概念 时钟源 晶体振荡器&#xff08;Crystal Oscillator&#xff09; RC振荡器&#xff08;Resistor-Capacitor Oscillator&#xff09; ​​​​​​​STM32U5时钟源 HSI(High Speed Internal) HSE(High Speed External) LSI(Low Spe…

linux盘扩容缩容

这里写目录标题 文件格式介绍问题&#xff1a;当根盘满了过后怎么办&#xff1f;解决方式&#xff1a; Xfs文件格式缩容扩容1. 备份2. 卸载home3. 缩容home&#xff08;home盘为xfs文件格式&#xff09;4. 扩容 /5. 恢复home备份 Ext4文件格式缩容扩容1. 备份&#xff08;可选&…

通过DNS服务器架构解释DNS请求过程

在前面的章节,这里,基于PCAP数据包和RFC文档详细介绍了DNS请求和响应的每个字段的含义。但是在现实的网络世界中,DNS请求和响应的数据包是怎么流动的,会经过哪些设备。本文将着重说明一下目前网络空间中DNS请求和响应的流动过程。 当前网络空间中比较常见DNS请求的流程如下…

【GeoJSON在线编辑平台】(2)吸附+删除+挖孔+扩展

前言 在上一篇的基础上继续开发&#xff0c;补充上吸附功能、删除矢量、挖孔功能。 实现 1. 吸附 参考官方案例&#xff1a;Snap Interaction 2. 删除 通过 removeFeature 直接移除选中的要素。 3. 挖孔 首先是引入 Turf.js &#xff0c;然后通过 mask 方法来实现挖孔的…

分组校验在Spring中的应用详解

目录 前言1. 什么是分组校验2. 分组校验的基本原理3. 分组校验的实现步骤3.1 定义分组接口3.2 在校验项中指定分组3.3 校验时指定要校验的分组3.4 默认分组和分组的继承 4. 分组校验的优势和适用场景4.1 优势4.2 适用场景 5. 常见问题与解决方案5.1 校验未生效5.2 无法识别默认…