瀏覽代碼

+ 视频跟随

chen.cheng 6 月之前
父節點
當前提交
2555eba772

+ 32 - 21
bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/engine/impl/VideoTrailEngine.java

@@ -1,13 +1,13 @@
 package com.huashe.park.application.engine.impl;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.concurrent.LinkedBlockingQueue;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 
-import com.huashe.park.core.redis.RedisProxy;
 import org.apache.commons.lang3.ObjectUtils;
 import org.locationtech.jts.geom.Polygon;
 import org.slf4j.Logger;
@@ -19,14 +19,16 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.JSONPath;
 import com.huashe.park.application.engine.EvtFusionEngine;
 import com.huashe.park.application.engine.LocationInfo;
 import com.huashe.park.application.web.core.config.MqttCfg;
+import com.huashe.park.common.DateTimeUtil;
 import com.huashe.park.common.consts.BDConst;
-import com.huashe.park.common.consts.enums.FenceType;
 import com.huashe.park.common.geo.GeoUtils;
-import com.huashe.park.core.service.IBdFenceInfoService;
-import com.huashe.park.domain.entity.BdFenceInfo;
+import com.huashe.park.core.redis.RedisProxy;
+import com.huashe.park.core.service.IBdCameraInfoService;
+import com.huashe.park.domain.dto.VideoFence;
 import com.huashe.park.infrastructure.socket.server.UwbVideoTraceSocketServer;
 
 import cn.hutool.core.lang.UUID;
