648540858
2021-12-07 9b1af8ef1396de45884fe86c56844714045b82ec
适配zlm的hook保活
26个文件已修改
1个文件已添加
310 ■■■■ 已修改文件
sql/mysql.sql 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMEventAbstract.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java 93 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/wvp.sqlite 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/genersoft/iot/vmp/service/impl/RoleServiceImplTest.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/genersoft/iot/vmp/service/impl/UserServiceImplTest.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql.sql
@@ -148,6 +148,7 @@
    defaultServer           int          not null,
    createTime              varchar(50)  not null,
    updateTime              varchar(50)  not null,
    hookAliveInterval        int          not null,
    constraint media_server_i
        unique (ip, httpPort)
);
src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -10,10 +10,12 @@
    
    public static final String WVP_SERVER_PREFIX = "VMP_SIGNALLING_SERVER_INFO_";
    public static final String WVP_SERVER_STREAM_PUSH_PREFIX = "VMP_SIGNALLING_STREAM_";
    public static final String WVP_SERVER_STREAM_PREFIX = "VMP_SIGNALLING_STREAM_";
    public static final String MEDIA_SERVER_PREFIX = "VMP_MEDIA_SERVER_";
    public static final String MEDIA_SERVER_KEEPALIVE_PREFIX = "VMP_MEDIA_SERVER_KEEPALIVE_";
    public static final String MEDIA_SERVERS_ONLINE_PREFIX = "VMP_MEDIA_ONLINE_SERVERS_";
    public static final String MEDIA_STREAM_PREFIX = "VMP_MEDIA_STREAM";
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
@@ -203,6 +203,7 @@
        mediaServerItem.setRtpPortRange(rtpPortRange);
        mediaServerItem.setSendRtpPortRange(sendRtpPortRange);
        mediaServerItem.setRecordAssistPort(recordAssistPort);
        mediaServerItem.setHookAliveInterval(120);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mediaServerItem.setCreateTime(format.format(System.currentTimeMillis()));
src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java
@@ -27,7 +27,7 @@
    Integer keepaliveTimeOut = 255;
    Integer registerTimeInterval = 60;
    Integer registerTimeInterval = 120;
    private boolean alarm = false;
