华为北向网管NCE开发教程(7)历史告警采集

news2025/4/17 19:26:01

1准备工作

准备一个FTP服务器和网管北向网络通,网管北向生成告警文件,会推送到准备的FTP服务器上。
linux,都是自带FTP的,如果是linux则无需自己搭建,如果是windows则需要自己搭建

2生成告警文件

2.1方法说明getAllHistoryAlarmsByFTP

该方法是接口EMSMgr_I中的方法

void getAllHistoryAlarmsByFTP(
java.lang.String destination, 
java.lang.String userName, 
java.lang.String password, 
mtnm.tmforum.org.globaldefs.NameAndStringValue_T[][] meNameList, 
java.lang.String[] typeList, 
java.lang.String[] excludeProbCauseList, mtnm.tmforum.org.notifications.PerceivedSeverity_T[] excludeSeverityList,
java.lang.String startTime, 
java.lang.String endTime
) throws mtnm.tmforum.org.globaldefs.ProcessingFailureException;

下面这个是华为的文档说明
在这里插入图片描述

2.2getAllHistoryAlarmsByFTP请求参数示例

Common_IHolder commonHolder = new Common_IHolder();
emsSession.getManager("EMS", commonHolder);
EMSMgr_I emsMgr = EMSMgr_IHelper.narrow(commonHolder.value);

//指定生成的网元
String managedElement = "3145734"

//FTP信息
//生成文件地址实际路径为192.168.1.11服务器的 /home/admin/alarms/,登录用户目录/destination中指定的目录
String destination = "192.168.1.11:alarms/"+managedElement+".txt";
String userName = "admin";
String password = "123456";

//构建网元查询条件
NameAndStringValue_T[][] meNameList = new NameAndStringValue_T[1][];//网元名称列表(与typeList 条件不能同时输入)。仅支持网元/光网元,不支持EMS/SNMS。
NameAndStringValue_T[] meName = new NameAndStringValue_T[2];
meName[0] = new NameAndStringValue_T("EMS", "Huawei/NCE");
meName[1] = new NameAndStringValue_T("ManagedElement", managedElement);
meNameList[0] = meName;

//网元类型和网元ID互斥,为空即可
String[] typeList = new String[0];//网元类型列表(与meNameList 条件不能同时输入)

//告警原因
String[] excludeProbCauseList = new String[0];//符合此类原因的告警不查询。列表为空标识不使用该过滤条件。

//告警级别
PerceivedSeverity_T[] excludeSeverityList = new PerceivedSeverity_T[0];//符合此类级别的告警不查询,列表为空标识不使用该过滤条件。

//时间范围
String startTime = "20150101000000.0";//起始时间(格式如:20130111000000.0 Z 本地时间及UTC时间均支持)针对告警的清除时间进行过滤,不包括起始时间点。
String endTime = "20240604000000.0";//终止时间(格式如:20130111000000.0 Z 本地时间及UTC时间均支持)针对告警的清除时间进行过滤,包括终止时间点。

//调用接口
emsMgr.getAllHistoryAlarmsByFTP(destination, userName, password, meNameList, typeList, excludeProbCauseList, excludeSeverityList, startTime, endTime);

接下来就是怎么采集了。下图所示,我先查询所有的网元,然后再根据网元的managedElement 逐个的生产历史告警。
在这里插入图片描述

2.3接收历史告警的文件传输通知

这里生成历史告警信息,不是实时的,调用方法以后,北向网管异步生成文件上传至FTP,至于最后是否成功或者失败?什么时候生成完毕?只能通过订阅通知获取。
具体的订阅通知代码,具体细节请看
华为北向网管NCE开发教程(6)消息订阅
下面是核心代码及日志记录
在这里插入图片描述

如下是记录的日志信息
在这里插入图片描述

2.4查看告警文件

登录FTP服务器(linux),在文件通知中,可以看到某个文件生成的地址信息。当然了,地址本来就是我们自己给定linux地址。下面是我们使用admin用户登录,则登录linux以后,默认路径就是在home/admin之下,然后生成的全路径也就是home/admin/alarms/xxxxx.txt

String destination = "192.168.1.11:alarms/"+managedElement+".txt";
String userName = "admin";
String password = "123456";