@@ -40,7 +42,7 @@ public class VideoTrailEngine extends EvtFusionEngine {
     private static final Logger logger = LoggerFactory.getLogger(VideoTrailEngine.class);
 
     @Autowired
-    private IBdFenceInfoService fenceInfoService;
+    private IBdCameraInfoService cameraInfoService;
 
     @Resource
     private RedisProxy redisService;
@@ -58,11 +60,7 @@ public class VideoTrailEngine extends EvtFusionEngine {
         super.init();
         this.setEngineName("视频跟随");
         if (!redisService.hasKey(BDConst.REDIS_KEY.FENCE_VIDEO_TRACE)) {
-            List<BdFenceInfo> bdFenceInfos = fenceInfoService.selectBdFenceInfoList(new BdFenceInfo() {
-                {
-                    setFenceType(FenceType.VIDEO_FENCE_IN.getCode());
-                }
-            });
+            List<VideoFence> bdFenceInfos = cameraInfoService.selectBdCameraFence();
             if (CollectionUtils.isEmpty(bdFenceInfos)) {
                 return;
             }
@@ -98,7 +96,8 @@ public class VideoTrailEngine extends EvtFusionEngine {
      */
     @Override
     public String getKey(LocationInfo msg) {
-        return BDConst.REDIS_KEY.FENCE_VIDEO_TRACE_KEY + msg.getMsg().getString("deviceId");
+        return String.format("%s-%s-%s", BDConst.REDIS_KEY.FENCE_VIDEO_TRACE_KEY, msg.getMsg().getString("tagId"),
+            msg.getMsg().getString("fenceId"));
     }
 
     @Override
@@ -108,24 +107,36 @@ public class VideoTrailEngine extends EvtFusionEngine {
 
     @Override
     public void newEvtCallback(LocationInfo msg) {
-        videoTraceSocketServer.sendMessage(msg.getMsg().getString("deviceId"), JSONObject.from(msg));
+        videoTraceSocketServer.sendMessage(msg.getMsg().getString("tagId"), JSONObject.from(msg));
     }
 
-    public void generateEvt(JSONObject msg, byte[] payload) {
-        List<BdFenceInfo> cacheList = redisService.getCacheList(BDConst.REDIS_KEY.FENCE_VIDEO_TRACE);
+    public void trailTag(JSONObject msg) {
+        List<VideoFence> cacheList = redisService.getCacheList(BDConst.REDIS_KEY.FENCE_VIDEO_TRACE);
         if (CollectionUtils.isEmpty(cacheList)) {
             return;
         }
         Polygon polygon;
         logger.debug("fence info size: {}", msg);
-        for (BdFenceInfo fenceInfo : cacheList) {
+        for (VideoFence fenceInfo : cacheList) {
             polygon = GeoUtils.getPolygon(fenceInfo.getPoly());
-            if (GeoUtils.isPointInGeoFence(polygon, msg.getString("longitude"), msg.getString("latitude"))) {
-                logger.debug("?>>>>>fence info size: {}", msg);
-                msg.put("fenceId", fenceInfo.getId());
-                msg.put("fenceName", fenceInfo.getDefenceName());
-                msg.put("videoId", fenceInfo.getLocationId());
-//                client.publish(BDConst.MQTT_TOPIC.EVT_ROOM_LOCATION_TOPIC, JSON.toJSONBytes(msg));
+            JSONObject properties = (JSONObject) JSONPath.eval(msg, "$.data.features.properties");
+            String tagId = properties.getString("tag_id");
+            if (GeoUtils.isPointInGeoFence(polygon, properties.getString("pos_x"), properties.getString("pos_y"))) {
+                logger.debug("?>>>>>fence info size: {}", properties);
+                JSONObject location = new JSONObject();
+                location.put("fenceId", fenceInfo.getId());
+                location.put("fenceName", fenceInfo.getDefenceName());
+                location.put("key", tagId);
+                location.put("srcTimestamp", DateTimeUtil.timestampMillis());
+                location.put("longitude", properties.getString("pos_x"));
+                location.put("latitude", properties.getString("pos_y"));
+                location.put("video", new HashMap<String, Object>() {
+                    {
+                        put("cameraName", fenceInfo.getCameraName());
+                        put("cameraStream", fenceInfo.getCameraStream());
+                    }
+                });
+                push(location);
                 break;
             }
         }

+ 12 - 2
bd-park/park-backend/park-application/src/main/java/com/huashe/park/application/mqtt/UWBLocationListener.java

@@ -1,6 +1,5 @@
 package com.huashe.park.application.mqtt;
 
-import com.huashe.park.application.engine.impl.VideoTrailEngine;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -9,6 +8,7 @@ import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
 import com.alibaba.fastjson2.JSON;
+import com.huashe.park.application.engine.impl.VideoTrailEngine;
 import com.huashe.park.application.web.core.config.MqttCfg;
 import com.huashe.park.common.consts.BDConst;
 
@@ -26,6 +26,9 @@ public class UWBLocationListener {
     @Autowired
     private MqttClientCreator mqttClientCreator;
 
+    @Autowired
+    private VideoTrailEngine videoTrailEngine;
+
     @EventListener
     public void onConnected(MqttConnectedEvent event) {
         logger.info("MqttConnectedEvent:{}", event);
@@ -36,6 +39,13 @@ public class UWBLocationListener {
         // 离线时更新重连时的密码,适用于类似阿里云 mqtt clientId 连接带时间戳的方式
         logger.info("MqttDisconnectEvent:{}", event);
         // 在断线时更新 clientId、username、password
-        mqttClientCreator.clientId("newClient" + System.currentTimeMillis()).username("newUserName").password("newPassword");
+        mqttClientCreator.clientId("newClient" + System.currentTimeMillis()).username("newUserName")
+            .password("newPassword");
+    }
+
+    @MqttClientSubscribe(value = BDConst.MQTT_TOPIC.UWB_VIDEO_TRACE_POINT_TOPIC, qos = MqttQoS.QOS0)
+    public void subQos1(String topic, byte[] payload) {
+        videoTrailEngine.trailTag(JSON.parseObject(payload));
+        logger.debug("topic:{} payload:{}", topic, JSON.parseObject(payload));
     }
 }

+ 64 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/mapper/BdCameraInfoMapper.java

@@ -0,0 +1,64 @@
+package com.huashe.park.core.mapper;
+
+import java.util.List;
+
+import com.huashe.park.domain.dto.VideoFence;
+import com.huashe.park.domain.entity.BdCameraInfo;
+
+/**
+ * 视频设备Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-01-21
+ */
+public interface BdCameraInfoMapper {
+    /**
+     * 查询视频设备
+     * 
+     * @param id 视频设备主键
+     * @return 视频设备
+     */
+    public BdCameraInfo selectBdCameraInfoById(Long id);
+
+    /**
+     * 查询视频设备列表
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 视频设备集合
+     */
+    public List<BdCameraInfo> selectBdCameraInfoList(BdCameraInfo bdCameraInfo);
+
+    /**
+     * 新增视频设备
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 结果
+     */
+    public int insertBdCameraInfo(BdCameraInfo bdCameraInfo);
+
+    /**
+     * 修改视频设备
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 结果
+     */
+    public int updateBdCameraInfo(BdCameraInfo bdCameraInfo);
+
+    /**
+     * 删除视频设备
+     * 
+     * @param id 视频设备主键
+     * @return 结果
+     */
+    public int deleteBdCameraInfoById(Long id);
+
+    /**
+     * 批量删除视频设备
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteBdCameraInfoByIds(Long[] ids);
+
+    public List<VideoFence> selectBdCameraFence();
+}

+ 66 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/IBdCameraInfoService.java

@@ -0,0 +1,66 @@
+package com.huashe.park.core.service;
+
+import com.huashe.park.domain.dto.VideoFence;
+import com.huashe.park.domain.entity.BdCameraInfo;
+
+import java.util.List;
+
+/**
+ * 视频设备Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-01-21
+ */
+public interface IBdCameraInfoService 
+{
+    /**
+     * 查询视频设备
+     * 
+     * @param id 视频设备主键
+     * @return 视频设备
+     */
+    public BdCameraInfo selectBdCameraInfoById(Long id);
+
+    /**
+     * 查询视频设备列表
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 视频设备集合
+     */
+    public List<BdCameraInfo> selectBdCameraInfoList(BdCameraInfo bdCameraInfo);
+
+    /**
+     * 新增视频设备
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 结果
+     */
+    public int insertBdCameraInfo(BdCameraInfo bdCameraInfo);
+
+    /**
+     * 修改视频设备
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 结果
+     */
+    public int updateBdCameraInfo(BdCameraInfo bdCameraInfo);
+
+    /**
+     * 批量删除视频设备
+     * 
+     * @param ids 需要删除的视频设备主键集合
+     * @return 结果
+     */
+    public int deleteBdCameraInfoByIds(Long[] ids);
+
+    /**
+     * 删除视频设备信息
+     * 
+     * @param id 视频设备主键
+     * @return 结果
+     */
+    public int deleteBdCameraInfoById(Long id);
+
+
+    public List<VideoFence> selectBdCameraFence();
+}

+ 94 - 0
bd-park/park-backend/park-core/src/main/java/com/huashe/park/core/service/impl/BdCameraInfoServiceImpl.java

@@ -0,0 +1,94 @@
+package com.huashe.park.core.service.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.huashe.park.core.mapper.BdCameraInfoMapper;
+import com.huashe.park.core.service.IBdCameraInfoService;
+import com.huashe.park.domain.dto.VideoFence;
+import com.huashe.park.domain.entity.BdCameraInfo;
+
+/**
+ * 视频设备Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-01-21
+ */
+@Service
+public class BdCameraInfoServiceImpl implements IBdCameraInfoService {
+    @Autowired
+    private BdCameraInfoMapper bdCameraInfoMapper;
+
+    /**
+     * 查询视频设备
+     * 
+     * @param id 视频设备主键
+     * @return 视频设备
+     */
+    @Override
+    public BdCameraInfo selectBdCameraInfoById(Long id) {
+        return bdCameraInfoMapper.selectBdCameraInfoById(id);
+    }
+
+    /**
+     * 查询视频设备列表
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 视频设备
+     */
+    @Override
+    public List<BdCameraInfo> selectBdCameraInfoList(BdCameraInfo bdCameraInfo) {
+        return bdCameraInfoMapper.selectBdCameraInfoList(bdCameraInfo);
+    }
+
+    /**
+     * 新增视频设备
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 结果
+     */
+    @Override
+    public int insertBdCameraInfo(BdCameraInfo bdCameraInfo) {
+        return bdCameraInfoMapper.insertBdCameraInfo(bdCameraInfo);
+    }
+
+    /**
+     * 修改视频设备
+     * 
+     * @param bdCameraInfo 视频设备
+     * @return 结果
+     */
+    @Override
+    public int updateBdCameraInfo(BdCameraInfo bdCameraInfo) {
+        return bdCameraInfoMapper.updateBdCameraInfo(bdCameraInfo);
+    }
+
+    /**
+     * 批量删除视频设备
+     * 
+     * @param ids 需要删除的视频设备主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBdCameraInfoByIds(Long[] ids) {
+        return bdCameraInfoMapper.deleteBdCameraInfoByIds(ids);
+    }
+
+    /**
+     * 删除视频设备信息
+     * 
+     * @param id 视频设备主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBdCameraInfoById(Long id) {
+        return bdCameraInfoMapper.deleteBdCameraInfoById(id);
+    }
+
+    @Override
+    public List<VideoFence> selectBdCameraFence() {
+        return bdCameraInfoMapper.selectBdCameraFence();
+    }
+}

+ 107 - 0
bd-park/park-backend/park-core/src/main/resources/mapper/bd/BdCameraInfoMapper.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huashe.park.core.mapper.BdCameraInfoMapper">
+
+    <resultMap type="BdCameraInfo" id="BdCameraInfoResult">
+        <result property="id" column="id"/>
+        <result property="cameraName" column="camera_name"/>
+        <result property="cameraStream" column="camera_stream"/>
+        <result property="liveStream" column="live_stream"/>
+        <result property="channelCode" column="channel_code"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateBy" column="update_by"/>
+    </resultMap>
+
+    <sql id="selectBdCameraInfoVo">
+        select id,
+               camera_name,
+               camera_stream,
+               live_stream,
+               channel_code,
+               update_time,
+               create_time,
+               create_by,
+               update_by
+        from bd_camera_info
+    </sql>
+
+    <select id="selectBdCameraInfoList" parameterType="BdCameraInfo" resultMap="BdCameraInfoResult">
+        <include refid="selectBdCameraInfoVo"/>
+        <where>
+            <if test="cameraName != null  and cameraName != ''">and camera_name like concat('%', #{cameraName}, '%')
+            </if>
+        </where>
+    </select>
+
+    <select id="selectBdCameraFence" resultType="VideoFence">
+        SELECT fence.id,
+               fence.defence_name,
+               ST_AsText(poly) poly,
+               camera.camera_name,
+               camera.camera_stream
+        FROM bd_fence_info fence
+                 INNER JOIN bd_camera_info camera ON fence.location_id = camera.id
+            AND fence.fence_type = 3
+    </select>
+
+    <select id="selectBdCameraInfoById" parameterType="Long" resultMap="BdCameraInfoResult">
+        <include refid="selectBdCameraInfoVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertBdCameraInfo" parameterType="BdCameraInfo" useGeneratedKeys="true" keyProperty="id">
+        insert into bd_camera_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="cameraName != null">camera_name,</if>
+            <if test="cameraStream != null">camera_stream,</if>
+            <if test="liveStream != null">live_stream,</if>
+            <if test="channelCode != null">channel_code,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="cameraName != null">#{cameraName},</if>
+            <if test="cameraStream != null">#{cameraStream},</if>
+            <if test="liveStream != null">#{liveStream},</if>
+            <if test="channelCode != null">#{channelCode},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+        </trim>
+    </insert>
+
+    <update id="updateBdCameraInfo" parameterType="BdCameraInfo">
+        update bd_camera_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="cameraName != null">camera_name = #{cameraName},</if>
+            <if test="cameraStream != null">camera_stream = #{cameraStream},</if>
+            <if test="liveStream != null">live_stream = #{liveStream},</if>
+            <if test="channelCode != null">channel_code = #{channelCode},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteBdCameraInfoById" parameterType="Long">
+        delete
+        from bd_camera_info
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteBdCameraInfoByIds" parameterType="String">
+        delete from bd_camera_info where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 49 - 0
bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/dto/VideoFence.java

@@ -1,4 +1,53 @@
 package com.huashe.park.domain.dto;
 
 public class VideoFence {
+    private Long id;
+
+    private String defenceName;
+
+    private String poly;
+
+    private String cameraName;
+
+    private String cameraStream;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getDefenceName() {
+        return defenceName;
+    }
+
+    public void setDefenceName(String defenceName) {
+        this.defenceName = defenceName;
+    }
+
+    public String getPoly() {
+        return poly;
+    }
+
+    public void setPoly(String poly) {
+        this.poly = poly;
+    }
+
+    public String getCameraName() {
+        return cameraName;
+    }
+
+    public void setCameraName(String cameraName) {
+        this.cameraName = cameraName;
+    }
+
+    public String getCameraStream() {
+        return cameraStream;
+    }
+
+    public void setCameraStream(String cameraStream) {
+        this.cameraStream = cameraStream;
+    }
 }

+ 97 - 0
bd-park/park-backend/park-domain/src/main/java/com/huashe/park/domain/entity/BdCameraInfo.java

@@ -0,0 +1,97 @@
+package com.huashe.park.domain.entity;
+
+import com.huashe.common.annotation.Excel;
+import com.huashe.common.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 视频设备对象 bd_camera_info
+ * 
+ * @author ruoyi
+ * @date 2025-01-21
+ */
+public class BdCameraInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 编号 */
+    private Long id;
+
+    /** 摄像机名称 */
+    @Excel(name = "摄像机名称")
+    private String cameraName;
+
+    /** 流地址 */
+    @Excel(name = "流地址")
+    private String cameraStream;
+
+    /** web直播流 */
+    @Excel(name = "web直播流")
+    private String liveStream;
+
+    /** 通道号 */
+    @Excel(name = "通道号")
+    private String channelCode;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setCameraName(String cameraName) 
+    {
+        this.cameraName = cameraName;
+    }
+
+    public String getCameraName() 
+    {
+        return cameraName;
+    }
+    public void setCameraStream(String cameraStream) 
+    {
+        this.cameraStream = cameraStream;
+    }
+
+    public String getCameraStream() 
+    {
+        return cameraStream;
+    }
+    public void setLiveStream(String liveStream) 
+    {
+        this.liveStream = liveStream;
+    }
+
+    public String getLiveStream() 
+    {
+        return liveStream;
+    }
+    public void setChannelCode(String channelCode) 
+    {
+        this.channelCode = channelCode;
+    }
+
+    public String getChannelCode() 
+    {
+        return channelCode;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("cameraName", getCameraName())
+            .append("cameraStream", getCameraStream())
+            .append("liveStream", getLiveStream())
+            .append("channelCode", getChannelCode())
+            .append("updateTime", getUpdateTime())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateBy", getUpdateBy())
+            .toString();
+    }
+}