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

news/2024/11/8 11:44:26/

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

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

一、无须特别指定参数

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

1、官方文档

在这里插入图片描述

2、代码实例

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

代码中的WebServiceUtil是一个自定义的访问工具,专用于连接NCE北向接口和发起请求,具体代码可见上一篇文章《java访问华为网管软件NCE.html" title=iMaster NCE>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.ppmy.cn/news/1545344.html

相关文章

特征检测与特征匹配方法笔记+代码分享

在一幅图像中&#xff0c;总能发现其独特的像素点&#xff0c;这些点可以被视为该图像的特征&#xff0c;我们称之为特征点。在计算机视觉领域中&#xff0c;基于特征点的图像特征匹配是一项至关重要的任务&#xff0c;因此&#xff0c;如何定义并识别一幅图像中的特征点显得尤…

【vue2.0入门】认识vue工程

目录 引言一、工程目录介绍1. package.json文件2. src\App.vue3. src\components 文件夹4. src\assets 文件夹5. node_modules 文件夹6. 其他 二、安装 vuejs devtools 插件1. 下载插件2. 配置插件3. 使用插件 三、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开…

物联优化汽车齿轮锻造

在汽车齿轮的锻造工艺中&#xff0c;锻造温度、锻造压力与行程、锻造速度与锤击方式以及热处理工艺等核心参数扮演着举足轻重的角色。这些参数的精准控制与实时监测&#xff0c;对于提升生产效率、确保产品质量、削减生产成本以及推动生产智能化转型具有不可估量的价值。明达技…

遥测终端机RTU产品如何选型和配置

在配置远程终端单元&#xff08;RTU&#xff09;时&#xff0c;首先需要确认其支持的数据接口类型&#xff0c;例如常见的RS-232、RS-485接口&#xff0c;以及以太网连接方式。这些接口类型将决定RTU如何与其他设备进行数据交换和通信。 接下来&#xff0c;需要确定RTU支持的输…

【Rust中多线程同步机制】

Rust中多线程同步机制 多线程编程Rust中的多线程编程thread::spawnmove Rust中的线程间同步机制Rust线程间同步机制之MutexRust线程间同步机制之读写锁Rust线程同步机制之条件变量Rust中的信号量Rust中的Atomic Rust中线程间的数据传递总结 多线程编程 多线程编程&#xff0c;…

【C/C++】strncpy函数的模拟实现

零.导言 之前我们学习了strncpy函数&#xff0c;不妨我们现在尝试模拟实现strncpy函数的功能。 一.实现strncpy函数的要点 strncpy函数是一种字符串函数&#xff0c;可以按字节拷贝字符类型的数组&#xff0c;因此我们自定义的模拟函数需要两个char类型的指针参数&#xff1b;…

html5拖放

1、什么是拖放&#xff08;Drag 和 Drop&#xff09; 拖放&#xff0c;字面意思就是拖动&#xff0c;放置 在编程里面也是如此,拖放是一种常见的特性&#xff0c;即抓取对象以后拖到另一个位置。 在 HTML5 中&#xff0c;拖放是标准的一部分&#xff0c;任何元素都能够拖放。…

【论文复现】自动化细胞核分割与特征分析

本文所涉及所有资源均在这里可获取。 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 论文复现 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 自动化细胞核分割与特征分析 引言效果展示HoverNet概述HoverNet原理分析整…