src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
@@ -1,15 +1,16 @@
package com.genersoft.iot.vmp.gb28181.event;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.event.offline.OfflineEvent;
import com.genersoft.iot.vmp.gb28181.event.platformKeepaliveExpire.PlatformKeepaliveExpireEvent;
import com.genersoft.iot.vmp.gb28181.event.platformNotRegister.PlatformNotRegisterEvent;
import com.genersoft.iot.vmp.media.zlm.event.ZLMOfflineEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
import com.genersoft.iot.vmp.gb28181.event.alarm.AlarmEvent;
import com.genersoft.iot.vmp.gb28181.event.offline.OfflineEvent;
import com.genersoft.iot.vmp.gb28181.event.online.OnlineEvent;
/**    
@@ -66,5 +67,11 @@
        alarmEvent.setAlarmInfo(deviceAlarm);
        applicationEventPublisher.publishEvent(alarmEvent);
    }
    public void zlmOfflineEventPublish(String mediaServerId){
        ZLMOfflineEvent outEvent = new ZLMOfflineEvent(this);
        outEvent.setMediaServerId(mediaServerId);
        applicationEventPublisher.publishEvent(outEvent);
    }
    
}
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -359,8 +359,8 @@
                                type = "PULL";
                            }
                        }
                        zlmMediaListManager.removeMedia( app, streamId);
                        redisCatchStorage.removeStream(mediaServerItem, OriginType.values()[item.getOriginType()].getType(), app, streamId);
                        zlmMediaListManager.removeMedia(app, streamId);
                        redisCatchStorage.removeStream(mediaServerItem, type, app, streamId);
                    }
                    // 发送流变化redis消息
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
@@ -7,6 +7,7 @@
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.service.IStreamProxyService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -40,6 +41,9 @@
    private IMediaServerService mediaServerService;
    @Autowired
    private IRedisCatchStorage redisCatchStorage;
    @Autowired
    private MediaConfig mediaConfig;
    @Qualifier("taskExecutor")
@@ -70,8 +74,14 @@
            }
        });
        // TODO 订阅 zlm保活事件, 当zlm离线时做业务的处理
        // 订阅 zlm保活事件, 当zlm离线时做业务的处理
        hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_keepalive,null,
                (MediaServerItem mediaServerItem, JSONObject response)->{
                    String mediaServerId = response.getString("mediaServerId");
                    if (mediaServerId !=null ) {
                        mediaServerService.updateMediaServerKeepalive(mediaServerId, response.getJSONObject("data"));
                    }
                });
        // 获取zlm信息
        logger.info("等待默认zlm接入...");
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java
@@ -65,6 +65,9 @@
    @JSONField(name = "hook.admin_params")
    private String hookAdminParams;
    @JSONField(name = "hook.alive_interval")
    private int hookAliveInterval;
    @JSONField(name = "hook.enable")
    private String hookEnable;
@@ -791,4 +794,12 @@
    public void setShellPhell(String shellPhell) {
        this.shellPhell = shellPhell;
    }
    public int getHookAliveInterval() {
        return hookAliveInterval;
    }
    public void setHookAliveInterval(int hookAliveInterval) {
        this.hookAliveInterval = hookAliveInterval;
    }
}
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
@@ -39,6 +39,8 @@
    private int streamNoneReaderDelayMS;
    private int hookAliveInterval;
    private boolean rtpEnable;
    private boolean status;
@@ -87,6 +89,7 @@
        autoConfig = true; // 默认值true;
        secret = zlmServerConfig.getApiSecret();
        streamNoneReaderDelayMS = zlmServerConfig.getGeneralStreamNoneReaderDelayMS();
        hookAliveInterval = zlmServerConfig.getHookAliveInterval();
        rtpEnable = false; // 默认使用单端口;直到用户自己设置开启多端口
        rtpPortRange = "30000,30500"; // 默认使用30000,30500作为级联时发送流的端口号
        sendRtpPortRange = "30000,30500"; // 默认使用30000,30500作为级联时发送流的端口号
@@ -309,4 +312,12 @@
    public void setSendRtpPortRange(String sendRtpPortRange) {
        this.sendRtpPortRange = sendRtpPortRange;
    }
    public int getHookAliveInterval() {
        return hookAliveInterval;
    }
    public void setHookAliveInterval(int hookAliveInterval) {
        this.hookAliveInterval = hookAliveInterval;
    }
}
src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMEventAbstract.java
New file
@@ -0,0 +1,25 @@
package com.genersoft.iot.vmp.media.zlm.event;
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
import org.springframework.context.ApplicationEvent;
public abstract class ZLMEventAbstract extends ApplicationEvent {
    private static final long serialVersionUID = 1L;
    private String mediaServerId;
    public ZLMEventAbstract(Object source) {
        super(source);
    }
    public String getMediaServerId() {
        return mediaServerId;
    }
    public void setMediaServerId(String mediaServerId) {
        this.mediaServerId = mediaServerId;
    }
}
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
@@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.service;
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
@@ -29,6 +30,13 @@
     * @return
     */
    void zlmServerOnline(ZLMServerConfig zlmServerConfig);
    /**
     * 节点离线
     * @param mediaServerId
     * @return
     */
    void zlmServerOffline(String mediaServerId);
    MediaServerItem getMediaServerForMinimumLoad();
@@ -67,4 +75,6 @@
    void delete(String id);
    MediaServerItem getDefaultMediaServer();
    void updateMediaServerKeepalive(String zlmServerConfig, JSONObject data);
}
src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
@@ -73,4 +74,19 @@
     * @return
     */
    StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId);
    /**
     * 新的节点加入
     * @param zlmServerConfig
     * @return
     */
    void zlmServerOnline(ZLMServerConfig zlmServerConfig);
    /**
     * 节点离线
     * @param mediaServerId
     * @return
     */
    void zlmServerOffline(String mediaServerId);
}
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -1,6 +1,7 @@
package com.genersoft.iot.vmp.service;
import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
@@ -46,4 +47,18 @@
     */
    boolean stop(String app, String streamId);
    /**
     * 新的节点加入
     * @param zlmServerConfig
     * @return
     */
    void zlmServerOnline(ZLMServerConfig zlmServerConfig);
    /**
     * 节点离线
     * @param mediaServerId
     * @return
     */
    void zlmServerOffline(String mediaServerId);
}
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -97,6 +97,7 @@
            if (!redisUtil.hasKey(key)) {
                redisUtil.set(key, mediaServerItem);
            }
        }
    }
@@ -272,6 +273,7 @@
        WVPResult<String> result = new WVPResult<>();
        mediaServerItem.setCreateTime(this.format.format(System.currentTimeMillis()));
        mediaServerItem.setUpdateTime(this.format.format(System.currentTimeMillis()));
        mediaServerItem.setHookAliveInterval(120);
        JSONObject responseJSON = zlmresTfulUtils.getMediaServerConfig(mediaServerItem);
        if (responseJSON != null) {
            JSONArray data = responseJSON.getJSONArray("data");
@@ -329,6 +331,7 @@
            logger.warn("[未注册的zlm] 拒接接入:来自{}:{}", zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() );
            return;
        }
        serverItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval());
        if (serverItem.getHttpPort() == 0) {
            serverItem.setHttpPort(zlmServerConfig.getHttpPort());
        }
@@ -352,85 +355,29 @@
        }
        if (StringUtils.isEmpty(serverItem.getId())) {
            serverItem.setId(zlmServerConfig.getGeneralMediaServerId());
        }
        serverItem.setStatus(true);
        if (StringUtils.isEmpty(serverItem.getId())) {
            serverItem.setId(zlmServerConfig.getGeneralMediaServerId());
            mediaServerMapper.updateByHostAndPort(serverItem);
        }else {
            mediaServerMapper.update(serverItem);
        }
        if (redisUtil.get(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + serverItem.getId()) == null) {
        String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + serverItem.getId();
        if (redisUtil.get(key) == null) {
            SsrcConfig ssrcConfig = new SsrcConfig(serverItem.getId(), null, sipConfig.getDomain());
            serverItem.setSsrcConfig(ssrcConfig);
            redisUtil.set(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + serverItem.getId(), serverItem);
            redisUtil.set(key, serverItem);
        }
        serverItem.setStatus(true);
        resetOnlineServerItem(serverItem);
        updateMediaServerKeepalive(serverItem.getId(), null);
        setZLMConfig(serverItem);
    }
//        if (zlmServerConfig.getGeneralMediaServerId().equals(mediaConfig.getId())
//                || (zlmServerConfig.getIp().equals(mediaConfig.getIp()) && zlmServerConfig.getHttpPort() == mediaConfig.getHttpPort())) {
//            // 配置文件的zlm
//            // 如果是配置文件中的zlm。 也就是默认zlm。 一切以配置文件内容为准
//            // wvp互惠修改zlm的端口,需要自行配置。
//            MediaServerItem serverItemFromConfig = mediaConfig.getMediaSerItem();
//            serverItemFromConfig.setId(zlmServerConfig.getGeneralMediaServerId());
//            if (mediaConfig.getHttpPort() == 0) {
//                serverItemFromConfig.setHttpPort(zlmServerConfig.getHttpPort());
//            }
//            if (mediaConfig.getHttpSSlPort() == 0) {
//                serverItemFromConfig.setHttpSSlPort(zlmServerConfig.getHttpSSLport());
//            }
//            if (mediaConfig.getRtmpPort() == 0) {
//                serverItemFromConfig.setRtmpPort(zlmServerConfig.getRtmpPort());
//            }
//            if (mediaConfig.getRtmpSSlPort() == 0) {
//                serverItemFromConfig.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort());
//            }
//            if (mediaConfig.getRtspPort() == 0) {
//                serverItemFromConfig.setRtspPort(zlmServerConfig.getRtspPort());
//            }
//            if (mediaConfig.getRtspSSLPort() == 0) {
//                serverItemFromConfig.setRtspSSLPort(zlmServerConfig.getRtspSSlport());
//            }
//            if (mediaConfig.getRtpProxyPort() == 0) {
//                serverItemFromConfig.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
//            }
//            if (serverItem != null){
//                mediaServerMapper.delDefault();
//                mediaServerMapper.add(serverItemFromConfig);
//                String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();
//                MediaServerItem serverItemInRedis =  (MediaServerItem)redisUtil.get(key);
//                if (serverItemInRedis != null) {
//                    serverItemFromConfig.setSsrcConfig(serverItemInRedis.getSsrcConfig());
//                }else {
//                    serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));
//                }
//                redisUtil.set(key, serverItemFromConfig);
//            }else {
//                String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();
//                serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));
//                redisUtil.set(key, serverItemFromConfig);
//                mediaServerMapper.add(serverItemFromConfig);
//            }
//            resetOnlineServerItem(serverItemFromConfig);
//            setZLMConfig(serverItemFromConfig);
//        }
        // 移除未添加的zlm的接入,所有的zlm必须先添加后才可以加入使用
