From 2c97f9adf61f846edbce4ef458400416f0003ff8 Mon Sep 17 00:00:00 2001
From: liusuyi <13324259@qq.com>
Date: Fri, 28 Jul 2023 23:16:31 +0800
Subject: [PATCH] 修改exe程序调用方式 修改推送app实时位置为传参开启

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java                    |    7 +
 /dev/null                                                                              |   37 -----
 ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java       |  117 ++++++++++++----
 ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java        |    2 
 ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java |   97 +++++++++++++
 ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java                 |   58 ++++++++
 ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java                  |   48 +++++-
 7 files changed, 287 insertions(+), 79 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java
index 7294c55..fc5f294 100644
--- a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java
+++ b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java
@@ -23,7 +23,7 @@
 import java.util.stream.Collectors;
 
 /**
- * @Description: app位置推送
+ * @Description: app位置推送(弃用)
  * @ClassName: AppPositionPush
  * @Author: 刘苏义
  * @Date: 2023年07月25日16:07:04
diff --git a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java
new file mode 100644
index 0000000..5fad187
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java
@@ -0,0 +1,97 @@
+package com.ruoyi.app.position.service.impl;
+
+import com.ruoyi.app.position.domain.ArdAppPosition;
+import com.ruoyi.app.position.service.IArdAppPositionService;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.utils.websocket.util.WebSocketUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName AppPositionPushService
+ * @Description: app位置推送
+ * @Author 刘苏义
+ * @Date 2023/7/28 19:18
+ * @Version 1.0
+ * {"enabled":false,"frequency":1000,"userId":"69cf75f289424a48ba10cf33fa324206"}
+ */
+@Slf4j
+public class AppPositionPushService {
+    public static Map<String, List<ArdAppPosition>> dataMap = new HashMap<>();//常规数据 每个用户关联
+    public static Map<String, List<ArdAppPosition>> tempDataMap = new HashMap<>();//临时数据 每个用户关联
+    public static Map<String, Timer> userTimerMap = new HashMap();//定时器 每个用户关联
+    public static Map<String, Timer> tempUserTimerMap = new HashMap();//临时定时器 每个用户关联
+    public static List<ArdAppPosition> initDataList;
+
+    static {
+        initDataList = getAppPositionList();
+    }
+
+    //启动全局定时器
+    public static Timer startTimerTask(String userId, Integer period) {
+        Timer timer = new Timer();
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                List<ArdAppPosition> data = dataMap.get(userId);
+                if (data.size() > 0) {
+                    Map newMap = new HashMap<>();
+                    newMap.put("50000", data);
+                    WebSocketUtils.sendMessage(WebSocketUtils.ONLINE_USER_SESSIONS.get(userId), newMap);
+                }
+            }
+        }, 0, period);
+
+        return timer;
+    }
+
+    //启动引导定时器
+    public static Timer startTempTimerTask(String userId, Integer period) {
+        Timer timer = new Timer();
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                //循环
+                List<ArdAppPosition> data = tempDataMap.get(userId);
+                if (data.size() > 0) {
+                    Map newMap = new HashMap<>();
+                    newMap.put("50000", data);
+                    WebSocketUtils.sendMessage(WebSocketUtils.ONLINE_USER_SESSIONS.get(userId), newMap);
+                }
+            }
+        }, 0, period);
+
+        return timer;
+    }
+
+    //停止定时器
+    public static void stopTimerTask(Timer timer) {
+        if (timer != null) {
+            timer.cancel();
+            log.info("停止运行");
+        }
+    }
+
+    //查询所有app用户的位置信息
+    public static List<ArdAppPosition> getAppPositionList() {
+        List<ArdAppPosition> ArdAppPositions = new ArrayList<>();
+        ISysUserService sysUserService = SpringUtils.getBean(ISysUserService.class);
+        //获取所有app用户
+        List<SysUser> list = sysUserService.selectAllAppUserList(new SysUser());
+        List<SysUser> onlineList = list.stream()
+                .filter(obj -> obj.getAppOnlineState().equals("1"))
+                .collect(Collectors.toList());
+        for (SysUser sysUser : onlineList) {
+            IArdAppPositionService ardAppPositionService = SpringUtils.getBean(IArdAppPositionService.class);
+            ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId());
+            ArdAppPositions.add(ardAppPosition);
+        }
+        return ArdAppPositions;
+    }
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
index b28201b..31a8fe7 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
@@ -15,8 +15,10 @@
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Matcher;
@@ -43,20 +45,42 @@
         if (Platform.isWindows()) {
             String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "mediamtx" + File.separator + "mediamtx.exe";
             String ymlPath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "mediamtx" + File.separator + "mediamtx.yml";
-            try {
-                // 构建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口
-                String[] cmd = {"cmd", "/c", "start", exePath,ymlPath};
-                ProcessBuilder processBuilder = new ProcessBuilder(cmd);
-                processBuilder.redirectErrorStream(true); // 将错误输出重定向到标准输出
-                Process process = processBuilder.start();
-                // 如果你想等待程序完成
-                int exitCode = process.waitFor();
-            } catch (IOException | InterruptedException e) {
-                e.printStackTrace();
-            }
+            // 构建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口
+//                String[] cmd = {"cmd", "/c", "start", exePath,ymlPath};
+//                ProcessBuilder processBuilder = new ProcessBuilder(cmd);
+//                processBuilder.redirectErrorStream(true); // 将错误输出重定向到标准输出
+//                Process process = processBuilder.start();
+            // 如果你想等待程序完成
+            //  int exitCode = process.waitFor();
+            List<String> cmd = new ArrayList<>();
+            cmd.add(exePath);
+            cmd.add(ymlPath);
+            commandStart(cmd);
+
         }
     }
