Explorar o código

修改 车闸、门闸 ,模拟发送事件

11868 hai 3 días
pai
achega
f728a7835e

+ 0 - 1
supervision-admin/src/main/java/com/supervision/web/ConnectSDK/util/DeviceSimulator.java

@@ -3,7 +3,6 @@ package com.supervision.web.ConnectSDK.util;
 import com.supervision.web.ConnectSDK.carCamera.CarCameraDeviceManager;
 import com.supervision.web.ConnectSDK.carDoor.CarDoorDeviceManager;
 import com.supervision.web.ConnectSDK.peopleDoor.PeopleDoorDeviceManager;
-import com.supervision.WebSocket.EventWebSocket;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 

+ 37 - 43
supervision-admin/src/main/java/com/supervision/WebSocket/EventWebSocket.java → supervision-admin/src/main/java/com/supervision/web/WebSocket/EventWebSocket.java

@@ -1,4 +1,4 @@
-package com.supervision.WebSocket;
+package com.supervision.web.WebSocket;
 
 
 import com.alibaba.fastjson.JSON;
@@ -11,33 +11,23 @@ import org.springframework.stereotype.Component;
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
-import java.io.*;
+import java.io.IOException;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-/**
- * WebSocket 实时推送服务(兼容 JDK 1.8)
- * 每个用户登录后建立独立连接,通过 Token 鉴权
- */
 @Component
 @ServerEndpoint("/websocket/{token}")
 public class EventWebSocket {
 
     private static final Logger logger = LoggerFactory.getLogger(EventWebSocket.class);
 
-    /** 保存所有在线用户连接 */
     private static final Map<Long, Session> USER_SESSION_MAP = new ConcurrentHashMap<>();
 
     private Long userId;
 
-    /**
-     * 连接建立成功调用的方法
-     * */
     @OnOpen
     public void onOpen(Session session, @PathParam("token") String token) {
-        logger.info("🟢 WebSocket 请求到达,----------连接成功");
-        logger.info("🟢 WebSocket 请求到达,----------session: {}", session);
-        logger.info("🟢 WebSocket 请求到达,----------token: {}", token);
+        logger.info("🟢 WebSocket 请求到达,token={}", token);
         try {
             TokenService tokenService = SpringContextHolder.getBean(TokenService.class);
             LoginUser loginUser = tokenService.getLoginUserByToken(token);
@@ -45,14 +35,11 @@ public class EventWebSocket {
                 session.close(new CloseReason(CloseReason.CloseCodes.CANNOT_ACCEPT, "Invalid token"));
                 return;
             }
-
             this.userId = loginUser.getUserId();
             USER_SESSION_MAP.put(userId, session);
-            logger.info("✅ 用户 " + loginUser.getUsername() + " 已连接 WebSocket");
+            logger.info("✅ 用户 {} 已连接 WebSocket", loginUser.getUsername());
         } catch (Exception e) {
-            try {
-                session.close(new CloseReason(CloseReason.CloseCodes.CANNOT_ACCEPT, "Auth failed"));
-            } catch (IOException ignored) {}
+            try { session.close(new CloseReason(CloseReason.CloseCodes.CANNOT_ACCEPT, "Auth failed")); } catch (IOException ignored) {}
         }
     }
 
@@ -67,49 +54,56 @@ public class EventWebSocket {
     public void onClose() {
         if (userId != null) {
             USER_SESSION_MAP.remove(userId);
-            logger.info("❌ 用户 " + userId + " 已断开 WebSocket");
+            logger.info("❌ 用户 {} 已断开 WebSocket", userId);
         }
     }
 
     @OnError
     public void onError(Session session, Throwable error) {
-        System.err.println("WebSocket 错误:" + error.getMessage());
+        logger.error("WebSocket 错误:{}", error.getMessage());
     }
-
-    /** 广播消息给所有在线用户 */
-    public static void broadcast(String type, Object data) {
-        String msg = JSON.toJSONString(new WebSocketMessage(type, data));
-        for (Session session : USER_SESSION_MAP.values()) {
-            if (session.isOpen()) {
-                session.getAsyncRemote().sendText(msg);
-            }
+    // 给某个用户发送事件
+    // 门禁事件
+    // EventWebSocket.sendToUser(userId, "doorGate", Map.of("gateId", 1, "status", "open"));
+    // 车闸事件
+    // EventWebSocket.sendToUser(userId, "carGate", Map.of("carId", "A12345", "status", "pass"));
+    public static void sendToUser(Long userId, String type, Long deviceId, Object payload) {
+        Session session = USER_SESSION_MAP.get(userId);
+        if (session != null && session.isOpen()) {
+            WebSocketMessage msg = new WebSocketMessage(type, deviceId, payload);
+            session.getAsyncRemote().sendText(JSON.toJSONString(msg));
         }
     }
 
-    /** 向特定用户发送消息 */
-    public static void sendToUser(Long userId, Object data) {
-        Session session = USER_SESSION_MAP.get(userId);
-        if (session != null && session.isOpen()) {
-            session.getAsyncRemote().sendText(JSON.toJSONString(data));
+    // 广播给所有在线用户
+    public static void broadcast(String type, Long deviceId, Object payload) {
+        WebSocketMessage msg = new WebSocketMessage(type, deviceId, payload);
+        String json = JSON.toJSONString(msg);
+        for (Session session : USER_SESSION_MAP.values()) {
+            if (session.isOpen()) session.getAsyncRemote().sendText(json);
         }
     }
 
-    /** 简单封装的消息结构 */
+    // 消息结构
     private static class WebSocketMessage {
+
         private String type;
-        private Object data;
 
-        public WebSocketMessage(String type, Object data) {
+        private Long deviceId;
+
+        private Object payload;
+
+        public WebSocketMessage(String type, Long deviceId, Object payload) {
             this.type = type;
-            this.data = data;
+            this.deviceId = deviceId;
+            this.payload = payload;
         }
 
-        public String getType() {
-            return type;
-        }
+        public String getType() { return type; }
+
+        public Long getDeviceId() { return deviceId; }
+
+        public Object getPayload() { return payload; }
 
-        public Object getData() {
-            return data;
-        }
     }
 }

+ 1 - 1
supervision-admin/src/main/java/com/supervision/WebSocket/SpringContextHolder.java → supervision-admin/src/main/java/com/supervision/web/WebSocket/SpringContextHolder.java

@@ -1,4 +1,4 @@
-package com.supervision.WebSocket;
+package com.supervision.web.WebSocket;
 
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;

+ 1 - 1
supervision-admin/src/main/java/com/supervision/WebSocket/WebSocketConfig.java → supervision-admin/src/main/java/com/supervision/web/WebSocket/WebSocketConfig.java

@@ -1,4 +1,4 @@
-package com.supervision.WebSocket;
+package com.supervision.web.WebSocket;
 
 
 import org.slf4j.Logger;

+ 44 - 40
supervision-admin/src/main/java/com/supervision/web/peopleGateManage/controller/EventLogController.java

@@ -1,6 +1,7 @@
 package com.supervision.web.peopleGateManage.controller;
 
 import com.supervision.web.peopleGateManage.service.EventLogService;
+import com.supervision.web.util.DoorGateEventSimulator;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -20,44 +21,47 @@ public class EventLogController {
 //        Integer pageSize = Integer.parseInt(params.getOrDefault("pageSize","20").toString());
 //        return eventLogService.getEventLogs(params);
 //    }
-@GetMapping("/list")
-public Map<String, Object> list(
-        @RequestParam(required = false) String eventType,
-        @RequestParam(required = false) String personId,
-        @RequestParam(required = false) String jobNumber,
-        @RequestParam(required = false) String name,
-        @RequestParam(required = false) String remoteHost,
-        @RequestParam(required = false) String reader,
-        @RequestParam(required = false) String detectorId,
-        @RequestParam(required = false) String operation,
-        @RequestParam(required = false) String startTime,
-        @RequestParam(required = false) String endTime,
-        @RequestParam(defaultValue = "1") Integer pageNum,
-        @RequestParam(defaultValue = "24") Integer pageSize
-) {
-    // 强制为非 null 值
-    int pn = (pageNum == null || pageNum < 1) ? 1 : pageNum;
-    int ps = (pageSize == null || pageSize < 1) ? 24 : pageSize;
-    int offset = (pn - 1) * ps;
-
-    // 如果你的 Service 接收 Map,你也可以组装 Map,并且确保都是正确类型
-    Map<String, Object> params = new HashMap<>();
-    params.put("eventType", eventType);
-    params.put("personId", personId);
-    params.put("jobNumber", jobNumber);
-    params.put("name", name);
-    params.put("remoteHost", remoteHost);
-    params.put("reader", reader);
-    params.put("detectorId", detectorId);
-    params.put("operation", operation);
-    params.put("startTime", startTime);
-    params.put("endTime", endTime);
-    params.put("offset", offset);     // **Integer**
-    params.put("pageSize", ps);       // **Integer**
-
-    // 调用 Service(内部调用 Mapper.selectByCondition(params...))
-    Map<String, Object> result = eventLogService.getEventLogs(params);
-
-    return result;
-}
+    @GetMapping("/list")
+    public Map<String, Object> list(
+            @RequestParam(required = false) String eventType,
+            @RequestParam(required = false) String personId,
+            @RequestParam(required = false) String jobNumber,
+            @RequestParam(required = false) String name,
+            @RequestParam(required = false) String remoteHost,
+            @RequestParam(required = false) String reader,
+            @RequestParam(required = false) String detectorId,
+            @RequestParam(required = false) String operation,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
+            @RequestParam(defaultValue = "1") Integer pageNum,
+            @RequestParam(defaultValue = "24") Integer pageSize
+    ) {
+        // 强制为非 null 值
+        int pn = (pageNum == null || pageNum < 1) ? 1 : pageNum;
+        int ps = (pageSize == null || pageSize < 1) ? 24 : pageSize;
+        int offset = (pn - 1) * ps;
+
+        // 如果你的 Service 接收 Map,你也可以组装 Map,并且确保都是正确类型
+        Map<String, Object> params = new HashMap<>();
+        params.put("eventType", eventType);
+        params.put("personId", personId);
+        params.put("jobNumber", jobNumber);
+        params.put("name", name);
+        params.put("remoteHost", remoteHost);
+        params.put("reader", reader);
+        params.put("detectorId", detectorId);
+        params.put("operation", operation);
+        params.put("startTime", startTime);
+        params.put("endTime", endTime);
+        params.put("offset", offset);     // **Integer**
+        params.put("pageSize", ps);       // **Integer**
+
+        // 调用 Service(内部调用 Mapper.selectByCondition(params...))
+        Map<String, Object> result = eventLogService.getEventLogs(params);
+
+        DoorGateEventSimulator.getStart();
+
+        return result;
+    }
+
 }

+ 68 - 0
supervision-admin/src/main/java/com/supervision/web/util/DoorGateEventSimulator.java

@@ -0,0 +1,68 @@
+package com.supervision.web.util;
+
+import com.supervision.web.WebSocket.EventWebSocket;
+import java.util.*;
+
+public class DoorGateEventSimulator {
+
+    private static Random random = new Random();
+
+    // 生成 NET_DVR_TIME
+    private static Map<String, Integer> generateTime() {
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.SECOND, -random.nextInt(3600)); // 随机1小时内
+        Map<String, Integer> time = new HashMap<>();
+        time.put("dwYear", cal.get(Calendar.YEAR));
+        time.put("dwMonth", cal.get(Calendar.MONTH) + 1);
+        time.put("dwDay", cal.get(Calendar.DAY_OF_MONTH));
+        time.put("dwHour", cal.get(Calendar.HOUR_OF_DAY));
+        time.put("dwMinute", cal.get(Calendar.MINUTE));
+        time.put("dwSecond", cal.get(Calendar.SECOND));
+        return time;
+    }
+
+    // 生成 NET_DVR_IPADDR
+    private static Map<String, String> generateIp() {
+        Map<String, String> ip = new HashMap<>();
+        ip.put("sIpV4", "192.168.1." + (random.nextInt(200) + 1));
+        ip.put("sIpV6", ""); // 暂时留空
+        return ip;
+    }
+
+    public static void getStart() {
+        Random random = new Random();
+        long[] deviceIds = {1, 2, 3}; // 三个设备 ID
+        for (int i = 0; i < 30; i++) {
+            Map<String, Object> doorGateEvent = new HashMap<>();
+            doorGateEvent.put("dwSize", 128);
+            doorGateEvent.put("dwMajor", random.nextInt(5));
+            doorGateEvent.put("dwMinor", random.nextInt(10));
+            doorGateEvent.put("struTime", generateTime());
+            doorGateEvent.put("sNetUser", "user" + (random.nextInt(10) + 1));
+            doorGateEvent.put("struRemoteHostAddr", generateIp());
+
+            Map<String, Object> acsEventInfo = new HashMap<>();
+            acsEventInfo.put("eventType", random.nextBoolean() ? "card" : "face");
+            acsEventInfo.put("gateId", random.nextInt(5) + 1);
+            acsEventInfo.put("status", random.nextBoolean() ? "open" : "close");
+            doorGateEvent.put("struAcsEventInfo", acsEventInfo);
+
+            doorGateEvent.put("dwPicDataLen", random.nextBoolean() ? 1024 : 0);
+            doorGateEvent.put("pPicData", random.nextBoolean() ? "http://example.com/pic.jpg" : null);
+            doorGateEvent.put("wInductiveEventType", random.nextInt(3));
+            doorGateEvent.put("byPicTransType", random.nextInt(2));
+            doorGateEvent.put("dwIOTChannelNo", random.nextInt(5));
+
+            // ✅ 随机设备ID
+            long deviceId = deviceIds[random.nextInt(deviceIds.length)];
+
+            EventWebSocket.broadcast("doorGate", deviceId, doorGateEvent);
+
+            try {
+                Thread.sleep(500); // 模拟事件间隔
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}