//        else {
//            String now = this.format.format(System.currentTimeMillis());
//            if (serverItem == null){
//                    // 一个新的zlm接入wvp
//                    serverItem = new MediaServerItem(zlmServerConfig, sipConfig.getIp());
//                    serverItem.setCreateTime(now);
//                    serverItem.setUpdateTime(now);
//                String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItem.getId();
//                serverItem.setSsrcConfig(new SsrcConfig(serverItem.getId(), null, sipConfig.getDomain()));
//                redisUtil.set(key, serverItem);
//                // 存入数据库
//                mediaServerMapper.add(serverItem);
//                setZLMConfig(serverItem);
//            }
//            resetOnlineServerItem(serverItem);
//        }
    @Override
    public void zlmServerOffline(String mediaServerId) {
        delete(mediaServerId);
    }
    @Override
@@ -611,9 +558,17 @@
    @Override
    public void delete(String id) {
        redisUtil.zRemove(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId() + "_", id);
        redisUtil.zRemove(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(), id);
        String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + id;
        redisUtil.del(key);
        mediaServerMapper.delOne(id);
    }
    @Override
    public void updateMediaServerKeepalive(String mediaServerId, JSONObject data) {
        MediaServerItem mediaServerItem = getOne(mediaServerId);
        String key = VideoManagerConstants.MEDIA_SERVER_KEEPALIVE_PREFIX + userSetup.getServerId() + "_" + mediaServerId;
        int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2;
        redisUtil.set(key, data, hookAliveInterval);
    }
}
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
@@ -5,6 +5,7 @@
import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
@@ -49,6 +50,9 @@
    @Autowired
    private StreamProxyMapper streamProxyMapper;
    @Autowired
    private IRedisCatchStorage redisCatchStorage;
    @Autowired
    private GbStreamMapper gbStreamMapper;
@@ -249,4 +253,20 @@
    public StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId) {
        return videoManagerStorager.getStreamProxyByAppAndStream(app, streamId);
    }
    @Override
    public void zlmServerOnline(ZLMServerConfig zlmServerConfig) {
    }
    @Override
    public void zlmServerOffline(String mediaServerId) {
        // 移除开启了无人观看自动移除的流
        streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId);
        // 其他的流设置未启用
        streamProxyMapper.updateStatus(false, mediaServerId);
        // 移除redis内流的信息
        redisCatchStorage.removeStream(mediaServerId, "PULL");
    }
}
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -5,6 +5,7 @@
import com.alibaba.fastjson.TypeReference;
import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
@@ -135,4 +136,18 @@
        return true;
    }
    @Override
    public void zlmServerOnline(ZLMServerConfig zlmServerConfig) {
        // 似乎没啥需要做的
    }
    @Override
    public void zlmServerOffline(String mediaServerId) {
        // 移除没有serverId的推流
        streamPushMapper.deleteWithoutGBId(mediaServerId);
        // 其他的流设置未启用
        gbStreamMapper.updateStatusByMediaServerId(mediaServerId, false);
        // 移除redis内流的信息
        redisCatchStorage.removeStream(mediaServerId, "PUSH");
    }
}
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -146,6 +146,13 @@
     */
    void removeStream(MediaServerItem mediaServerItem, String type, String app, String streamId);
    /**
     * 移除流信息从redis
     * @param mediaServerId
     */
    void removeStream(String mediaServerId, String type);
    /**
     * 开始下载录像时存入
     * @param streamInfo
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -422,4 +422,5 @@
     * @return
     */
    StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId);
}
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
@@ -60,4 +60,9 @@
    @Select("SELECT gs.*, pgs.platformId FROM gb_stream gs LEFT JOIN  platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream WHERE mediaServerId=#{mediaServerId} ")
    List<GbStream> selectAllByMediaServerId(String mediaServerId);
    @Update("UPDATE gb_stream " +
            "SET status=${status} " +
            "WHERE mediaServerId=#{mediaServerId} ")
    void updateStatusByMediaServerId(String mediaServerId, boolean status);
}
src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java
@@ -36,7 +36,8 @@
            "recordAssistPort, " +
            "defaultServer, " +
            "createTime, " +
            "updateTime" +
            "updateTime, " +
            "hookAliveInterval" +
            ") VALUES " +
            "(" +
            "'${id}', " +
@@ -60,7 +61,8 @@
            "${recordAssistPort}, " +
            "${defaultServer}, " +
            "'${createTime}', " +
            "'${updateTime}')")
            "'${updateTime}', " +
            "${hookAliveInterval})")
    int add(MediaServerItem mediaServerItem);
    @Update(value = {" <script>" +
@@ -84,6 +86,7 @@
            "<if test=\"sendRtpPortRange != null\">, sendRtpPortRange='${sendRtpPortRange}'</if>" +
            "<if test=\"secret != null\">, secret='${secret}'</if>" +
            "<if test=\"recordAssistPort != null\">, recordAssistPort=${recordAssistPort}</if>" +
            "<if test=\"hookAliveInterval != null\">, hookAliveInterval=${hookAliveInterval}</if>" +
            "WHERE id='${id}'"+
            " </script>"})
    int update(MediaServerItem mediaServerItem);