备注:此处建议FTP就直接用部署解析数据的程序linux服务器,这样北向网管上传的文件其实对于程序来说,就是在本地,对于你程序后续解析文件或者其他操作比较方便。不然还得单独写从FTP获取文件增加工作量。然后再很多公司的安全要求里面,FTP被当做不安全的文件传输协议,到时候开发起来,麻烦事比较多。
如果你以为万一这个服务器蹦了,考虑不考虑用集群或者负载均衡等方式,多用几台服务器来采集数据,那就别想了,这个问题无解,对接北向corba就只能单体部署。否则你就只能用rest或者kafka了。当然了用这两个,是要收钱的。

为了方便调试,我把生成在linux的文件,下载到我本地电脑上
在这里插入图片描述

3解析告警文件

其实这一块,可以不写的,毕竟解析和北向网管对接,其实没啥关系了,不过也说一下,毕竟这个确实不好弄

3.1查看文件结构

这是接口文档给的,每一列的含义,告你你用\来分割
在这里插入图片描述
这是我们打开告警文件看到的
在这里插入图片描述
将一整行拆开,可以看到,有些在标签中,有些不在标签中。
在这里插入图片描述

3.2解析思路一:XML报文

1按照行\n切割,得到一条告警信息
2按照每行的 \t分割,得到每个字段
3重新构建一个xml报文
3.1将带标签的转成标准的标签
3.2将没有标签的带上标签
4将xml报文转java对象

生成新的XML报文如下,此方法适用于,你要的数据基本都在标签中

3.2.1生成新的XLM报文

我们需要将原来的txt文件的内容变成如下这种形式

