JAVA实现GB/T 32960.3—2016电动汽车远程服务与管理系统技术规范 第3部分:通信协议及数据格式


完整的TCP服务端解析代码

1.maven依赖  不要的依赖自行删除,懒的删了 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.13.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.site</groupId><artifactId>TcpServer</artifactId><version>2.0</version><name>TcpServer</name><description>Tcp系统服务端</description><properties><java.version>1.8</java.version><protobuf.version>3.3.0</protobuf.version><hutool.version>5.7.16</hutool.version><fastjson.version>1.2.78</fastjson.version><plumelog.version>3.3</plumelog.version><druid.version>1.2.8</druid.version><redisson.version>3.7.3</redisson.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><!-- 阿里JSON解析器 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- redis 缓存操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- pool 对象池 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- rabbitmq --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>com.plumelog</groupId><artifactId>plumelog-logback</artifactId><version>${plumelog.version}</version></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>${protobuf.version}</version></dependency><!-- 阿里数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><!-- Mysql驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency><!-- 引入 websocket 依赖类 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId></dependency><!--常用工具类 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!-- SpringBoot 拦截器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>${redisson.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>javax.activation</groupId><artifactId>javax.activation-api</artifactId><version>1.2.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><!--			<version>2.12.6</version>--></dependency><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.9.3</version></dependency><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-processor</artifactId><version>1.9.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork> <!-- 如果没有该配置,devtools不会生效 --></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><executions><execution><id>default-resources</id><phase>validate</phase><goals><goal>copy-resources</goal></goals><configuration><outputDirectory>target/classes</outputDirectory><useDefaultDelimiters>false</useDefaultDelimiters><delimiters><delimiter>${*}</delimiter></delimiters><resources><resource><directory>src/main/resources/</directory><filtering>true</filtering></resource></resources></configuration></execution></executions></plugin></plugins><finalName>${project.artifactId}</finalName></build><profiles><profile><id>dev</id><properties><profileActive>dev</profileActive></properties><activation><activeByDefault>true</activeByDefault></activation></profile><profile><id>pro</id><properties><profileActive>pro</profileActive></properties></profile></profiles>
</project>

2.cmd2实时数据接受

package com.site.tcp.command;import com.site.tcp.server.TcpReceiveStructure;
import com.site.tcp.utils.*;
import lombok.extern.slf4j.Slf4j;/*** @author 程涛* @Title: CMD2* @Description: 实时信息上报* @date 2021年2月23日*/
@Slf4j
public class CMD2 {public static void cmd2(TcpReceiveStructure cmdReceiveStructure) {
//		车辆VIN(车架号)String VIN = cmdReceiveStructure.VIN;byte[] date = cmdReceiveStructure.date;byte[] timeByte = new byte[6];System.arraycopy(date, 0, timeByte, 0, 6);
//		数据采集时间String time = JacTools.hexToTime(timeByte);int index = 6;while (index < date.length) {int type = JacTools.subBytesToInt(date, index, 1);
//			0x01	整车数据	详见7.2.3.1
//			0x02	驱动电机数据	详见7.2.3.2,且停车充电过程无需传输该数据
//			0x03	燃料电池数据	详见7.2.3.3
//			0x04	发动机数据	详见7.2.3.4,停车充电过程无需传输该数据
//			0x05	车辆位置数据	详见7.2.3.5
//			0x06	极值数据	详见7.2.3.6
//			0x07	报警数据	详见7.2.3.7
//			0x08~0x09	终端数据预留
//			0x0A~0x2F	平台交换协议自定义数据switch (type) {case 1:byte[] carinfoByte = new byte[20];System.arraycopy(date, index + 1, carinfoByte, 0, 20);
//				解析整车数据AnalyzeVehicleData.getCarInfo(carinfoByte, VIN, time, 2);index = index + 21;break;case 2:
//                  驱动电机个数index = DriveMotorUtils.getDriveMotor(date, VIN, time, index);break;case 3:
//                  燃料电池数据index = FuelCellUtils.getFuelCell(date, VIN, time, index);break;case 4:
//                  发动机数据index = EngineDataUtils.getEngineData(date, VIN, time, index);break;case 5:byte[] positioningInfoByte = new byte[9];System.arraycopy(date, index + 1, positioningInfoByte, 0, 9);
//				    解析定位数据AnalyzePositioningInfo.getPositioningInfo(positioningInfoByte, VIN, time);index = index + 10;break;case 6:
//                  极值数据byte[] ExtremeInfoByte = new byte[14];System.arraycopy(date, index + 1, ExtremeInfoByte, 0, 14);ExtremeInfoUtils.getExtremeInfo(ExtremeInfoByte, VIN, time);index = index + 15;break;case 7:index = AlarmInfoUtils.getAlarmInfo(date, VIN, time, index, 2);default:index = date.length;break;}}}
}

3.CMD3延迟数据补发

package com.site.tcp.command;import com.site.tcp.server.TcpReceiveStructure;
import com.site.tcp.utils.*;
import lombok.extern.slf4j.Slf4j;/*** @author 程涛* @Title: CMD2* @Description: 实时信息上报* @date 2021年2月23日*/
@Slf4j
public class CMD3 {public static void cmd3(TcpReceiveStructure cmdReceiveStructure) {
//		车辆VIN(车架号)String VIN = cmdReceiveStructure.VIN;byte[] date = cmdReceiveStructure.date;byte[] timeByte = new byte[6];System.arraycopy(date, 0, timeByte, 0, 6);
//		数据采集时间String time = JacTools.hexToTime(timeByte);int index = 6;while (index < date.length) {int type = JacTools.subBytesToInt(date, index, 1);
//			0x01	整车数据	详见7.2.3.1
//			0x02	驱动电机数据	详见7.2.3.2,且停车充电过程无需传输该数据
//			0x03	燃料电池数据	详见7.2.3.3
//			0x04	发动机数据	详见7.2.3.4,停车充电过程无需传输该数据
//			0x05	车辆位置数据	详见7.2.3.5
//			0x06	极值数据	详见7.2.3.6
//			0x07	报警数据	详见7.2.3.7
//			0x08~0x09	终端数据预留	
//			0x0A~0x2F	平台交换协议自定义数据	switch (type) {case 1:byte[] carinfoByte = new byte[20];System.arraycopy(date, index + 1, carinfoByte, 0, 20);
//				解析整车数据AnalyzeVehicleData.getCarInfo(carinfoByte, VIN, time, 3);index = index + 21;break;case 2:
//                  驱动电机数据index = DriveMotorUtils.getDriveMotor(date, VIN, time, index);break;case 3:
//                  燃料电池数据index = FuelCellUtils.getFuelCell(date, VIN, time, index);break;case 4:
//                  发动机数据index = EngineDataUtils.getEngineData(date, VIN, time, index);break;case 5:byte[] positioningInfoByte = new byte[9];System.arraycopy(date, index + 1, positioningInfoByte, 0, 9);
//				    解析定位数据AnalyzePositioningInfo.getPositioningInfo(positioningInfoByte, VIN, time);index = index + 10;break;case 6:
//                  极值数据byte[] ExtremeInfoByte = new byte[14];System.arraycopy(date, index + 1, ExtremeInfoByte, 0, 14);ExtremeInfoUtils.getExtremeInfo(ExtremeInfoByte, VIN, time);index = index + 15;break;case 7:index = AlarmInfoUtils.getAlarmInfo(date, VIN, time, index, 3);default:index = date.length;break;}}}}

4 handler模块

package com.site.tcp.handler;import com.site.tcp.server.TcpReceiveStructure;
import com.site.tcp.utils.JacTools;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;import java.util.List;@Slf4j
public class RequestDecoder extends ByteToMessageDecoder {// 记录上次未读完的字节private ByteBuf tempMessage = Unpooled.buffer();// 申请一块内存保存分包数据,根据最后一次0d出现的位置选择保留哪部分数据private int CurrentSize = 0; // 本次新传输的字节数private int TempMessageSize = 0; // 上次剩余的字节数private ByteBuf WorkByteBuf = Unpooled.buffer();// 最终操作的ByteBufprivate byte[] WorkPackBuf = null;// 最终操作的字节数组/*** 用来进行解包操作,得到完整的合法数据包** @param channelHandlerContext* @param byteBuf* @param list* @throws Exception*/@Overrideprotected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list)throws Exception {// log.info("=========开始分析数据========");WorkByteBuf.clear();CurrentSize = byteBuf.readableBytes();// 当前流可读取字节数TempMessageSize = tempMessage.readableBytes();// 上次保存的可读字节数// 进行合包操作if (TempMessageSize == 0) {WorkPackBuf = new byte[CurrentSize];// ByteBuf的转换的字节数组WorkByteBuf.writeBytes(byteBuf);WorkByteBuf.readBytes(WorkPackBuf);} else if (TempMessageSize > 0) {WorkByteBuf.writeBytes(tempMessage);WorkByteBuf.writeBytes(byteBuf);WorkPackBuf = new byte[CurrentSize + TempMessageSize];WorkByteBuf.readBytes(WorkPackBuf);} else {tempMessage.clear();}if (WorkPackBuf != null) {if (JacTools.subBytesToInt(WorkPackBuf, 0, 1) == 0x23 & JacTools.subBytesToInt(WorkPackBuf, 1, 1) == 0x23) {
//					车辆VIN码String VIN = JacTools.subBytesToString(WorkPackBuf, 4, 17);
//				命令标识int cmd = JacTools.subBytesToInt(WorkPackBuf, 2, 1);
//					消息长度int length = JacTools.subBytesToInt(WorkPackBuf, 22, 2);
//					数据域byte[] data = new byte[length];System.arraycopy(WorkPackBuf, 24, data, 0, length);
//					数据校验if (checksum(WorkPackBuf, length)) {TcpReceiveStructure cmdReceiveStructure = new TcpReceiveStructure(VIN, cmd, data);list.add(cmdReceiveStructure);log.info("车辆数据上行》" + JacTools.bytesToHexString(WorkPackBuf));}}}}/*** 安全校验** @param WorkPackBuf* @param length* @return*/private static Boolean checksum(byte[] WorkPackBuf, int length) {
//		数据和域字节数组byte[] checksumByte = new byte[1];System.arraycopy(WorkPackBuf, length + 24, checksumByte, 0, 1);
//		数据和域字符String checksumStr = JacTools.bytesToHexString(checksumByte);//		数据域byte[] data = new byte[length + 22];System.arraycopy(WorkPackBuf, 2, data, 0, length + 22);String bcc = JacTools.getBCC(data);return checksumStr.toUpperCase().equals(bcc);}}
package com.site.tcp.handler;import com.site.tcp.utils.JacTools;import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import lombok.extern.slf4j.Slf4j;/*** @program: ResponseEncoder* @description: 发送数据* @author: 程涛* @create: 2020-12-10**/@Slf4j
public class ResponseEncoder extends ChannelOutboundHandlerAdapter {@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {String str = ((String) msg).toUpperCase();byte[] mess = JacTools.hexStringToByte(str);ByteBuf encoded = ctx.alloc().buffer(mess.length);encoded.writeBytes(mess);ctx.write(encoded);ctx.flush();log.info("车辆数据下行》 " + str);}
}
package com.site.tcp.handler;import java.util.concurrent.TimeUnit;import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;
import lombok.extern.slf4j.Slf4j;/*** 空闲检测** @author pjmike* @create 2018-10-25 16:21*/
@Slf4j
public class ServerIdleStateHandler extends IdleStateHandler {/*** 设置空闲检测时间为 60s*/private static final int READER_IDLE_TIME = 60;public ServerIdleStateHandler() {super(READER_IDLE_TIME, 0, 0, TimeUnit.SECONDS);}@Overrideprotected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {ctx.close();log.error("车辆数据服务空闲检测超时断开连接");}
}
package com.site.tcp.handler;import com.site.tcp.command.CMD2;
import com.site.tcp.command.CMD3;
import com.site.tcp.server.TcpReceiveStructure;
import com.site.tcp.utils.JacTools;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;@Component
@ChannelHandler.Sharable
@Slf4j
public class TcpHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {TcpReceiveStructure cmdReceiveStructure = (TcpReceiveStructure) msg;switch (cmdReceiveStructure.cmd) {
//		实时信息上报case 2:CMD2.cmd2(cmdReceiveStructure);break;
//		信息补发case 3:CMD3.cmd3(cmdReceiveStructure);break;default:break;}String start = "2323";String back = JacTools.intToHex(cmdReceiveStructure.cmd, 1) + "01"+ JacTools.strToHex(cmdReceiveStructure.VIN, 17) + "010006" + JacTools.getHexTime();String bcc = JacTools.getBCC(JacTools.hexToByteArr(back));ctx.writeAndFlush(start + back + bcc);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
//		cause.printStackTrace();log.error("-----客户端关闭:" + ctx.channel().remoteAddress(), cause);
//		Channel channel = ctx.channel();
//		if (!channel.isActive()) {
//			ctx.close();
//		}}@Overridepublic void channelInactive(ChannelHandlerContext ctx) {log.info("-----客户端断开" + ctx.channel().remoteAddress());ctx.close();}@Overridepublic void channelRegistered(ChannelHandlerContext ctx) {log.info("-----客户端注册" + ctx.channel().remoteAddress());}}

5.server模块

package com.site.tcp.server;import java.nio.ByteOrder;import com.site.tcp.handler.RequestDecoder;
import com.site.tcp.handler.ResponseEncoder;import com.site.tcp.handler.TcpHandler;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;public class NettyServerHandlerInitializer extends ChannelInitializer<Channel> {@Overrideprotected void initChannel(Channel ch) throws Exception {ch.pipeline()
//		空闲检测
//				.addLast(new ServerIdleStateHandler())
//		分包,大端.addFirst("decoder",new LengthFieldBasedFrameDecoder(ByteOrder.BIG_ENDIAN, Integer.MAX_VALUE, 22, 2, 1, 0, false)).addLast(new RequestDecoder()).addLast(new ResponseEncoder()).addLast(new TcpHandler());}
}
package com.site.tcp.server;import java.net.InetSocketAddress;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;/*** @author pjmike* @create 2018-10-24 15:13*/
@Component
public class TcpNettyServer {protected final Logger logger = LoggerFactory.getLogger(TcpNettyServer.class);/*** boss 线程组用于处理连接工作*/private EventLoopGroup boss = new NioEventLoopGroup();/*** work 线程组用于数据处理*/private EventLoopGroup work = new NioEventLoopGroup();@Value("${netty.tcpPort}")private Integer port;/*** 启动Netty Server** @throws InterruptedException*/@PostConstructpublic void start() throws InterruptedException {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(boss, work)// 指定Channel.channel(NioServerSocketChannel.class)// 使用指定的端口设置套接字地址.localAddress(new InetSocketAddress(port))// 服务端可连接队列数,对应TCP/IP协议listen函数中backlog参数.option(ChannelOption.SO_BACKLOG, 1024)// 设置TCP长连接,一般如果两个小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文.childOption(ChannelOption.SO_KEEPALIVE, true)// 将小的数据包包装成更大的帧进行传送,提高网络的负载.childOption(ChannelOption.TCP_NODELAY, true).childHandler(new NettyServerHandlerInitializer());ChannelFuture future = bootstrap.bind().sync();if (future.isSuccess()) {logger.info("启动车俩数据服务端");}}@PreDestroypublic void destory() throws InterruptedException {boss.shutdownGracefully().sync();work.shutdownGracefully().sync();logger.info("关闭Netty");}
}

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

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

相关文章

Jenkins持续集成工具学习

一、从装修厨房看项目开发效率优化 二、持续集成工具 三、JavaEE项目部署方式对比 四、JenkinsSVN持续集成环境搭建 五、JenkinsGitHub持续集成环境搭建

8 个最佳 Java IDE 和文本编辑器

从 2024 年使用的最佳 Java IDE 和代码编辑器中进行选择&#xff0c;并提高您的 Java 生产力。 Java 是世界上最流行的编程语言之一&#xff0c;于 1995 年首次推出&#xff0c;它确实践行了“编写一个&#xff0c;随处运行”的座右铭。该语言用途广泛&#xff0c;可用于构建从…

排序算法之希尔排序

title: 希尔排序 date: 2024-7-25 10:48:15 0800 categories: 排序算法 tags:排序算法希尔排序 description: 1959年Shell发明&#xff0c;是简单插入排序的改进版。是一种高效的排序算法&#xff0c;通过分组和逐步缩减增量&#xff0c;使得数组在接近有序的情况下进行最终排…

【docker】dockerfile部署lnmp、docker compose初步

1、dockerfile部署lnmp mkdir /opt/lnmp cd /opt/lnmp mkdir nginx mysql php docker network create --subnet20.0.0.0/24 lnmp-net将wordpress文件夹拷贝到nginx、php文件夹 /opt/nginx/Dockerfile: # 使用官方的nginx镜像作为基础镜像 FROM nginx:latest# 复制默认配置文件…

分销商城小程序系统渠道拓展

线上卖货渠道很多&#xff0c;想要不断提高营收和新客获取&#xff0c;除了自己和工具本身努力外&#xff0c;还需要其他人的帮助来提高商城店铺的整体销量。 搭建saas商城系统网站/小程序&#xff0c;后台上货&#xff0c;设置支付、配送、营销、精美模板商城装修等内容&…

快速解析数据挖掘,最短时间明白什么是数据挖掘------下

信息损失函数 &#xff08;Information Loss Function&#xff09;是衡量在数据转换或处理过程中信息丢失的程度的函数。在数据科学、机器学习和统计学中&#xff0c;信息损失是一个重要的概念&#xff0c;尤其是在数据降维、特征选择、数据压缩和隐私保护等领域。 信息损失函…

数字化营销在公域场景中的无限可能

在如今的商业领域&#xff0c;公域场景为企业提供了广阔的发展空间&#xff0c;而数字化营销则成为了企业在这些场景中脱颖而出的关键利器。 ​ 一、电商平台营销 当企业在淘宝、京东等大型电商平台开设店铺&#xff0c;数字化营销便开始大显身手。 企业不仅能踊跃参与像双十…

【MySQL】explain 执行计划各字段解析

MySQL 如何读写数据&#xff1f;https://blog.csdn.net/weixin_43551213/article/details/140862538 MySQL 索引https://blog.csdn.net/weixin_43551213/article/details/140847916 在上一篇文章中提到了索引&#xff0c;而添加索引是优化 SQL 语句的一个方式&#xff0c;但是…

计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)

运输层协议概述 进程之间的通信 运输层向它上面的应用层提供通信服务。 当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&#xff0c;都要使用协议栈中的运输层&#xff1b;而网络核心部分中的路由器在转发分组时只用到下三层的功能。 Q1&#xff1a;我们…

mysql windows安装与远程连接配置

安装包在主页资源中 一、安装(此安装教程为“mysql-installer-community-5.7.41.0.msi”安装教程&#xff0c;安装到win10环境) 保持默认选项&#xff0c;点击”Next“。 点开第一行加号展开一路展开找到“MySQL Server 5,7,41 - X64”点击选中点击一下中间只想右侧的箭头看到…

Attention注意力机制

神经网络注意力机制代码实现 import torch import torch.nn as nn import torch.nn.functional as F# MyAtt类实现思路分析 # 1 init函数 (self, query_size, key_size, value_size1, value_size2, output_size) # 准备2个线性层 注意力权重分布self.attn 注意力结果表示按照指…

简单测试AOP五种增强执行时机

1. 目标方法类&#xff0c;spring代理bean Component public class Test {public void test(){System.out.println("test 目标方法");}public void testException(){throw new RuntimeException();} } 2. 配置类 Configuration ComponentScan EnableAspectJAutoPr…

unity项目打包为webgl后应用于vue项目中(iframe模式)的数据交互

参考文章&#xff1a; 1.Unity打包WebGL: 导入Vue 2.unity文档-WebGL&#xff1a;与浏览器脚本交互 3.unity与vue交互(无第三方插件&#xff09; 目录 一、前期工作1.新建.jslib文件2.新建.cs脚本3. 新建一个Text对象和button按钮对象4.添加脚本空对象UIEvent5.导出unity为w…

Windows配置开机直达桌面并跳过锁屏登录界面在 Windows 10 中添加在启动时自动运行的应用

目录 Win10开机直达桌面并跳过锁屏登录界面修改组策略修改注册表跳过登录界面 在 Windows 10 中添加在启动时自动运行的应用设置系统级别服务一、Windows下使用sc将应用程序设置为系统服务1. 什么是sc命令&#xff1f;2. sc命令的基本语法3. 创建Windows服务的步骤与示例创建服…

CANoe软件中Trace窗口的筛选栏标题不显示(空白)的解决方法

文章目录 问题描述原因分析解决方案扩展知识总结问题描述 不知道什么情况,CANoe软件中Trace窗口的筛选栏标题突然不显示了,一片空白。现象如下: 虽然不影响CANoe软件的使用,但是观感上非常难受,对于强迫症患者非常不友好。 原因分析 按照常规思路,尝试了: 1、重启CAN…

K8S中使用英伟达GPU —— 筑梦之路

前提条件 根据不同的操作系统&#xff0c;安装好显卡驱动&#xff0c;并能正常识别出来显卡&#xff0c;比如如下截图&#xff1a; GPU容器创建流程 containerd --> containerd-shim--> nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvid…

MoExtend: 模态和任务扩展调整的新专家

MoExtend: Tuning New Experts for Modality and Task Extension GitHub - zhongshsh/MoExtend: ACL 2024 (SRW) https://arxiv.org/pdf/2408.03511 大型语言模型&#xff08;LLM&#xff09;在各种任务中表现出色&#xff0c;然而其应用范围受限于主要在文本数据上进行训练。…

【vSphere 7/8】深入浅出 vSphere 证书 Ⅰ—— 初识和了解 vSphere证书

目录 引子1. vCenter Server 证书服务1.1 vSphere 安全证书&#xff08;1&#xff09;vSphere 安全证书的类型和有效期 1.2在 vSphere Client 中初识 vSphere 证书&#xff08;1&#xff09;vCenter 8.0.3 的 vSphere Client 界面&#xff08;2&#xff09;vCenter Server 7.0 …

TCP/UDP实现网络通信

TCP实现网络通信 1.服务端 #include<myhead.h>//1服务端定义:端口号\id号 #define SER_PIPR 6666 #define SER_IP "196.168.111.186" //通过ifconfig查看ip int main(int argc, const char *argv[]) {//1创建套接字int sfd socket(AF_INET,SOCK_STREAM,0);…

深度解析Edge SCDN与CDN:安全加速,全面防护

在现代互联网应用中&#xff0c;CDN已成为提高网站和应用性能不可或缺的技术之一。然而&#xff0c;随着网络安全威胁的日益严峻&#xff0c;单纯依靠CDN提供的加速服务已经不足以满足企业的安全需求。因此&#xff0c;Edge SCDN出现了&#xff0c;它不仅具备CDN的加速特性&…