648540858
2023-03-14 943f95ba8ce02f8088f2dfcfd83a60391a8a65a6
增加消息通道配置,可以通道redis在wvp上下级之间发送消息
16个文件已修改
1个文件已添加
1 文件已重命名
176 ■■■■ 已修改文件
sql/2.6.6-2.6.7更新.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/初始化.sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/all-application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/index.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/deviceEdit.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/platformEdit.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/2.6.6-2.6.7¸üÐÂ.sql
New file
@@ -0,0 +1,6 @@
alter table device
    add asMessageChannel int default 0;
alter table parent_platform
    add asMessageChannel int default 0;
sql/³õʼ»¯.sql
File was renamed from src/main/resources/db/migration/V2.6.7_20230201__³õʼ»¯.sql
@@ -47,6 +47,7 @@
                          `mobilePositionSubmissionInterval` int DEFAULT '5',
                          `subscribeCycleForAlarm` int DEFAULT NULL,
                          `ssrcCheck` int DEFAULT '0',
                          `asMessageChannel` int DEFAULT '0',
                          `geoCoordSys` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                          `treeType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                          `custom_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
@@ -329,6 +330,7 @@
                                   `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
                                   `ptz` int DEFAULT NULL,
                                   `rtcp` int DEFAULT NULL,
                                   `asMessageChannel` int DEFAULT '0',
                                   `status` bit(1) DEFAULT NULL,
                                   `startOfflinePush` int DEFAULT '0',
                                   `administrativeDivision` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
@@ -48,6 +48,7 @@
    private Boolean syncChannelOnDeviceOnline = Boolean.FALSE;
    private Boolean sipLog = Boolean.FALSE;
    private Boolean sendToPlatformsWhenIdLost = Boolean.FALSE;
    private String serverId = "000000";
@@ -218,4 +219,12 @@
    public void setSipLog(Boolean sipLog) {
        this.sipLog = sipLog;
    }
    public Boolean getSendToPlatformsWhenIdLost() {
        return sendToPlatformsWhenIdLost;
    }
    public void setSendToPlatformsWhenIdLost(Boolean sendToPlatformsWhenIdLost) {
        this.sendToPlatformsWhenIdLost = sendToPlatformsWhenIdLost;
    }
}
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
@@ -188,6 +188,9 @@
    @Schema(description = "SIP交互IP(设备访问平台的IP)")
    private String localIp;
    @Schema(description = "是否作为消息通道")
    private boolean asMessageChannel;
    public String getDeviceId() {
        return deviceId;
@@ -428,4 +431,12 @@
    public void setKeepaliveIntervalTime(int keepaliveIntervalTime) {
        this.keepaliveIntervalTime = keepaliveIntervalTime;
    }
    public boolean isAsMessageChannel() {
        return asMessageChannel;
    }
    public void setAsMessageChannel(boolean asMessageChannel) {
        this.asMessageChannel = asMessageChannel;
    }
}
src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
@@ -189,6 +189,9 @@
    @Schema(description = "树类型 å›½æ ‡è§„定了两种树的展现方式 è¡Œæ”¿åŒºåˆ’ CivilCode å’Œä¸šåŠ¡åˆ†ç»„:BusinessGrou")
    private String treeType;
    @Schema(description = "是否作为消息通道")
    private boolean asMessageChannel;
    public Integer getId() {
        return id;
    }
@@ -428,4 +431,12 @@
    public void setTreeType(String treeType) {
        this.treeType = treeType;
    }
    public boolean isAsMessageChannel() {
        return asMessageChannel;
    }
    public void setAsMessageChannel(boolean asMessageChannel) {
        this.asMessageChannel = asMessageChannel;
    }
}
src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
@@ -1,6 +1,8 @@
package com.genersoft.iot.vmp.gb28181.bean;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.Instant;
import java.util.List;
@@ -9,22 +11,29 @@
 * @author: swwheihei
 * @date:   2020å¹´5月8日 ä¸‹åˆ2:05:56     
 */
@Schema(description = "设备录像查询结果信息")
public class RecordInfo {
    @Schema(description = "设备编号")
    private String deviceId;
    @Schema(description = "通道编号")
    private String channelId;
    @Schema(description = "命令序列号")
    private String sn;
    @Schema(description = "设备名称")
    private String name;
    @Schema(description = "列表总数")
    private int sumNum;
    private int count;
    private Instant lastTime;
    @Schema(description = "")
    private List<RecordItem> recordList;
    public String getDeviceId() {
src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java
@@ -2,9 +2,9 @@
import com.genersoft.iot.vmp.utils.DateUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import org.jetbrains.annotations.NotNull;
import java.text.ParseException;
import java.time.Instant;
import java.time.temporal.TemporalAccessor;
@@ -13,26 +13,37 @@
 * @author: swwheihei
 * @date:   2020å¹´5月8日 ä¸‹åˆ2:06:54     
 */
@Schema(description = "设备录像详情")
public class RecordItem  implements Comparable<RecordItem>{
    @Schema(description = "设备编号")
    private String deviceId;
    @Schema(description = "名称")
    private String name;
    @Schema(description = "文件路径名 (可选)")
    private String filePath;
    @Schema(description = "录像文件大小,单位:Byte(可选)")
    private String fileSize;
    @Schema(description = "录像地址(可选)")
    private String address;
    @Schema(description = "录像开始时间(可选)")
    private String startTime;
    @Schema(description = "录像结束时间(可选)")
    private String endTime;
    @Schema(description = "保密属性(必选)缺省为0;0:不涉密,1:涉密")
    private int secrecy;
    @Schema(description = "录像产生类型(可选)time或alarm æˆ– manua")
    private String type;
    @Schema(description = "录像触发者ID(可选)")
    private String recorderId;
    public String getDeviceId() {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -1376,7 +1376,7 @@
        if (device == null) {
            return;
        }
        logger.info("[发送 æŠ¥è­¦é€šçŸ¥] {}/{}->{},{}", device.getDeviceId(), deviceAlarm.getChannelId(),
        logger.info("[发送报警通知]设备: {}/{}->{},{}", device.getDeviceId(), deviceAlarm.getChannelId(),
                deviceAlarm.getLongitude(), deviceAlarm.getLatitude());
        String characterSet = device.getCharset();
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -402,7 +402,7 @@
        if (parentPlatform == null) {
            return;
        }
        logger.info("[发送报警通知] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(),
        logger.info("[发送报警通知]平台: {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(),
                deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSON.toJSONString(deviceAlarm));
        String characterSet = parentPlatform.getCharacterSet();
        StringBuffer deviceStatusXml = new StringBuffer(600);
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java
@@ -1,6 +1,7 @@
package com.genersoft.iot.vmp.service.redisMsg;
import com.alibaba.fastjson2.JSON;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
@@ -44,8 +45,12 @@
    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;
    @Autowired
    private UserSetting userSetting;
    @Override
    public void onMessage(@NotNull Message message, byte[] bytes) {
        // æ¶ˆæ¯ç¤ºä¾‹ï¼š  PUBLISH alarm_receive '{ "gbId": "", "alarmSn": 1, "alarmType": "111", "alarmDescription": "222", }'
        logger.info("收到来自REDIS的ALARM通知: {}", new String(message.getBody()));
        boolean isEmpty = taskQueue.isEmpty();
        taskQueue.offer(message);
@@ -74,17 +79,44 @@
                        deviceAlarm.setLatitude(0);
                        if (ObjectUtils.isEmpty(gbId)) {
                            // å‘送给所有的上级
                            List<ParentPlatform> parentPlatforms = storage.queryEnableParentPlatformList(true);
                            if (parentPlatforms.size() > 0) {
                                for (ParentPlatform parentPlatform : parentPlatforms) {
                            if (userSetting.getSendToPlatformsWhenIdLost()) {
                                // å‘送给所有的上级
                                List<ParentPlatform> parentPlatforms = storage.queryEnableParentPlatformList(true);
                                if (parentPlatforms.size() > 0) {
                                    for (ParentPlatform parentPlatform : parentPlatforms) {
                                        try {
                                            commanderForPlatform.sendAlarmMessage(parentPlatform, deviceAlarm);
                                        } catch (SipException | InvalidArgumentException | ParseException e) {
                                            logger.error("[命令发送失败] å›½æ ‡çº§è” å‘送报警: {}", e.getMessage());
                                        }
                                    }
                                }
                            }else {
                                // èŽ·å–å¼€å¯äº†æ¶ˆæ¯æŽ¨é€çš„è®¾å¤‡å’Œå¹³å°
                                List<ParentPlatform> parentPlatforms = storage.queryEnablePlatformListWithAsMessageChannel();
                                if (parentPlatforms.size() > 0) {
                                    for (ParentPlatform parentPlatform : parentPlatforms) {
                                        try {
                                            commanderForPlatform.sendAlarmMessage(parentPlatform, deviceAlarm);
                                        } catch (SipException | InvalidArgumentException | ParseException e) {
                                            logger.error("[命令发送失败] å›½æ ‡çº§è” å‘送报警: {}", e.getMessage());
                                        }
                                    }
                                }
                            }
                            // èŽ·å–å¼€å¯äº†æ¶ˆæ¯æŽ¨é€çš„è®¾å¤‡å’Œå¹³å°
                            List<Device> devices = storage.queryDeviceWithAsMessageChannel();
                            if (devices.size() > 0) {
                                for (Device device : devices) {
                                    try {
                                        commanderForPlatform.sendAlarmMessage(parentPlatform, deviceAlarm);
                                    } catch (SipException | InvalidArgumentException | ParseException e) {
                                        logger.error("[命令发送失败] å›½æ ‡çº§è” å‘送报警: {}", e.getMessage());
                                        commander.sendAlarmMessage(device, deviceAlarm);
                                    } catch (InvalidArgumentException | SipException | ParseException e) {
                                        logger.error("[命令发送失败] å‘送报警: {}", e.getMessage());
                                    }
                                }
                            }
                        }else {
                            Device device = storage.queryVideoDevice(gbId);
                            ParentPlatform platform = storage.queryParentPlatByServerGBId(gbId);
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java
@@ -378,4 +378,7 @@
    List<DeviceChannelExtend> queryChannelsByDeviceId(String serial, List<String> channelIds, Boolean online);
    List<ParentPlatform> queryEnablePlatformListWithAsMessageChannel();
    List<Device> queryDeviceWithAsMessageChannel();
}
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
@@ -39,6 +39,7 @@
            "mobilePositionSubmissionInterval," +
            "subscribeCycleForAlarm," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online" +
@@ -70,6 +71,7 @@
                "mobilePositionSubmissionInterval," +
                "subscribeCycleForAlarm," +
                "ssrcCheck," +
                "asMessageChannel," +
                "geoCoordSys," +
                "treeType," +
                "online" +
@@ -98,6 +100,7 @@
                "#{mobilePositionSubmissionInterval}," +
                "#{subscribeCycleForAlarm}," +
                "#{ssrcCheck}," +
                "#{asMessageChannel}," +
                "#{geoCoordSys}," +
                "#{treeType}," +
                "#{online}" +
@@ -152,6 +155,7 @@
            "mobilePositionSubmissionInterval," +
            "subscribeCycleForAlarm," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online," +
@@ -192,6 +196,7 @@
            "mobilePositionSubmissionInterval," +
            "subscribeCycleForAlarm," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online " +
@@ -222,6 +227,7 @@
            "mobilePositionSubmissionInterval," +
            "subscribeCycleForAlarm," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online" +
@@ -243,6 +249,7 @@
            "<if test=\"mobilePositionSubmissionInterval != null\">, mobilePositionSubmissionInterval=#{mobilePositionSubmissionInterval}</if>" +
            "<if test=\"subscribeCycleForAlarm != null\">, subscribeCycleForAlarm=#{subscribeCycleForAlarm}</if>" +
            "<if test=\"ssrcCheck != null\">, ssrcCheck=#{ssrcCheck}</if>" +
            "<if test=\"asMessageChannel != null\">, asMessageChannel=#{asMessageChannel}</if>" +
            "<if test=\"geoCoordSys != null\">, geoCoordSys=#{geoCoordSys}</if>" +
            "<if test=\"treeType != null\">, treeType=#{treeType}</if>" +
            "<if test=\"mediaServerId != null\">, mediaServerId=#{mediaServerId}</if>" +
@@ -259,6 +266,7 @@
            "updateTime," +
            "charset," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online" +
@@ -271,6 +279,7 @@
            "#{updateTime}," +
            "#{charset}," +
            "#{ssrcCheck}," +
            "#{asMessageChannel}," +
            "#{geoCoordSys}," +
            "#{treeType}," +
            "#{online}" +
@@ -282,4 +291,7 @@
    @Select("select * from device")
    List<Device> getAll();
    @Select("select * from device where  asMessageChannel = 1")
    List<Device> queryDeviceWithAsMessageChannel();
}
src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
@@ -15,10 +15,10 @@
public interface ParentPlatformMapper {
    @Insert("INSERT INTO parent_platform (enable, name, serverGBId, serverGBDomain, serverIP, serverPort, deviceGBId, deviceIp,  " +
            "            devicePort, username, password, expires, keepTimeout, transport, characterSet, ptz, rtcp, " +
            "            devicePort, username, password, expires, keepTimeout, transport, characterSet, ptz, rtcp, asMessageChannel, " +
            "            status, startOfflinePush, catalogId, administrativeDivision, catalogGroup, createTime, updateTime, treeType) " +
            "            VALUES (#{enable}, #{name}, #{serverGBId}, #{serverGBDomain}, #{serverIP}, #{serverPort}, #{deviceGBId}, #{deviceIp}, " +
            "            #{devicePort}, #{username}, #{password}, #{expires}, #{keepTimeout}, #{transport}, #{characterSet}, #{ptz}, #{rtcp}, " +
            "            #{devicePort}, #{username}, #{password}, #{expires}, #{keepTimeout}, #{transport}, #{characterSet}, #{ptz}, #{rtcp}, #{asMessageChannel}, " +
            "            #{status},  #{startOfflinePush}, #{catalogId}, #{administrativeDivision}, #{catalogGroup}, #{createTime}, #{updateTime}, #{treeType})")
    int addParentPlatform(ParentPlatform parentPlatform);
@@ -40,6 +40,7 @@
            "characterSet=#{characterSet}, " +
            "ptz=#{ptz}, " +
            "rtcp=#{rtcp}, " +
            "asMessageChannel=#{asMessageChannel}, " +
            "status=#{status}, " +
            "startOfflinePush=#{startOfflinePush}, " +
            "catalogGroup=#{catalogGroup}, " +
@@ -68,9 +69,12 @@
            "FROM parent_platform pp ")
    List<ParentPlatform> getParentPlatformList();
    @Select("SELECT * FROM parent_platform WHERE enable=#{enable}")
    @Select("SELECT * FROM parent_platform WHERE enable=#{enable} ")
    List<ParentPlatform> getEnableParentPlatformList(boolean enable);
    @Select("SELECT * FROM parent_platform WHERE enable=1 and asMessageChannel = 1")
    List<ParentPlatform> queryEnablePlatformListWithAsMessageChannel();
    @Select("SELECT * FROM parent_platform WHERE serverGBId=#{platformGbId}")
    ParentPlatform getParentPlatByServerGBId(String platformGbId);
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
@@ -525,6 +525,16 @@
    }
    @Override
    public List<ParentPlatform> queryEnablePlatformListWithAsMessageChannel() {
        return platformMapper.queryEnablePlatformListWithAsMessageChannel();
    }
    @Override
    public List<Device> queryDeviceWithAsMessageChannel() {
        return deviceMapper.queryDeviceWithAsMessageChannel();
    }
    @Override
    public void outlineForAllParentPlatform() {
        platformMapper.outlineForAllParentPlatform();
    }
src/main/resources/all-application.yml
@@ -199,8 +199,8 @@
    sip-use-source-ip-as-remote-address: false
    # æ˜¯å¦å¼€å¯sip日志
    sip-log: true
    # è‡ªåŠ¨æ•°æ®åº“å‡çº§ï¼Œä¿è¯è¡¨ç»“æž„å®Œæ•´
    sync-db: true
    # æ¶ˆæ¯é€šé“功能-缺少国标ID是否给所有上级发送消息
    send-to-platforms-when-id-lost: true
# å…³é—­åœ¨çº¿æ–‡æ¡£ï¼ˆç”Ÿäº§çŽ¯å¢ƒå»ºè®®å…³é—­ï¼‰
springdoc:
web_src/index.html
@@ -15,5 +15,6 @@
    <script type="text/javascript" src="./static/js/ZLMRTCClient.js"></script>
    <script type="text/javascript" src="./static/js/config.js"></script>
    <div id="app"></div>
  </body>
</html>
web_src/src/components/dialog/deviceEdit.vue
@@ -66,6 +66,7 @@
          </el-form-item>
          <el-form-item label="其他选项">
            <el-checkbox label="SSRC校验" v-model="form.ssrcCheck" style="float: left"></el-checkbox>
            <el-checkbox label="作为消息通道" v-model="form.asMessageChannel" style="float: left"></el-checkbox>
          </el-form-item>
          <el-form-item>
            <div style="float: right;">
web_src/src/components/dialog/platformEdit.vue
@@ -96,9 +96,10 @@
              </el-form-item>
              <el-form-item label="其他选项">
                <el-checkbox label="启用" v-model="platform.enable" @change="checkExpires"></el-checkbox>
                <el-checkbox label="云台控制" v-model="platform.ptz"></el-checkbox>
<!--                <el-checkbox label="云台控制" v-model="platform.ptz"></el-checkbox>-->
                <el-checkbox label="拉起离线推流" v-model="platform.startOfflinePush"></el-checkbox>
                <el-checkbox label="RTCP保活" v-model="platform.rtcp" @change="rtcpCheckBoxChange"></el-checkbox>
                <el-checkbox label="作为消息通道" v-model="platform.asMessageChannel" ></el-checkbox>
              </el-form-item>
              <el-form-item>
                <el-button type="primary" @click="onSubmit">{{
@@ -145,6 +146,7 @@
        enable: true,
        ptz: true,
        rtcp: false,
        asMessageChannel: false,
        name: null,
        serverGBId: null,
        serverGBDomain: null,
@@ -213,6 +215,7 @@
        this.platform.enable = platform.enable;
        this.platform.ptz = platform.ptz;
        this.platform.rtcp = platform.rtcp;
        this.platform.rtcpasMessageChannel = platform.asMessageChannel;
        this.platform.name = platform.name;
        this.platform.serverGBId = platform.serverGBId;
        this.platform.serverGBDomain = platform.serverGBDomain;
@@ -290,6 +293,7 @@
        enable: true,
        ptz: true,
        rtcp: false,
        asMessageChannel: false,
        name: null,
        serverGBId: null,
        administrativeDivision: null,