<allRoot>
  <root>
    <node>
      <name>EMS</name>
      <value>Huawei/NCE</value>
    </node>
    <node>
      <name>ManagedElement</name>
      <value>167772176</value>
    </node>
    <node>
      <name>PTP</name>
      <value>/rack=1/shelf=1/sub_shelf=0/slot=5/domain=eth/type=mac/port=1</value>
    </node>
    <ProposedRepairActionList_T/>
    <oneParam>
      <name>Location</name>
      <value>NA</value>
    </oneParam>
    <oneParam>
      <name>Direction</name>
      <value>NA</value>
    </oneParam>
    <oneParam>
      <name>MaintenanceStatus</name>
      <value>NotInMaintenance</value>
    </oneParam>
    <oneParam>
      <name>AlarmSerialNo</name>
      <value>6833516</value>
    </oneParam>
    <oneParam>
      <name>AlarmReason</name>
      <value>缃戝彛杩炴帴涓㈠け</value>
    </oneParam>
    <oneParam>
      <name>ProductName</name>
      <value>OptiX OSN 1800 V</value>
    </oneParam>
    <oneParam>
      <name>EquipmentName</name>
      <value>B2EFS8</value>
    </oneParam>
    <oneParam>
      <name>AffirmState</name>
      <value>TRUE</value>
    </oneParam>
    <oneParam>
      <name>DetailInfo</name>
      <value/>
    </oneParam>
    <oneParam>
      <name>SlaveShelf</name>
      <value>涓诲瓙鏋?</value>
    </oneParam>
    <oneParam>
      <name>HandlingSuggestion</name>
      <value>(1)端口已使能但端口的网线或光纤没有连接好;(2)网线或光纤故障;(3)对端发送部分故障;(4)本端接收部分故障。(5)灰光光模块与彩光光模块对接,端口可能上ETH_LOS。(6)彩光光模块对接,配置不同波长。(7)对接端口的传输模式不一致或者FEC模式不一致。</value>
    </oneParam>
    <oneParam>
      <name>LocationInfo</name>
      <value>0-涓诲瓙鏋?-5-B2EFS8-1(鑷冲竷鏃ラ兘鍐呰挋璋冨害鏁版嵁缃?34M)-MAC:1</value>
    </oneParam>
    <oneParam>
      <name>DeviceIP</name>
      <value/>
    </oneParam>
    <oneParam>
      <name>ROUTE_CAUSE</name>
      <value>0</value>
    </oneParam>
    <oneParam>
      <name>lResSubType</name>
      <value>124321792</value>
    </oneParam>
    <alarmAffect>SA_SERVICE_AFFECTING</alarmAffect>
    <alarmNeTime>1712600372000</alarmNeTime>
  </root>
  <root>
    <node>
      <name>EMS</name>
      <value>Huawei/NCE</value>
    </node>
    <node>
      <name>ManagedElement</name>
      <value>167772176</value>
    </node>
    <node>
      <name>EquipmentHolder</name>
      <value>/rack=1/shelf=1/sub_shelf=0/slot=18</value>
    </node>
    <node>
      <name>Equipment</name>
      <value>1</value>
    </node>
    <ProposedRepairActionList_T/>
    <oneParam>
      <name>Location</name>
      <value>NA</value>
    </oneParam>
    <oneParam>
      <name>Direction</name>
      <value>NA</value>
    </oneParam>
    <oneParam>
      <name>MaintenanceStatus</name>
      <value>NotInMaintenance</value>
    </oneParam>
    <oneParam>
      <name>AlarmSerialNo</name>
      <value>6835838</value>
    </oneParam>
    <oneParam>
      <name>AlarmReason</name>
      <value>鐢垫簮鏁呴殰</value>
    </oneParam>
    <oneParam>
      <name>ProductName</name>
      <value>OptiX OSN 1800 V</value>
    </oneParam>
    <oneParam>
      <name>EquipmentName</name>
      <value>F5PIU</value>
    </oneParam>
    <oneParam>
      <name>AffirmState</name>
      <value>TRUE</value>
    </oneParam>
    <oneParam>
      <name>DetailInfo</name>
      <value>48V涓荤數婧愭瑺鍘?鍛婅?﹀弬鏁癐I(16杩涘埗) 0x50</value>
    </oneParam>
    <oneParam>
      <name>SlaveShelf</name>
      <value>涓诲瓙鏋?</value>
    </oneParam>
    <oneParam>
      <name>HandlingSuggestion</name>
      <value>(1)备份电源板开关未打开;(2)电源板失效;(3)单板电源老化。</value>
    </oneParam>
    <oneParam>
      <name>LocationInfo</name>
      <value>0-涓诲瓙鏋?-18-F5PIU-OTHER</value>
    </oneParam>
    <oneParam>
      <name>DeviceIP</name>
      <value/>
    </oneParam>
    <oneParam>
      <name>ROUTE_CAUSE</name>
      <value>0</value>
    </oneParam>
    <oneParam>
      <name>lResSubType</name>
      <value>124321792</value>
    </oneParam>
    <alarmAffect>SA_SERVICE_AFFECTING</alarmAffect>
    <alarmNeTime>1712616472000</alarmNeTime>
  </root>
  <root>
    <node>
      <name>EMS</name>
      <value>Huawei/NCE</value>
    </node>
    <node>
      <name>ManagedElement</name>
      <value>167772176</value>
    </node>
    <node>
      <name>PTP</name>
      <value>/rack=1/shelf=1/sub_shelf=0/slot=5/domain=eth/type=mac/port=1</value>
    </node>
    <ProposedRepairActionList_T/>
    <oneParam>
      <name>Location</name>
      <value>NA</value>
    </oneParam>
    <oneParam>
      <name>Direction</name>
      <value>NA</value>
    </oneParam>
    <oneParam>
      <name>MaintenanceStatus</name>
      <value>NotInMaintenance</value>
    </oneParam>
    <oneParam>
      <name>AlarmSerialNo</name>
      <value>6845135</value>
    </oneParam>
    <oneParam>
      <name>AlarmReason</name>
      <value>缃戝彛杩炴帴涓㈠け</value>
    </oneParam>
    <oneParam>
      <name>ProductName</name>
      <value>OptiX OSN 1800 V</value>
    </oneParam>
    <oneParam>
      <name>EquipmentName</name>
      <value>B2EFS8</value>
    </oneParam>
    <oneParam>
      <name>AffirmState</name>
      <value>TRUE</value>
    </oneParam>
    <oneParam>
      <name>DetailInfo</name>
      <value/>
    </oneParam>
    <oneParam>
      <name>SlaveShelf</name>
      <value>涓诲瓙鏋?</value>
    </oneParam>
    <oneParam>
      <name>HandlingSuggestion</name>
      <value>(1)端口已使能但端口的网线或光纤没有连接好;(2)网线或光纤故障;(3)对端发送部分故障;(4)本端接收部分故障。(5)灰光光模块与彩光光模块对接,端口可能上ETH_LOS。(6)彩光光模块对接,配置不同波长。(7)对接端口的传输模式不一致或者FEC模式不一致。</value>
    </oneParam>
    <oneParam>
      <name>LocationInfo</name>
      <value>0-涓诲瓙鏋?-5-B2EFS8-1(鑷冲竷鏃ラ兘鍐呰挋璋冨害鏁版嵁缃?34M)-MAC:1</value>
    </oneParam>
    <oneParam>
      <name>DeviceIP</name>
      <value/>
    </oneParam>
    <oneParam>
      <name>ROUTE_CAUSE</name>
      <value>0</value>
    </oneParam>
    <oneParam>
      <name>lResSubType</name>
      <value>124321792</value>
    </oneParam>
    <alarmAffect>SA_SERVICE_AFFECTING</alarmAffect>
    <alarmNeTime>1712681968000</alarmNeTime>
  </root>
</allRoot>

3.2.2定义新XML报文实体类

定义一个java实体类来接收上面的XML报文

@XmlRootElement(name = "allRoot")
@ToString
public class AllRoot {

	private List<Root> roots;

	@XmlElement(name = "root")
	public List<Root> getRoots() {
		return roots;
	}

	public void setRoots(List<Root> roots) {
		this.roots = roots;
	}
}

@XmlRootElement(name = "root")
@ToString
public class Root {
	
    private List<Node> nodes;
    
    private List<OneParam> oneParams;
    
    private String alarmAffect;
    
    private Long alarmNeTime;
    
    public Root() {
    }

    @XmlElement(name = "node")
    public List<Node> getNodes() {
        return nodes;
    }

    public void setNodes(List<Node> nodes) {
        this.nodes = nodes;
    }
    
    @XmlElement(name = "oneParam")
	public List<OneParam> getOneParams() {
		return oneParams;
	}

	public void setOneParams(List<OneParam> oneParams) {
		this.oneParams = oneParams;
	}

	@XmlElement(name = "alarmAffect")
	public String getAlarmAffect() {
		return alarmAffect;
	}

	public void setAlarmAffect(String alarmAffect) {
		this.alarmAffect = alarmAffect;
	}

	@XmlElement(name = "alarmNeTime")
	public Long getAlarmNeTime() {
		return alarmNeTime;
	}

	public void setAlarmNeTime(Long alarmNeTime) {
		this.alarmNeTime = alarmNeTime;
	}

}

@XmlRootElement(name = "node")
@ToString
public class Node {
    private String name;
    private String value;
    
	@XmlElement(name = "name")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@XmlElement(name = "value")
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
}

@XmlRootElement(name = "oneParam")
@ToString
public class OneParam {
    private String name;
    private String value;
    
	@XmlElement(name = "name")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@XmlElement(name = "value")
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
}

3.2.3代码实现


	private static final Set<String> ALARM_AFFECT = new HashSet<>(Arrays.asList("SA_UNKNOWN", "SA_SERVICE_AFFECTING", "SA_NON_SERVICE_AFFECTING"));

	public AllRoot getAlarmDataByPath(String path) throws JAXBException {
  		String alarmStr = JsonUtils.readStringFromSystemPath(path);
  		String[] rows = alarmStr.split("\n");
  		StringBuilder rootStr = new StringBuilder();
  		rootStr.append("<allRoot>");
  		for (int i = 1; i < rows.length; i++) {
  			String alarmAffect = "";
  			Long alarmNeTime = null;
  			rootStr.append("<root>");
  			String[] columns = rows[i].split("\t");
  			for (int j = 1; j < columns.length; j++) {
  				//提取标准标签内容
  				if(columns[j].contains("<") && columns[j].contains(">")) {
  					rootStr.append(columns[j]);
  				//提取标签外的内容时间和ALARM_AFFECT,这里是需要特殊处理的,根据你要的业务来特殊处理,我所需要的两个字段刚好都可以满足我的需求进行特殊处理
  				}else {
  					if(ALARM_AFFECT.contains(columns[j])) {
  						alarmAffect = columns[j];
  					}else if(columns[j].contains(".0Z")){
  						//大时间是emsTime,小时间是neTime
  						Long date = DateUtils.StrToLongTime(columns[j], FORMAT);
  						if(alarmNeTime == null) {
  							alarmNeTime = date;
  						}else {
  							alarmNeTime = Math.min(alarmNeTime, date);
  						}
  					}
  				}
  			}
  			//追加标签外的alarmAffect和alarmNeTime到新报文中
  			rootStr.append("<alarmAffect>");
  			rootStr.append(alarmAffect);
  			rootStr.append("</alarmAffect>");
  			
  			rootStr.append("<alarmNeTime>");
  			rootStr.append(alarmNeTime.toString());
  			rootStr.append("</alarmNeTime>");
  			
  			rootStr.append("</root>");
  		}
  		rootStr.append("</allRoot>");

		//新XML报文转Java对象
  		JAXBContext jaxbContext = JAXBContext.newInstance(AllRoot.class);
  		Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  		StringReader reader = new StringReader(rootStr.toString());
  		return (AllRoot) unmarshaller.unmarshal(reader);
  	}

