|  | @@ -3,11 +3,15 @@ package com.genersoft.iot.vmp.service.impl;
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.TypeReference;
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.common.StreamInfo;
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.conf.UserSetup;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.bean.GbStream;
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
 | 
	
		
			
				|  |  |  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.OriginType;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.service.IMediaServerService;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.service.IStreamPushService;
 | 
	
	
		
			
				|  | @@ -20,10 +24,7 @@ import com.github.pagehelper.PageInfo;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import java.util.ArrayList;
 | 
	
		
			
				|  |  | -import java.util.HashMap;
 | 
	
		
			
				|  |  | -import java.util.List;
 | 
	
		
			
				|  |  | -import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.*;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @Service
 | 
	
		
			
				|  |  |  public class StreamPushServiceImpl implements IStreamPushService {
 | 
	
	
		
			
				|  | @@ -43,6 +44,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private IRedisCatchStorage redisCatchStorage;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private UserSetup userSetup;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private IMediaServerService mediaServerService;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -56,7 +60,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
 | 
	
		
			
				|  |  |          for (MediaItem item : mediaItems) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // 不保存国标推理以及拉流代理的流
 | 
	
		
			
				|  |  | -            if (item.getOriginType() == 1 || item.getOriginType() == 2 || item.getOriginType() == 8) {
 | 
	
		
			
				|  |  | +            if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal()
 | 
	
		
			
				|  |  | +                    || item.getOriginType() == OriginType.RTMP_PUSH.ordinal()
 | 
	
		
			
				|  |  | +                    || item.getOriginType() == OriginType.RTC_PUSH.ordinal() ) {
 | 
	
		
			
				|  |  |                  String key = item.getApp() + "_" + item.getStream();
 | 
	
		
			
				|  |  |                  StreamPushItem streamPushItem = result.get(key);
 | 
	
		
			
				|  |  |                  if (streamPushItem == null) {
 | 
	
	
		
			
				|  | @@ -97,6 +103,11 @@ public class StreamPushServiceImpl implements IStreamPushService {
 | 
	
		
			
				|  |  |          return new PageInfo<>(all);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public List<StreamPushItem> getPushList(String mediaServerId) {
 | 
	
		
			
				|  |  | +        return streamPushMapper.selectAllByMediaServerId(mediaServerId);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public boolean saveToGB(GbStream stream) {
 | 
	
		
			
				|  |  |          stream.setStreamType("push");
 | 
	
	
		
			
				|  | @@ -137,17 +148,84 @@ public class StreamPushServiceImpl implements IStreamPushService {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  | -    public void zlmServerOnline(ZLMServerConfig zlmServerConfig) {
 | 
	
		
			
				|  |  | -        // 似乎没啥需要做的
 | 
	
		
			
				|  |  | +    public void zlmServerOnline(String mediaServerId) {
 | 
	
		
			
				|  |  | +        // 同步zlm推流信息
 | 
	
		
			
				|  |  | +        MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
 | 
	
		
			
				|  |  | +        if (mediaServerItem == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        List<StreamPushItem> pushList = getPushList(mediaServerId);
 | 
	
		
			
				|  |  | +        if (pushList.size() > 0) {
 | 
	
		
			
				|  |  | +            Map<String, StreamPushItem> pushItemMap = new HashMap<>();
 | 
	
		
			
				|  |  | +            for (StreamPushItem streamPushItem : pushList) {
 | 
	
		
			
				|  |  | +                pushItemMap.put(streamPushItem.getApp() + streamPushItem.getStream(), streamPushItem);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{
 | 
	
		
			
				|  |  | +                if (mediaList == null) return;
 | 
	
		
			
				|  |  | +                String dataStr = mediaList.getString("data");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                Integer code = mediaList.getInteger("code");
 | 
	
		
			
				|  |  | +                List<StreamPushItem> streamPushItems = null;
 | 
	
		
			
				|  |  | +                if (code == 0 ) {
 | 
	
		
			
				|  |  | +                    if (dataStr != null) {
 | 
	
		
			
				|  |  | +                        streamPushItems = handleJSON(dataStr, mediaServerItem);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if (streamPushItems != null) {
 | 
	
		
			
				|  |  | +                    for (StreamPushItem streamPushItem : streamPushItems) {
 | 
	
		
			
				|  |  | +                        pushItemMap.remove(streamPushItem.getApp() + streamPushItem.getStream());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                Collection<StreamPushItem> offlinePushItems = pushItemMap.values();
 | 
	
		
			
				|  |  | +                if (offlinePushItems.size() > 0) {
 | 
	
		
			
				|  |  | +                    String type = "PUSH";
 | 
	
		
			
				|  |  | +                    streamPushMapper.delAll(new ArrayList<>(offlinePushItems));
 | 
	
		
			
				|  |  | +                    for (StreamPushItem offlinePushItem : offlinePushItems) {
 | 
	
		
			
				|  |  | +                        JSONObject jsonObject = new JSONObject();
 | 
	
		
			
				|  |  | +                        jsonObject.put("serverId", userSetup.getServerId());
 | 
	
		
			
				|  |  | +                        jsonObject.put("app", offlinePushItem.getApp());
 | 
	
		
			
				|  |  | +                        jsonObject.put("stream", offlinePushItem.getStream());
 | 
	
		
			
				|  |  | +                        jsonObject.put("register", false);
 | 
	
		
			
				|  |  | +                        jsonObject.put("mediaServerId", mediaServerId);
 | 
	
		
			
				|  |  | +                        redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
 | 
	
		
			
				|  |  | +                        // 移除redis内流的信息
 | 
	
		
			
				|  |  | +                        redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlinePushItem.getApp(), offlinePushItem.getStream());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public void zlmServerOffline(String mediaServerId) {
 | 
	
		
			
				|  |  | -        // 移除没有serverId的推流
 | 
	
		
			
				|  |  | +        List<StreamPushItem> streamPushItems = streamPushMapper.selectAllByMediaServerId(mediaServerId);
 | 
	
		
			
				|  |  | +        // 移除没有GBId的推流
 | 
	
		
			
				|  |  |          streamPushMapper.deleteWithoutGBId(mediaServerId);
 | 
	
		
			
				|  |  | +        gbStreamMapper.deleteWithoutGBId("push", mediaServerId);
 | 
	
		
			
				|  |  |          // 其他的流设置未启用
 | 
	
		
			
				|  |  |          gbStreamMapper.updateStatusByMediaServerId(mediaServerId, false);
 | 
	
		
			
				|  |  | -        // 移除redis内流的信息
 | 
	
		
			
				|  |  | -        redisCatchStorage.removeStream(mediaServerId, "PUSH");
 | 
	
		
			
				|  |  | +        // 发送流停止消息
 | 
	
		
			
				|  |  | +        String type = "PUSH";
 | 
	
		
			
				|  |  | +        // 发送redis消息
 | 
	
		
			
				|  |  | +        List<StreamInfo> streamInfoList = redisCatchStorage.getStreams(mediaServerId, type);
 | 
	
		
			
				|  |  | +        if (streamInfoList.size() > 0) {
 | 
	
		
			
				|  |  | +            for (StreamInfo streamInfo : streamInfoList) {
 | 
	
		
			
				|  |  | +                JSONObject jsonObject = new JSONObject();
 | 
	
		
			
				|  |  | +                jsonObject.put("serverId", userSetup.getServerId());
 | 
	
		
			
				|  |  | +                jsonObject.put("app", streamInfo.getApp());
 | 
	
		
			
				|  |  | +                jsonObject.put("stream", streamInfo.getStreamId());
 | 
	
		
			
				|  |  | +                jsonObject.put("register", false);
 | 
	
		
			
				|  |  | +                jsonObject.put("mediaServerId", mediaServerId);
 | 
	
		
			
				|  |  | +                redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
 | 
	
		
			
				|  |  | +                // 移除redis内流的信息
 | 
	
		
			
				|  |  | +                redisCatchStorage.removeStream(mediaServerId, type, streamInfo.getApp(), streamInfo.getStreamId());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void clean() {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |