java访问华为网管软件iMaster NCE的北向接口
最近做的一个项目,需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE(以下简称NCE)用于管理项目的整个网络,尤其是光网络。业主要求我们访问该软件提供的对外接口,读取一些网络信息,比如网元、故障告警、性能等。
NCE的接口提供了多种协议的版本,给过来的资料是基于SOAP的WebService,据说目前最常用的http版本要收费。
基于SOAP的WebService,我以前用.NET的时候搞过。首先要在项目里访问WebService的WSDL,生成一个客户端(代理),然后本地通过此代理对接口进行访问。Java项目也是类似的套路。以下是d调用XML接口的开发步骤介绍,并附上一个读取NCE上告警信息数量的实例。
一、开发前准备
1、选择SOAP中间件
在开始开发之前,需要选择适当的SOAP中间件来实现WebService的客户端。
开源SOAP中间件主要包括:
Apache CXF
Apache AXIS
商业SOAP中间件主要包括:
IBM Websphere
BEA Weblogic
理论上可以自由选择任意符合SOAP规范的中间件以进行客户端的开发。华为选择Apache CXF作为服务端中间件,同时建议客户端也采用Apache CXF,以获得最大的兼容性。不过Apache CXF只支持使用JAVA作为编程语言。我们用的正是java,很自然就选用Apache CXF。
2、获取WSDL文件
接入XML接口,首先需要获取WSDL文件。获取WSDL的方式有两种,分别是使用发布文档中打包的WSDL文件,以及直接访问每一个XML接口所在服务地址来获取。可以通过北向XML接口服务地址获取WSDL,比如http://10.71.226.29:9997/ManagedElementRetrieval?wsdl
这种方式一次只能获取一种服务的WSDL。由于厂家直接给了所有WSDL,所以这一步就省了。
3、生成Stub代码
1)生成代码
获取到WSDL文件后,需要通过Apache CXF附带的wsdl2java工具将其转换成JAVA代码。wsdl2java可以到Apache CXF官网下载。需要注意的是,新的版本不支持JDK8,如果还是JDK8,最后的版本是apache-cxf-3.5.9。
生成语句示例:
apache-cxf不需安装,解压即用。
cd D:\soft\develop\wsdl\apache-cxf-3.5.9\binwsdl2java -client -xjc-npa -d q:\test2 Q:\wsdl\ManageResourceInventory\IIS\wsdl\TopoViewRetrieval\TopoViewRetrievalHttp.wsdl
生成了一堆代码:
2)创建Stub代码项目
将生成的代码搭建一个项目,比如叫mtop项目。则可以将它生成一个jar包,比如叫mtop.jar。
3)应用Stub代码
然后将它放到我们读取NCE的项目中:
4、后面加入新的接口
上面只是生成了一个wsdl的Stub代码。如果后面需要加入新的wsdl,则如法炮制,先用wsdl2java生成Stub代码,然后将整个代码文件拷贝到Stub项目,遇到同名的忽略,不要覆盖,相当于只拷贝了新增的文件。然后重新生成jar包。
二、示例
以下是一个读取NCE告警数量的示例。
1、基本工具
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.landtool.jbh.entity.Otn;
import com.landtool.jbh.service.OtnService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;
import org.tmforum.mtop.fmw.xsd.hdr.v1.CommunicationPatternType;
import org.tmforum.mtop.fmw.xsd.hdr.v1.CommunicationStyleType;
import org.tmforum.mtop.fmw.xsd.hdr.v1.Header;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.xml.ws.Holder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** otn的地址及账号信息,既定义于配置文件,也保存于数据库* 从代码可看出,优先级上,数据库 > 配置文件*/
@Component
public class WebServiceUtil {// the type of communication patternprivate static CommunicationPatternType patternType = CommunicationPatternType.SIMPLE_RESPONSE;// the type of communication styleprivate static CommunicationStyleType styleType = CommunicationStyleType.RPC;// the Web Service URLprivate static String strURL = "http://10.0.2.18:9997/";public void setStrUrl(String value) {WebServiceUtil.strURL = value;}// userNameprivate static String strUser = "BXuser";public void setStrUser(String value) {WebServiceUtil.strUser = value;}// passwordprivate static String strPassword = "Changeme_147";public void setStrPassword(String value) {WebServiceUtil.strPassword = value;}// MDprivate static String strMD = "Huawei/NCE";@Value("${data-oc.md}")public void setStrMD(String value) {WebServiceUtil.strMD = value;}public static String getStrMD() {return WebServiceUtil.strMD;}@Resourceprivate OtnService otnService;@PostConstructpublic void init() {Otn otn = new Otn();List<Otn> list = this.otnService.queryByPage(otn, PageRequest.of(0, 1000)).getContent();if (list.size() > 0) {otn = list.get(0);setStrPassword(otn.getPassword());setStrUser(otn.getAccount());setStrUrl(String.format("http://%s:%s/", otn.getIp(), otn.getPort()));setStrMD(otn.getNote());}}public static <T> T getWebService(String action, Class<T> clazz) {JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();factory.setServiceClass(clazz);Map<String, Object> properties = factory.getProperties();if (properties == null) {properties = new HashMap<String, Object>();factory.setProperties(properties);}properties.put("set-jaxb-validation-event-handler", Boolean.FALSE);factory.setAddress(strURL + action);T webservice = (T) factory.create();try {//TrustHttpsConnection();//configureSSLClient(webservice);} catch (Exception e) {e.printStackTrace();}return webservice;}public static Holder<Header> getHeader() {Header header = new Header();header.setCommunicationPattern(patternType.value());header.setCommunicationStyle(styleType.value());header.setBatchSequenceNumber(1L);header.setRequestedBatchSize(1000L);header.setSecurity(strUser + ":" + strPassword);return (new Holder<Header>(header));}
}
2、应用示例
从下面密密麻麻的import可以看出,大部分都是引用Stub代码的。
import org.springframework.stereotype.Component;
import org.tmforum.mtop.fmw.xsd.gen.v1.NameAndAnyValueType;
import org.tmforum.mtop.fmw.xsd.gen.v1.ObjectEnumType;
import org.tmforum.mtop.fmw.xsd.nam.v1.NamingAttributeType;
import org.tmforum.mtop.fmw.xsd.nam.v1.RelativeDistinguishNameType;
import org.tmforum.mtop.mri.wsdl.mer.v1_0.ManagedElementRetrieval_RPC;
import org.tmforum.mtop.mri.wsdl.tlr.v1_0.GetAllTopLevelTopologicalLinksException;
import org.tmforum.mtop.mri.wsdl.tlr.v1_0.TopologicalLinkRetrievalRPC;
import org.tmforum.mtop.mri.wsdl.tpr.v1_0.GetAllPhysicalTerminationPointsWithoutFtpsException;
import org.tmforum.mtop.mri.wsdl.tpr.v1_0.GetContainedPotentialConnectionTerminationPointsException;
import org.tmforum.mtop.mri.wsdl.tpr.v1_0.TerminationPointRetrievalRPC;
import org.tmforum.mtop.mri.wsdl.tvr.v1_0.GetAllTopoViewNodesInfoException;
import org.tmforum.mtop.mri.wsdl.tvr.v1_0.TopoViewRetrievalRPC;
import org.tmforum.mtop.mri.xsd.mer.v1.GetAllManagedElementsRequest;
import org.tmforum.mtop.mri.xsd.mer.v1.MultipleMeObjectsResponseType;
import org.tmforum.mtop.mri.xsd.tlr.v1.GetAllTopLevelTopologicalLinksRequest;
import org.tmforum.mtop.mri.xsd.tlr.v1.MultipleTlObjectsResponseType;
import org.tmforum.mtop.mri.xsd.tpr.v1.GetAllConnectionTerminationPointsType;
import org.tmforum.mtop.mri.xsd.tpr.v1.GetAllTerminationPointsType;
import org.tmforum.mtop.mri.xsd.tpr.v1.MultipleTerminationPointObjectsResponseType;
import org.tmforum.mtop.mri.xsd.tvr.v1.GetAllTopoViewNodesInfoRequest;
import org.tmforum.mtop.mri.xsd.tvr.v1.GetAllTopoViewNodesInfoResponse;
import org.tmforum.mtop.nra.xsd.alm.v1.AlarmListType;
import org.tmforum.mtop.nra.xsd.alm.v1.AlarmType;
import org.tmforum.mtop.nra.xsd.pm.v1.PerformanceMonitoringParameterNameListType;
import org.tmforum.mtop.nra.xsd.pmdata.v1.PerformanceMonitoringDataType;
import org.tmforum.mtop.nra.xsd.pmmsrt.v1.PerformanceMonitoringMeasurementType;
import org.tmforum.mtop.nra.xsd.pmtgt.v1.ObjectFactory;
import org.tmforum.mtop.nra.xsd.pmtgt.v1.PerformanceMonitoringObjectSelectListType;
import org.tmforum.mtop.nra.xsd.pmtgt.v1.PerformanceMonitoringObjectSelectType;
import org.tmforum.mtop.nrf.xsd.me.v1.ManagedElementType;
import org.tmforum.mtop.nrf.xsd.tl.v1.TopologicalLinkType;
import org.tmforum.mtop.nrf.xsd.topo.v1.NodeType;
import org.tmforum.mtop.nrf.xsd.tp.v1.TerminationPointType;
import org.tmforum.mtop.rpm.wsdl.pmr.v1_0.GetAllCurrentPerformanceMonitoringDataException;
import org.tmforum.mtop.rpm.wsdl.pmr.v1_0.PerformanceManagementRetrieval;
import org.tmforum.mtop.rpm.xsd.pmr.v1.GetAllCurrentPerformanceMonitoringDataRequest;
import org.tmforum.mtop.rpm.xsd.pmr.v1.MultiplePerformanceMonitoringDataObjectsResponseType;
import org.tmforum.mtop.rtm.wsdl.ar.v1_0.AlarmRetrieval;
import org.tmforum.mtop.rtm.wsdl.ar.v1_0.GetActiveAlarmsCountException;
import org.tmforum.mtop.rtm.wsdl.ar.v1_0.GetActiveAlarmsException;
import org.tmforum.mtop.rtm.xsd.ar.v1.GetActiveAlarmsCountRequest;
import org.tmforum.mtop.rtm.xsd.ar.v1.GetActiveAlarmsCountResponse;
import org.tmforum.mtop.rtm.xsd.ar.v1.GetActiveAlarmsRequest;
import org.w3c.dom.Element;import javax.xml.bind.JAXBElement;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;。。。/*** 故障告警信息数量*/public long getActiveAlarmsCount() {long count = 0L;try {AlarmRetrieval alarmRetrieval = WebServiceUtil.getWebService("AlarmRetrieval", AlarmRetrieval.class);GetActiveAlarmsCountRequest request = new GetActiveAlarmsCountRequest();GetActiveAlarmsCountResponse response = alarmRetrieval.getActiveAlarmsCount(WebServiceUtil.getHeader(), request);count = response.getActiveAlarmCount();} catch (GetActiveAlarmsCountException e) {e.printStackTrace();System.err.println("failed getActiveAlarmsCount");} catch (Exception ex) {System.err.println(String.valueOf(ex.getCause()));}return count;}
对应的NCE XML接口说明
三、总结
NCE的XML接口感觉就是异常繁琐,数据类型非常多,传参、返回值都非常复杂。如果是http接口的话,参数全部是json,结构简单明了。而且,利用XML传数据,少量数据还好,大批量数据就不行,XML相比json,实在笨重,传输量太大了。
华为这个nce软件,叫网管软件,它接管了整个局域网,然后在上面做各种逻辑划分和管理。不过,它加载需要一段时间。比如我们项目,设备通电以后,20分钟后网络才能访问。再上面做一些更改,比如用户解锁,要约2个小时才生效。之前遇到明明用户已经解锁了,还是不能登录,正疑惑的时候,忽然就可以了。这时已经过去了2个小时。
相关文章:
java访问华为网管软件iMaster NCE的北向接口
最近做的一个项目,需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE(以下简称NCE)用于管理项目的整个网络,尤其是光网络。业主要求我们访问该软件提供的对外接口,读取一些网络信息,比如…...
UV紫外相机
在产业设备领域,运用相机进行检测的需求很大,应用也很多样,对于图像传感器性能的期望逐年提升。在这样的背景下,可拍摄紫外线(UV:Ultra Violet)图像的相机拥有越来越广泛的应用场景。将UV照明和…...
第十八届联合国世界旅游组织/亚太旅游协会旅游趋势与展望大会在广西桂林开幕
10月19日,第十八届联合国世界旅游组织/亚太旅游协会旅游趋势与展望大会(以下简称“大会”)在广西桂林开幕,来自美国、英国、德国、俄罗斯、柬埔寨等25个国家约120名政府官员、专家学者和旅游业界精英齐聚一堂,围绕“亚洲及太平洋地区旅游业&a…...
Effective Java(第三版) _ 创建和销毁对象
一、前言 《Effective Java》 这本书,在刚从事 Java 开发的时候就被老师推荐阅读过,当时囫囵吞枣的看了一部分,不是特别的理解,也就搁置了,现在已经更新到第三版了,简单翻阅了一下,发现有些条例…...
你的EA无法运行的几种常见原因
大多数情况下,EA正常运行是指其能够自动开仓交易,毕竟EA的主要目的是根据某种策略自动进行交易。如果从网上下载或其他途径获得的EA在开始时能够正常交易,但在修改参数后却不再交易,可能的问题是什么呢?下面列举了一些…...
通过自定义指令实现图片懒加载
前提:使用到了VueUse插件。 先创建自定义插件文件夹 // 定义懒加载插件 import { useIntersectionObserver } from vueuse/core // 这个是VueUse里的一个方法export const lazyPlugin {install(app) {// 懒加载指令逻辑 定义全局指令app.directive(img-lazy, {mo…...
QT项目-仿QQ聊天(带宠物系统)
目录 一,项目介绍 二,开发环境 三,涉及技术 四,项目效果示例图 1,登录界面 2,主界面 3,聊天界面 4,功能界面 5,宠物界面 一,项目介绍 这是一个基于u…...
前端算法题:3216. 交换后字典序最小的字符串(力扣每日一题)
今日题目为:3216. 交换后字典序最小的字符串 题目详情: 给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的字典序最小的字符串。 如果两个数字都是奇数或都是偶数,则…...
29.1 时序监控和日志监控的对比,分析日志监控的核心诉求
本节重点介绍 : 监控系统分类时序监控和日志监控的对比轻量日志监控系统的诉求 监控系统分类 监控系统按照原理和作用大致可以分为三类 日志类(Log)调用链类(Tracing)度量类(Metrics) 日志类(…...
git仓库分支
操作 切换分支 git checkout 1.2.5 git checkout 1.3.0 使用命令切换分支之后,代码内容加载过后也是切换好的...
多模态机器学习在精准健康中的应用--九五小庞
这篇综述文章探讨了将多模态数据融合应用于医疗诊断和预后预测的最新研究进展。 本文作者们确定了三个主要的研究问题:多模态数据融合在健康领域的文献特征是什么?用于分析多模态健康数据的不同分析技术、方法和策略是什么?不同类型的异构数…...
提升网站速度与性能优化的有效策略与实践
内容概要 在数字化快速发展的今天,网站速度与性能优化显得尤为重要,它直接影响用户的浏览体验。用户在访问网站时,往往希望能够迅速获取信息,若加载时间过长,轻易可能导致他们转向其他更为流畅的网站。因此࿰…...
MySQL索引从基础到原理,看这一篇就够了
https://developer.aliyun.com/article/841106 https://zhuanlan.zhihu.com/p/29118331 索引创建使用总结 因为索引对于改善查询性能的作用是巨大的,所以我们的目标是尽量使用索引。 1. 索引的创建 • 1、在用于 where 判断 order 排序和 join 的(on)字段上创…...
普通高考预报名上传蓝底证件照手机自拍方法详解
普通高考预报名过程中,上传一张合规的蓝底证件照是必不可少的一步。本文将详细介绍如何使用手机自拍并使用工具来制作符合要求的蓝底证件照。注意,目前仅有广东等个别省份允许特定类型考生使用自拍照上传(例如普高预报名阶段、学考报名&#…...
Webserver(2.3)exec函数族
目录 exec函数族介绍execl函数execlp函数 exec函数族介绍 c语言中没有重载,因为不允许同名函数 一系列功能相似的函数称为函数族 exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容。 程序在运行的时候,fork一…...
LeetCode Hot100 - 子串篇
前言 挑战一个月刷完力扣的hot100,记录一下每题的思路~ 这次是子串相关的题目 (1)560. 和为 K 的子数组 ①暴力枚举,使用一个变量sum记录以l开头r结尾的情况 class Solution {public int subarraySum(int[] nums, int k) {int r…...
【Android】Convenient ADB Commands
Install adb install -r <path>Uninstall adb uninstall <pkg>Start adb shell am start -n <pkg>/.SplashActivityStop adb shell am force-stop <pkg>Reset adb shell pm clear <pkg>Reboot adb rebootShutdown adb reboot -p...
elementUI 时间控件控制时间选择
选择时间大于当前月或小于2024年一月禁止选择 <el-form-item label"成交月份:" label-width"105px" ><div class"block"><el-date-pickerv-model"formData.deal_month"type"month":picker-options"pick…...
什么是x86架构,什么是arm架构
什么是 x86 架构? x86 架构是一种经典的指令集架构(ISA),最早由英特尔在 1978 年推出,主要用于 PC、服务器等领域。 它是一种复杂指令集计算(CISC)架构,支持大量的复杂指令和操作&…...
c语言水仙花,超简单讲解
效果 3或者大于3位数 每一位的位数次方相加等于 自身 例如 153 13 53 33 结果为112527 153 1634: 计算过程: 14643444112968125616341^4 6^4 3^4 4^4 1 1296 81 256 16341464344411296812561634 过程 求得单独将所有位数的正数拎出来…...
Flutter 13 网络层框架架构设计,支持dio等框架。
在移动APP开发过程中,进行数据交互时,大多数情况下必须通过网络请求来实现。客户端与服务端常用的数据交互是通过HTTP请求完成。面对繁琐业务网络层,我们该如何通过网络层架构设计来有效解决这些问题,这便是网络层框架架构设计的初…...
Python小白学习教程从入门到入坑------第二十课 闭包修饰器(语法基础)
一、递归函数 1.1 基本信息 递归函数是指一个函数在其定义中直接或间接地调用了自身 递归在解决许多问题(如树的遍历、图的搜索、数学中的分治算法等)时非常有用 在Python中,递归函数可以通过简单的语法来实现 然而,使用递归…...
Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件
Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件 可视区域没超过当前屏幕高度时候只显示三个菜单效果 可视区域超过当前屏幕高度时,显示可回到顶部菜单的,当然这个菜单显示条件可以自定义,根据需求设置 然后将这个整体功能创建为一个全局组件 代…...
如何配置,npm install 是从本地安装依赖
在 Node.js 中,要使npm install从本地安装依赖,可以按照以下步骤进行配置: 一、准备本地依赖包 确保你有本地的依赖包。这个依赖包可以是一个包含package.json文件的文件夹,或者是一个已经打包好的.tgz文件。 二、使用相对路径…...
Python画图3个小案例之“一起看流星雨”、“爱心跳动”、“烟花绚丽”
源码如下: import turtle # 导入turtle库,用于图形绘制 import random # 导入random库,生成随机数 import math # 导入math库,进行数学计算turtle.setup(1.0, 1.0) # 设置窗口大小为屏幕大小 turtle.title("流星雨动画&…...
Knife4j配置 ▎使用 ▎教程 ▎实例
knife4j简介 支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。 提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试.参数和格式都…...
电子电气架构 --- 车载芯片现状
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧…...
Unity 二次元三渲二
三渲二 注意:Unity必须是2022.3LTS及以上和URP项目!!! 下载三渲二插件 【如何将原神的角色导入Unity】全网最细致教程,全程干货。不使用任何收费插件,使用Spring Bone对头发和衣服进行物理模拟。_原神 步…...
echart实现地图数据可视化
文章目录 [TOC](文章目录) 前言一、基本地图展示2.数据可视化 总结 前言 最近工作安排使用echarts来制作图形报表,记录一下我的步骤,需求呈现一个地图,地图显示标签,根据业务指标值给地图不同省市填充不同颜色,鼠标放…...
网关三问:为什么微服务需要网关?什么是微服务网关?网关怎么选型?
文章整体介绍 本文旨在解答关于微服务网关的三个核心问题: 1)为什么需要网关?也即在何种场景下应采用微服务网关以优化系统架构; 2)什么是微服务网关?主要讲构成微服务网关的关键能力,包括但…...
新疆公路建设局网站/正规专业短期培训学校
substr()substr() 函数用于从字符串中获取其中的一部分,返回一个字符串。语法:string substr ( string string, int start [, int length] )参数说明如下:例子:$str_bh123456789;$abcsubstr($str_bh,-4);echo $abc;输出࿱…...
群晖 6.1 wordpress/网站接广告
前面介绍了Maven的一些基本知识,这一篇讲一下在IntelliJ IDEA配置和使用Maven 一、配置Maven 在File->Settings->Build,Execution,Deployment->Build Tools->Maven下对Maven进行配置 我个人的配置是: 参数分析: user settings fi…...
论文网站建设格式/全网优化哪家好
https://www.cnblogs.com/WAMonster/p/10118934.html 转载于:https://www.cnblogs.com/Aiahtwo/p/11557884.html...
做暧暧暖网站日本/竞价推广怎么做
参考链接: Indexing 参考链接: Advanced indexing and index tricks 参考链接: numpy.newaxis 实验1: 单个元素索引 Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", &q…...
网站开发增值税税率6%/南京百度推广开户
1.水平居中1.1行内元素的水平居中 /*行内元素水平居中*/ #body-div{ text-align:center; } 1.2块级元素的水平居中 /*块级元素水平居中*/ #body-div{ margin:0 auto; } 1.3多个块级元素水平居中 /*多个块级元素水平居中*/ #body-div{ text-align:center; } ##body-div-containe…...
镇江哪里做网站/项目推广平台有哪些
题目意思:1-3999转罗马数字 思路:从大往小减 ps:这题有点蛋疼 1 class Solution {2 public:3 string intToRoman(int num) {4 string a[]{"I","IV","V","IX","X","XL","L…...