-
+    public static void commandStart(List<String> command) {
+        command.forEach(v -> System.out.print(v + " "));
+        System.out.println();
+        System.out.println();
+        ProcessBuilder builder = new ProcessBuilder();
+        //正常信息和错误信息合并输出
+        builder.redirectErrorStream(true);
+        builder.command(command);
+        //开始执行命令
+        Process process = null;
+        try {
+            process = builder.start();
+            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
+//            String line = "";
+//            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
+//            while ((line = br.readLine()) != null) {
+//                System.out.println(line);
+//            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
     @Override
     public String addPath(String name, String rtspPath, String mode) {
         String rtspUrl = "rtsp://" + mediamtxHost + ":7554/";
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java
new file mode 100644
index 0000000..299d2e3
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java
@@ -0,0 +1,58 @@
+package com.ruoyi.media.service.impl;
+
+import com.sun.jna.Platform;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description:
+ * @ClassName: webrtcService
+ * @Author: 刘苏义
+ * @Date: 2023年07月26日13:43:07
+ * @Version: 1.0
+ **/
+@Component
+public class WebrtcService {
+    @PostConstruct
+    public void init() {
+        if (Platform.isWindows()) {
+            // String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + "setup.bat";
+            // String[] cmd = {"cmd", "/c", "start", exePath};
+            String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + "webrtc-streamer.exe";
+            List<String> cmd = new ArrayList<>();
+            cmd.add(exePath);
+            cmd.add("-o");
+            cmd.add("-H127.0.0.1:8000");
+            commandStart(cmd);
+        }
+    }
+    public static void commandStart(List<String> command) {
+        command.forEach(v -> System.out.print(v + " "));
+        System.out.println();
+        System.out.println();
+        ProcessBuilder builder = new ProcessBuilder();
+        //正常信息和错误信息合并输出
+        builder.redirectErrorStream(true);
+        builder.command(command);
+        //开始执行命令
+        Process process = null;
+        try {
+           process = builder.start();
+//            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
+//            String line = "";
+//            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
+//            while ((line = br.readLine()) != null) {
+//                System.out.println(line);
+//            }
+       } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/webrtcService.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/webrtcService.java
deleted file mode 100644
index a4bf6a4..0000000
--- a/ard-work/src/main/java/com/ruoyi/media/service/impl/webrtcService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.ruoyi.media.service.impl;
-
-import com.sun.jna.Platform;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @Description:
- * @ClassName: webrtcService
- * @Author: 刘苏义
- * @Date: 2023年07月26日13:43:07
- * @Version: 1.0
- **/
-@Component
-public class webrtcService {
-    @PostConstruct
-    public void init() {
-        if (Platform.isWindows()) {
-            String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + "setup.bat";
-
-            try {
-                // 构建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口
-                String[] cmd = {"cmd", "/c", "start", exePath};
-                ProcessBuilder processBuilder = new ProcessBuilder(cmd);
-                processBuilder.redirectErrorStream(true); // 将错误输出重定向到标准输出
-                Process process = processBuilder.start();
-                // 如果你想等待程序完成
-                int exitCode = process.waitFor();
-            } catch (IOException | InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-}
diff --git a/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java b/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
index f4186b2..6050250 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
@@ -4,6 +4,7 @@
 import com.ruoyi.app.position.domain.ArdAppPosition;
 import com.ruoyi.app.position.service.IArdAppPositionService;
 import com.ruoyi.app.position.service.impl.AppPositionPush;
+import com.ruoyi.app.position.service.impl.AppPositionPushService;
 import com.ruoyi.app.position.service.impl.ArdAppPositionServiceImpl;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.spring.SpringUtils;
@@ -18,10 +19,7 @@
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -36,45 +34,93 @@
 @Slf4j(topic = "websocket")
 @ServerEndpoint("/websocket/{userId}")
 public class ChatServerEndpoint {
-
     @OnOpen
     public void openSession(@PathParam("userId") String userId, Session session) {
         WebSocketUtils.ONLINE_USER_SESSIONS.put(userId, session);
         String message = "用户[" + userId + "] 成功连接!";
         log.info("用户登录:" + message);
         WebSocketUtils.sendMessage(session, message);
-        //每个用户连接时,启动初始所有app用户位置发送
-        AppPositionPush.initDataMap.put(userId,AppPositionPush.getAppPositionList());
-        AppPositionPush.initPushTask(userId,session,3000);
+        //region 旧方法
+//        //每个用户连接时,启动初始所有app用户位置发送
+//        AppPositionPush.initDataMap.put(userId,AppPositionPush.getAppPositionList());
+//        AppPositionPush.initPushTask(userId,session,3000);
+        //endregion
     }
 
     @OnMessage
     public void onMessage(@PathParam("userId") String userId, String message) {
         log.info("收到消息:" + message);
         Session session = WebSocketUtils.ONLINE_USER_SESSIONS.get(userId);
-       // WebSocketUtils.sendMessage(session, message);
+        WebSocketUtils.sendMessage(session, message);
 //        sendMessageAll("用户[" + userid + "] : " + message);
         // 根据用户新的频率重新调整定时任务
-        Map<String,Object> map = JSONObject.parseObject(message, Map.class);
-        if(map.size()>0) {
-            Integer frequency = (Integer)map.get("frequency");
+        Map<String, Object> map = JSONObject.parseObject(message, Map.class);
+        if (map.size() > 0) {
+            Boolean enabled = (Boolean) map.get("enabled");
+            if (enabled) {
+                //启动全局推送
+                List<ArdAppPosition> newList = new ArrayList<>(AppPositionPushService.initDataList);
+                AppPositionPushService.dataMap.put(userId, newList);
+                if (!AppPositionPushService.userTimerMap.containsKey(userId)) {
+                    Timer timer = AppPositionPushService.startTimerTask(userId, 3000);
+                    AppPositionPushService.userTimerMap.put(userId, timer);//将定时器关联用户
+                }
+            } else {
+                //停止全局推送
+                if (AppPositionPushService.userTimerMap.containsKey(userId)) {
+                    Timer timer = AppPositionPushService.userTimerMap.get(userId);
+                    AppPositionPushService.stopTimerTask(timer);
+                    AppPositionPushService.userTimerMap.remove(userId);
+                }
+                if (AppPositionPushService.tempUserTimerMap.containsKey(userId)) {
+                    Timer temptimer = AppPositionPushService.tempUserTimerMap.get(userId);
+                    AppPositionPushService.stopTimerTask(temptimer);
+                    AppPositionPushService.tempUserTimerMap.remove(userId);
+                }
+                AppPositionPushService.dataMap.remove(userId);
+                AppPositionPushService.tempDataMap.remove(userId);
+            }
+
+            Integer frequency = (Integer) map.get("frequency");
             String uId = (String) map.get("userId");
-            Map<String, List<ArdAppPosition>> dataMap = new HashMap<>();
-            List<ArdAppPosition> positionList = AppPositionPush.initDataMap.get(userId);//获取当前用户的默认发送的数据map
-            if(frequency>0)
-            {
-                //接收到频率大于0,属于申请引导,获取除引导外的其他app用户的位置List
-                List<ArdAppPosition> appPositionList = positionList.stream()
+            if (frequency > 0) {
+                List<ArdAppPosition> List = AppPositionPushService.initDataList.stream()
                         .filter(obj -> !obj.getUserId().equals(uId))
-                        .collect(Collectors.toList());
-                dataMap.put(userId,appPositionList);
+                        .collect(Collectors.toList());//去除引导后的list
+                AppPositionPushService.dataMap.put(userId,List);
+
+                List<ArdAppPosition> tempList = AppPositionPushService.initDataList.stream()
+                        .filter(obj -> obj.getUserId().equals(uId))
+                        .collect(Collectors.toList());//获取引导的list
+                AppPositionPushService.tempDataMap.put(userId, tempList);
+                Timer timer = AppPositionPushService.startTempTimerTask(userId, frequency);
+                AppPositionPushService.tempUserTimerMap.put(userId, timer);
+            } else {
+                List<ArdAppPosition> newList = new ArrayList<>(AppPositionPushService.initDataList);
+                AppPositionPushService.dataMap.put(userId, newList);
+                Timer timer = AppPositionPushService.tempUserTimerMap.get(userId);
+                AppPositionPushService.stopTimerTask(timer);
+                AppPositionPushService.tempUserTimerMap.remove(userId);
+                AppPositionPushService.tempDataMap.remove(userId);
             }
-           else {
-                //接收到频率等于0,属于释放引导,获取到全部app用户的位置List
-                dataMap.put(userId,AppPositionPush.getAppPositionList());
-            }
-            AppPositionPush.initDataMap.putAll(dataMap);//更新初始会话默认数据map
-            AppPositionPush.startLocationPushTask(userId,session,uId, frequency);//开启新任务
+            //region 旧方法
+//            Map<String, List<ArdAppPosition>> dataMap = new HashMap<>();
+//            List<ArdAppPosition> positionList = AppPositionPush.initDataMap.get(userId);//获取当前用户的默认发送的数据map
+//            if(frequency>0)
+//            {
+//                //接收到频率大于0,属于申请引导,获取除引导外的其他app用户的位置List
+//                List<ArdAppPosition> appPositionList = positionList.stream()
+//                        .filter(obj -> !obj.getUserId().equals(uId))
+//                        .collect(Collectors.toList());
+//                dataMap.put(userId,appPositionList);
+//            }
+//           else {
+//                //接收到频率等于0,属于释放引导,获取到全部app用户的位置List
+//                dataMap.put(userId,AppPositionPush.getAppPositionList());
+//            }
+//            AppPositionPush.initDataMap.putAll(dataMap);//更新初始会话默认数据map
+//            AppPositionPush.startLocationPushTask(userId,session,uId, frequency);//开启新任务
+            //endregion
         }
     }
 
@@ -83,12 +129,25 @@
         //当前的Session 移除
         WebSocketUtils.ONLINE_USER_SESSIONS.remove(userId);
 //        //并且通知其他人当前用户已经离开聊天室了
-       String message="用户[" + userId + "] 断开连接!";
+        String message = "用户[" + userId + "] 断开连接!";
 //        sendMessage(session,message);
-        log.info("消息:"+message);
+        log.info("消息:" + message);
         try {
             session.close();
-            AppPositionPush.stopLocationPushTask(session);
+            //停止全局推送
+            if (AppPositionPushService.userTimerMap.containsKey(userId)) {
+                Timer timer = AppPositionPushService.userTimerMap.get(userId);
+                AppPositionPushService.stopTimerTask(timer);
+                AppPositionPushService.userTimerMap.remove(userId);
+            }
+            if (AppPositionPushService.tempUserTimerMap.containsKey(userId)) {
+                Timer temptimer = AppPositionPushService.tempUserTimerMap.get(userId);
+                AppPositionPushService.stopTimerTask(temptimer);
+                AppPositionPushService.tempUserTimerMap.remove(userId);
+            }
+            AppPositionPushService.dataMap.remove(userId);
+            AppPositionPushService.tempDataMap.remove(userId);
+            // AppPositionPush.stopLocationPushTask(session);//旧方法
         } catch (IOException e) {
             log.error("onClose error", e);
         }
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java
index e4b8c25..aa5a322 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.rongcloud.service.RongCloudService;
 import com.ruoyi.system.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -20,6 +21,7 @@
  * @Version: 1.0
  **/
 @Component("RongCloudTask")
+@Slf4j
 public class RongCloudTask {
 
     @Resource
@@ -29,6 +31,7 @@
 
     public void getAppUserOnlineStateTask()
     {
+        try{
         List<SysUser> SysUserList = sysUserService.selectAllAppUserList(new SysUser());
         if(SysUserList.size()>0) {
             for (SysUser sysUser : SysUserList) {
@@ -40,6 +43,10 @@
                 }
                 sysUserService.updateUserProfile(sysUser);
             }
+        }}
+        catch (Exception ex)
+        {
+            log.error("融云在线接口异常:"+ex.getMessage());
         }
     }
 }

--
Gitblit v1.9.3