3.3解析思路二:按照顺序列赋值

1按照行\n切割,得到一条告警信息
2按照每行的 \t分割,得到每个字段
3假定每行切割的第一个字段是aa属性,第二个字段是bb属性,第三个字段是cc属性

核心代码

String alarmStr = JsonUtils.readStringFromSystemPath(path);
String[] rows = alarmStr.split("\n");
String[] title = rows[0].split("\t");
StringBuilder rootStr = new StringBuilder();
for (int i = 1; i < rows.length; i++) {
	String[] columns = rows[i].split("\t");
  	for (int j = 1; j < columns.length; j++) {
  	    System.out.println("第:" + j +"列");
  		System.out.println("标题:"+title[j]);
  		System.out.println("对应值:"+columns[j]);
  		System.out.println("------------------");
  	}
}

在这里插入图片描述
完毕。

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

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

相关文章

使用libcurl实现简单的HTTP访问

代码; #include <stdio.h> #include <stdlib.h> #include <curl/curl.h> // 包含libcurl库 FILE *fp; // 定义一个文件标识符 size_t write_data(void *ptr,size_t size,size_t nmemb,void *stream) { // 定义回调函数&#xff0c;用于将…

LeetCode-2779. 数组的最大美丽值【数组 二分查找 排序 滑动窗口】

LeetCode-2779. 数组的最大美丽值【数组 二分查找 排序 滑动窗口】 题目描述&#xff1a;解题思路一&#xff1a;滑动窗口与排序解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums 和一个 非负 整数 k 。 在一步操…

《华为项目管理之道》第1章笔记

《华为项目管理之道》&#xff0c;是新出的华为官方的项目管理书&#xff0c;整个书不错。第1章的精华&#xff1a; 1.2.2 以项目为中心的机制 伴随着项目型组织的建立&#xff0c;华为逐步形成了完备的项目管理流程和制度&#xff0c;从而将业务运 作构建在项目经营管理之…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 启动多任务排序(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 启动多任务排序(200分) 🌍 评测功能需要订阅专栏后私信联系…

STM32HAL-最简单的时间片论法

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 本文章使用最简单的写法时间片论法框架,非常适合移植各类型单片机,特别是资源少的芯片上。接下来将在stm32单片机上实现,只需占用1个定时器作为tick即可。(按键框架+时间片论法)…

cs61C | lecture4

cs61C | lecture4 C 语言内存布局 ### Stack 在最顶部&#xff0c;向下增长。包含局部变量和 function frame information。 > Each stack frame is a contiguous block of memory holding the local variables of a single procedure. > A stack frame includes: > …

Leaflet集成wheelnav在WebGIS中的应用

目录 前言 一、两种错误的实现方式 1、组件不展示 2、意外中的空白 二、不同样式的集成 1、在leaflet中集成wheelnav 2、给marker绑定默认组件 2、面对象绑定组件 3、如何自定义样式 三、总结 前言 在之前的博客中&#xff0c;我们曾经介绍了使用wheelnav.js构建酷炫…

简易开发一个app

即时设计网站 即时设计 - 可实时协作的专业 UI 设计工具 需要先设计好UI界面 上传到codefun 首次需要安装 自动生成代码 打开hb软件 新建项目 打开创建的项目 删除代码 复制代码过去 下载图片 将图片放到文件夹里 改为这种格式 index.vue 如果不需要uni-app导航栏可以修改 …

