From 95e496c0a4706e23e28b714fd88221ec88cf2a74 Mon Sep 17 00:00:00 2001 From: haozq <1611483981@qq.com> Date: Fri, 30 Aug 2024 17:34:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8A=E8=A3=85=E7=9B=91=E6=8E=A7=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=91=8A=E8=AD=A6=E6=8E=A8=E9=80=81=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/entity/tcp/ElectricityVo.java | 29 +++++ .../bonus-tcp/libs/gps-push-client.jar | Bin 0 -> 28436 bytes bonus-modules/bonus-tcp/pom.xml | 18 ++- .../com/bonus/tcp/BonusTcpApplication.java | 40 ++++++ .../service/impl/TcpDataService.java | 13 ++ .../java/com/bonus/tcp/warn/DevWarnImpl.java | 116 ++++++++++++++++++ 6 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/tcp/ElectricityVo.java create mode 100644 bonus-modules/bonus-tcp/libs/gps-push-client.jar create mode 100644 bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/warn/DevWarnImpl.java diff --git a/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/tcp/ElectricityVo.java b/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/tcp/ElectricityVo.java new file mode 100644 index 0000000..b27acab --- /dev/null +++ b/bonus-common/bonus-common-entity/src/main/java/com/bonus/common/entity/tcp/ElectricityVo.java @@ -0,0 +1,29 @@ +package com.bonus.common.entity.tcp; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +/** + * 静电感应 + */ +@Data +public class ElectricityVo { + + private String id; + + private String devCode; + + private String devName; + + private String warnContent; + + + private String warnTime; + + + private String userId; + + private String proId; + + private String warnType; +} diff --git a/bonus-modules/bonus-tcp/libs/gps-push-client.jar b/bonus-modules/bonus-tcp/libs/gps-push-client.jar new file mode 100644 index 0000000000000000000000000000000000000000..d0a48d2b04a30589856fce4ec2df87d5d075455f GIT binary patch literal 28436 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 literal 0 HcmV?d00001 diff --git a/bonus-modules/bonus-tcp/pom.xml b/bonus-modules/bonus-tcp/pom.xml index e39a243..31cdac4 100644 --- a/bonus-modules/bonus-tcp/pom.xml +++ b/bonus-modules/bonus-tcp/pom.xml @@ -100,17 +100,33 @@ 24.6.0 compile - + + org.springframework.boot + spring-boot-configuration-processor + true + + + + gps-push-client + gps-push-client + 1.0 + system + ${project.basedir}/libs/gps-push-client.jar + + ${project.artifactId} org.springframework.boot spring-boot-maven-plugin + + true + diff --git a/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/BonusTcpApplication.java b/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/BonusTcpApplication.java index 1410eab..b881ba2 100644 --- a/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/BonusTcpApplication.java +++ b/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/BonusTcpApplication.java @@ -4,6 +4,8 @@ import com.bonus.common.security.annotation.EnableCustomConfig; import com.bonus.common.security.annotation.EnableRyFeignClients; import com.bonus.common.swagger.annotation.EnableCustomSwagger2; import com.bonus.tcp.server.server.BootNettyServer; +import com.bonus.tcp.warn.DevWarnImpl; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; @@ -16,8 +18,25 @@ import org.springframework.scheduling.annotation.Async; @EnableRyFeignClients @SpringBootApplication(exclude = MongoAutoConfiguration.class) public class BonusTcpApplication implements CommandLineRunner {//实现CommandLineRunner + + @Value("${tcp.server.port}") private int port; + + @Value("${dev.video.ip}") + private String videIp; + + @Value("${dev.video.port}") + private int videPort; + + @Value("${dev.video.username}") + private String username; + + @Value("${dev.video.pwd}") + private String pwd; + + @Value("${dev.video.msgId}") + private String msgId; public static void main(String[] args) { SpringApplication.run(BonusTcpApplication.class, args); System.err.println("(♥◠‿◠)ノ゙ TCP模块启动成功 ლ(´ڡ`ლ)゙"); @@ -28,6 +47,27 @@ public class BonusTcpApplication implements CommandLineRunner {//实现CommandLi @Async @Override public void run(String... args) throws Exception { + clientDevWarn(); new BootNettyServer().bind(port); } + + /** + * 创建链接数据推送接口 + * @throws Exception + */ + public void clientDevWarn() throws Exception { + DevWarnImpl client = new DevWarnImpl(); + client.setLog(false); + client.setHost(videIp); + client.setPort(videPort); + client.setUserName(username); + client.setPwd(pwd); + client.setSubMsgIds(msgId); + client.setDesc("测试客户端"); + client.start(); + + } + + + } \ No newline at end of file diff --git a/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/smartIdentify/service/impl/TcpDataService.java b/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/smartIdentify/service/impl/TcpDataService.java index 5bb27aa..b56b82a 100644 --- a/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/smartIdentify/service/impl/TcpDataService.java +++ b/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/smartIdentify/service/impl/TcpDataService.java @@ -17,6 +17,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; @Service @Slf4j @@ -134,4 +135,16 @@ public class TcpDataService { } return ""; } + + /** + * 告警数据入库 + * @param jsonString + */ + public void insertDevWarnInfo(Map jsonString) { + try{ + + }catch (Exception e){ + log.error(e.toString(),e); + } + } } diff --git a/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/warn/DevWarnImpl.java b/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/warn/DevWarnImpl.java new file mode 100644 index 0000000..af144d3 --- /dev/null +++ b/bonus-modules/bonus-tcp/src/main/java/com/bonus/tcp/warn/DevWarnImpl.java @@ -0,0 +1,116 @@ +package com.bonus.tcp.warn; + +import com.alibaba.fastjson.JSON; +import com.bonus.common.core.utils.SpringUtils; +import com.bonus.tcp.smartIdentify.service.impl.TcpDataService; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import com.gps31.push.netty.PushClient; +import com.gps31.push.netty.PushMsg; +import com.gps31.push.netty.client.TcpClient; +import com.gps31.push.util.MapUtil; +import org.springframework.stereotype.Component; + +/** + * 吊装监控告警推送 + * @author 黑子 + */ +@Slf4j +public class DevWarnImpl extends PushClient{ + + public TcpDataService service = SpringUtils.getBean(TcpDataService.class); + private ThreadPoolExecutor pool = new ThreadPoolExecutor(10,10,30, TimeUnit.SECONDS,new LinkedBlockingQueue(),new ThreadPoolExecutor.AbortPolicy()); + @Override + public void messageReceived(TcpClient tcpClient, PushMsg pushMsg) + throws Exception { + if("8001".equals(pushMsg.getCmd())) {//登录应答 + String rspResult = MapUtil.getStrVal(pushMsg.getJsonMap(),"rspResult","1"); + if("0".equals(rspResult)) {//登录成功,定阅动态消息 + Map map = new HashMap(); + map.put("seq", "1"); + map.put("action", "add"); + map.put("msgIds", JSON.toJSONString(getSubCmdSet())); + PushMsg subMsg = getInstance("0003",map); + sendMsg(subMsg); + } + }else if("8002".equals(pushMsg.getCmd())){//心跳应答 + }else if("8003".equals(pushMsg.getCmd())){//订阅动态消息应答 + String rspResult = MapUtil.getStrVal(pushMsg.getJsonMap(),"rspResult","1"); + log.error(String.format(" 订阅应答:%s", "0".equals(rspResult)?"成功":"失败")); + }else if("0200".equals(pushMsg.getCmd())) {//定位信息 + Map gpsMap = pushMsg.getJsonMap(); + String carName = MapUtil.getStrVal(gpsMap, "carName","");//获取车牌号 + log.error(String.format(" ---->收到定位数据:%s",JSON.toJSONString(gpsMap))); + /** + * 请加入三方集成方的业务逻辑 + * 注意:下面的代码不要出现阻塞操作(比如数据库操作),否则会出现推送的数据延迟情况; + */ + + //有阻塞的业务,请使用线程池处理接收到的每个消息。 + pool.execute(new Runnable() { + @Override + public void run() { + + } + }); + }else if("0300".equals(pushMsg.getCmd())) {//报警消息 + Map alarmMap = pushMsg.getJsonMap(); + String carName = MapUtil.getStrVal(alarmMap, "carName","");//获取车牌号 + log.error(String.format(" ---->收到报警数据:%s",JSON.toJSONString(alarmMap))); + /** + * 请加入三方集成方的业务逻辑 + * 注意:下面的代码不要出现阻塞操作(比如数据库操作),否则会出现推送的数据延迟情况; + */ + //有阻塞的业务,请使用线程池处理接收到的每个消息。 + pool.execute(new Runnable() { + @Override + public void run() { + service.insertDevWarnInfo( alarmMap); + } + }); + }else if("0401".equals(pushMsg.getCmd())) {//透传消息 + Map dataMap = pushMsg.getJsonMap(); + String carName = MapUtil.getStrVal(dataMap, "carName","");//获取车牌号 + log.error(String.format(" ---->收到透传数据:%s",JSON.toJSONString(dataMap))); + /** + * 请加入三方集成方的业务逻辑 + */ + } + } + public static void main(String[] args) { + try { + //下面是指向的是我们演示服务器,可以直接执行,用于验证数据推送。正式使用时,请修改相应的参数:比如IP,帐号,密码 + DevWarnImpl client = new DevWarnImpl(); + client.setLog(true);//是否打印明文的交互信息 +// client.setLogBytes(true);//是否打印网络字节流 + if(args == null || args.length>=5) { + client.setHost(args[0]);//服务器IP + client.setPort(Integer.parseInt(args[1]));//服务器端口 + client.setUserName(args[2]);//系统用户名 + client.setPwd(args[3]);//系统用户密码 + client.setSubMsgIds(args[4]);//订阅的动态消息,当前示例是订阅 定位消息(0x0200) + }else { + client.setHost("115.233.219.190");//服务器IP + client.setPort(10100);//服务器端口 + client.setUserName("ys_admin");//系统用户名 + client.setPwd("123456");//系统用户密码 + client.setSubMsgIds("0200|0300");//订阅的动态消息,多个动态消息使用|辟分,当前示例是订阅 定位消息(0x0200)和报警消息(0x0300) + } + client.setDesc("测试客户端");//客户端的描述, + client.start(); + while(true) { + // Thread.sleep(1000); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + +}