Răsfoiți Sursa

+ 增加uwb坐标监听

chen.cheng 7 luni în urmă
părinte
comite
f2917066f1

+ 19 - 9
bd-location/src/main/java/com/ruoyi/bd/socket/UWBSocket/UWBSocketClient.java

@@ -8,15 +8,22 @@ import org.java_websocket.drafts.Draft;
 import org.java_websocket.handshake.ServerHandshake;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.bd.domain.UWBAuth;
+import com.ruoyi.common.BDConst;
+
+import net.dreamlu.iot.mqtt.spring.client.MqttClientTemplate;
 
 public class UWBSocketClient extends org.java_websocket.client.WebSocketClient {
 
     private static final Logger log = LoggerFactory.getLogger(UWBSocketClient.class);
 
+    @Autowired
+    private MqttClientTemplate client;
+
     private UWBAuth authToken;
 
     public UWBAuth getAuthToken() {
@@ -41,26 +48,29 @@ public class UWBSocketClient extends org.java_websocket.client.WebSocketClient {
 
     @Override
     public void onOpen(ServerHandshake serverHandshake) {
-        log.info("[websocket] 连接成功,{}", JSON.toJSONString(this.authToken));
+        log.debug("[websocket] 连接成功,{}", JSON.toJSONString(this.authToken));
         send(JSON.toJSONString(this.authToken));
     }
 
-
     @Override
     public void onMessage(String message) {
-        log.info("[websocket] 收到消息={}", message);
+        log.debug("[websocket] 收到消息={}", message);
         JSONObject data = JSON.parseObject(message);
-        if ("handshake".equals(data.getString("message"))) {
-            this.authToken.setTagId("847F3");
-            log.info("[websocket] 推送={}", JSON.toJSONString(this.authToken));
-            // tagId要去掉前缀0
-            send(JSON.toJSONString(this.authToken));
+        if (!"handshake".equals(data.getString("message"))) {
+            client.publish(String.format(BDConst.MQTT_TOPIC.UWB_VIDEO_TRACE_POINT, "847F3"), JSON.toJSONBytes(data));
+            // TODO 推送轨迹
+            // client.publish(String.format(BDConst.MQTT_TOPIC.UWB_VIDEO_TRACE, "847F3"), JSON.toJSONBytes(data));
+            return;
         }
+        this.authToken.setTagId("847F3");
+        log.debug("[websocket] 推送={}", JSON.toJSONString(this.authToken));
+        // tagId要去掉前缀0
+        send(JSON.toJSONString(this.authToken));
     }
 
     @Override
     public void onMessage(ByteBuffer bytes) {
-        log.info("[websocket] 收到消息={}", JSON.parseObject(bytes.array()));
+        log.debug("[websocket] 收到消息={}", JSON.parseObject(bytes.array()));
 
     }
 

+ 103 - 0
bd-location/src/main/java/com/ruoyi/bd/socket/UWBVideoTraceSocketServer.java

@@ -0,0 +1,103 @@
+package com.ruoyi.bd.socket;
+
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.annotation.PostConstruct;
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.CrossOrigin;
+
+@ServerEndpoint("/ws/video/trace/{client}/{device}")
+@CrossOrigin(origins = "*")
+@Component
+public class UWBVideoTraceSocketServer {
+    private static final Logger logger = LoggerFactory.getLogger(UWBVideoTraceSocketServer.class);
+
+    // 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static AtomicInteger onlineNum = new AtomicInteger();
+
+    // concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
+    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
+
+    public static final String SESSION_KEY_TEMPLATE = "%s-%s";
+
+    @PostConstruct
+    public void init() {
+        logger.info("WebSocketServer init");
+    }
+
+    // 发送消息
+    public void sendMessage(Session session, String message) throws IOException {
+        if (session != null) {
+            synchronized (session) {
+                logger.info("发送数据:{}", message);
+                session.getBasicRemote().sendText(message);
+            }
+        }
+    }
+
+    // 群发消息
+    public void broadcast(String message) {
+        for (Session session : sessionPools.values()) {
+            try {
+                sendMessage(session, message);
+            }
+            catch (Exception e) {
+                logger.info("server get {}", e.getMessage());
+            }
+        }
+    }
+
+    // 建立连接成功调用
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "client") String client,
+        @PathParam(value = "device") String device) {
+        sessionPools.put(String.format(SESSION_KEY_TEMPLATE, client, device), session);
+        addOnlineCount();
+    }
+
+    // 关闭连接时调用
+    @OnClose
+    public void onClose( @PathParam(value = "client") String client,
+                         @PathParam(value = "device") String device) {
+        sessionPools.remove(String.format(SESSION_KEY_TEMPLATE, client, device));
+        subOnlineCount();
+        logger.info("{}断开webSocket连接!当前人数为:{}", device, onlineNum);
+    }
+
+    // 收到客户端信息后,根据接收人的username把消息推下去或者群发
+    // to=-1群发消息
+    @OnMessage
+    public void onMessage(String message) throws IOException {
+        logger.info("server get {}", message);
+    }
+
+    // 错误时调用
+    @OnError
+    public void onError(Session session, Throwable throwable) {
+        logger.info("server get {}", throwable.getMessage());
+    }
+
+    public static void addOnlineCount() {
+        onlineNum.incrementAndGet();
+    }
+
+    public static void subOnlineCount() {
+        onlineNum.decrementAndGet();
+    }
+
+    public static AtomicInteger getOnlineNumber() {
+        return onlineNum;
+    }
+
+    public static ConcurrentHashMap<String, Session> getSessionPools() {
+        return sessionPools;
+    }
+}

+ 2 - 0
bd-location/src/main/java/com/ruoyi/common/BDConst.java

@@ -19,5 +19,7 @@ public interface BDConst {
 
         String DEVICE_LOCATION_TOPIC = "/uwb/point/%s";
 
+        String UWB_VIDEO_TRACE_POINT = "/uwb/video-trace/point/%s";
+
     }
 }

+ 6 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/geo/GeoUtils.java

@@ -133,6 +133,12 @@ public class GeoUtils {
         return geoFencePolygon.contains(point);
     }
 
+
+    public static void main(String[] args) {
+        Polygon polygon = getPolygon("POLYGON((0.63 2.95, 2.6 2.78, 3.97 6.14, 0 5.7, 0.63 2.95))");
+        System.out.println(isPointInGeoFence(polygon, "1.23", "4.56"));
+
+    }
     /**
      * 判断指定的GPS点是否在电子围栏内
      *