@@ -108,6 +111,7 @@
            "<if test=\"sendRtpPortRange != null\">, sendRtpPortRange='${sendRtpPortRange}'</if>" +
            "<if test=\"secret != null\">, secret='${secret}'</if>" +
            "<if test=\"recordAssistPort != null\">, recordAssistPort=${recordAssistPort}</if>" +
            "<if test=\"hookAliveInterval != null\">, hookAliveInterval=${hookAliveInterval}</if>" +
            "WHERE ip='${ip}' and httpPort=${httpPort}"+
            " </script>"})
    int updateByHostAndPort(MediaServerItem mediaServerItem);
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java
@@ -51,4 +51,17 @@
            "LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " +
            "WHERE st.enable=${enable} and st.mediaServerId = '${id}' order by st.createTime desc")
    List<StreamProxyItem> selectForEnableInMediaServer(String id, boolean enable);
    @Select("SELECT st.*, pgs.gbId, pgs.name, pgs.longitude, pgs.latitude FROM stream_proxy st " +
            "LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " +
            "WHERE st.mediaServerId = '${id}' order by st.createTime desc")
    List<StreamProxyItem> selectInMediaServer(String id);
    @Update("UPDATE stream_proxy " +
            "SET enable=#{status} " +
            "WHERE mediaServerId=#{mediaServerId}")
    void updateStatus(boolean status, String mediaServerId);
    @Delete("DELETE FROM stream_proxy WHERE mediaServerId=#{mediaServerId}")
    void deleteAutoRemoveItemByMediaServerId(String mediaServerId);
}
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java
@@ -53,4 +53,7 @@
    @Delete("DELETE FROM stream_push")
    void clear();
    @Delete("DELETE FROM stream_push WHERE mediaServerId=#{mediaServerId}")
    void deleteWithoutGBId(String mediaServerId);
}
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -333,17 +333,14 @@
    @Override
    public void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, StreamInfo streamInfo) {
        String key = VideoManagerConstants.WVP_SERVER_STREAM_PUSH_PREFIX  + userSetup.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId();
        String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX  + userSetup.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId();
        redis.set(key, streamInfo);
    }
    @Override
    public void removeStream(MediaServerItem mediaServerItem, String type, String app, String streamId) {
        String key = VideoManagerConstants.WVP_SERVER_STREAM_PUSH_PREFIX + userSetup.getServerId() + "_*_"  + app + "_" + streamId + "_" + mediaServerItem.getId();
        List<Object> streams = redis.scan(key);
        for (Object stream : streams) {
            redis.del((String) stream);
        }
        String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_"  + app + "_" + streamId + "_" + mediaServerItem.getId();
        redis.del(key);
    }
    @Override
@@ -359,4 +356,13 @@
        JSONObject jsonObject = (JSONObject)redis.get(key);
        return  JSONObject.toJavaObject(jsonObject, ThirdPartyGB.class);
    }
    @Override
    public void removeStream(String mediaServerId, String type) {
        String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_*_*_" + mediaServerId;
        List<Object> streams = redis.scan(key);
        for (Object stream : streams) {
            redis.del((String) stream);
        }
    }
}
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -738,4 +738,5 @@
    public StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId) {
        return streamProxyMapper.selectOne(app, streamId);
    }
}
src/main/resources/wvp.sqlite
Binary files differ
src/test/java/com/genersoft/iot/vmp/service/impl/RoleServiceImplTest.java
@@ -25,7 +25,6 @@
    void getAllUser() {
        List<Role> all = roleService.getAll();
        Role roleById = roleService.getRoleById(1);
        System.out.println();
    }
src/test/java/com/genersoft/iot/vmp/service/impl/UserServiceImplTest.java
@@ -27,10 +27,8 @@
    @org.junit.jupiter.api.Test
    void getAllUser() {
        List<User> allUsers = userService.getAllUsers();
        System.out.println(userService.getAllUsers().size());
        User admin = userService.getUser("admin", "21232f297a57a5a743894a0e4a801fc3");
        User admin1 = userService.getUserByUsername("admin");
        System.out.println(12);
    }