Vue43-单文件组件

一、脚手架的作用 单文件组件&#xff1a;xxx.vue&#xff0c;浏览器不能直接运行&#xff01;&#xff01;&#xff01; 脚手架去调用webpack等第三方工具。 二、vue文件的命名规则 建议用下面的两种方式。&#xff08;首字母大写&#xff01;&#xff01;&#xff01;&#x…

云原生系列之Docker常用命令

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 云原生之…

大模型算法备案全网最详细说明(附附件)

本文要点&#xff1a;大模型备案最详细说明&#xff0c;大模型备案条件有哪些&#xff0c;《算法安全自评估报告》模板&#xff0c;大模型算法备案&#xff0c;大模型上线备案&#xff0c;生成式人工智能(大语言模型)安全评估要点&#xff0c;网信办大模型备案。 共分为以下几…

逻辑这回事(五)---- 资源优化

基础篇 Memory 避免细碎的RAM。将大的RAM拆分成多个小RAM&#xff0c;并根据地址关断可以优化功耗&#xff0c;但把多个小RAM合成大RAM可以优化面积。Block RAM和分布式RAM合理选择。根据存储容量&#xff0c;对Block RAM和分布式RAM的实现面积和功耗进行评估&#xff0c;选择…

「网络原理」IP 协议

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; IP 协议 &#x1f349;报头结构&#x1f349;地址管理&#x1f34c;动态分配 IP 地址&#x1f34c;NAT 机制&#xff08;网络地址映射&am…

【计算机毕业设计】242基于微信小程序的外卖点餐系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

SX2106B 2A同步降压型DC/DC转换器芯片IC

一般描述 SX2106B是一款同步降压DC/DC转换器&#xff0c;提供宽广的4.5V至24V输入电压范围和2A连续负载电流能力。 SX2106B故障保护包括逐周期电流限制、UVLO、输出过电压保护和热关机。可调软启动功能&#xff0c;防止启动时的浪涌电流。该器件采用电流模式控…

四轴飞行器、无人机(STM32、NRF24L01)

一、简介 此电路由STM32为主控芯片&#xff0c;NRF24L01、MPU6050为辅,当接受到信号时&#xff0c;处理对应的指令。 二、实物图 三、部分代码 void FlightPidControl(float dt) { volatile static uint8_t statusWAITING_1; switch(status) { case WAITING_1: //等待解锁 if…

Syncovery:跨平台高效文件备份与同步的得力助手

在数字化时代&#xff0c;数据安全与文件同步已成为个人及企业不可或缺的需求。Syncovery作为一款专为Mac和Windows用户设计的文件备份和同步工具&#xff0c;凭借其高效、安全和易用的特点&#xff0c;赢得了广泛赞誉。 一、强大备份功能 Syncovery支持多种备份方案和数据格…

基于BERT微调+模板填充快速实现文本转DSL查询语句

前言 Text2SQL是指将自然语言转化为类SQL查询语句&#xff0c;使得用户的查询文本可以直接实现和数据库交互&#xff0c;本文介绍一种以BERT为基础模型&#xff0c;通过模板填充来实现的Text2SQL算法和产品化。 内容摘要 Text2SQL任务说明模板填充的思路条件列选择子模型搭建…

SOFTS: 时间序列预测的最新模型以及Python使用示例

近年来&#xff0c;深度学习一直在时间序列预测中追赶着提升树模型&#xff0c;其中新的架构已经逐渐为最先进的性能设定了新的标准。 这一切都始于2020年的N-BEATS&#xff0c;然后是2022年的NHITS。2023年&#xff0c;PatchTST和TSMixer被提出&#xff0c;最近的iTransforme…

【编程技巧】降低程序复杂度:控制逻辑与业务逻辑分离

为什么要降低代码复杂度 好的项目都是迭代出来的&#xff0c;所以代码肯定是会被人维护的 降低代码复杂度就是为了降低下一个维护人的维护成本&#xff0c;更简单地理解跟修改代码 代码组成 代码逻辑 控制逻辑 业务逻辑 控制逻辑 控制业务逻辑的代码 例如&#xff1a;加缓存…