package com.genersoft.iot.vmp.gb28181.transmit.event.response.impl; 
 | 
  
 | 
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 
 | 
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch; 
 | 
import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; 
 | 
import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; 
 | 
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; 
 | 
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; 
 | 
import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract; 
 | 
import com.genersoft.iot.vmp.service.IPlatformService; 
 | 
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 
 | 
import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 
 | 
import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo; 
 | 
import gov.nist.javax.sip.message.SIPResponse; 
 | 
import org.slf4j.Logger; 
 | 
import org.slf4j.LoggerFactory; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
import javax.sip.InvalidArgumentException; 
 | 
import javax.sip.ResponseEvent; 
 | 
import javax.sip.SipException; 
 | 
import javax.sip.header.WWWAuthenticateHeader; 
 | 
import javax.sip.message.Response; 
 | 
import java.text.ParseException; 
 | 
  
 | 
/**     
 | 
 * @description:Register响应处理器 
 | 
 * @author: swwheihei 
 | 
 * @date:   2020年5月3日 下午5:32:23      
 | 
 */ 
 | 
@Component 
 | 
public class RegisterResponseProcessor extends SIPResponseProcessorAbstract { 
 | 
  
 | 
    private final Logger logger = LoggerFactory.getLogger(RegisterResponseProcessor.class); 
 | 
    private final String method = "REGISTER"; 
 | 
  
 | 
    @Autowired 
 | 
    private ISIPCommanderForPlatform sipCommanderForPlatform; 
 | 
  
 | 
    @Autowired 
 | 
    private IVideoManagerStorage storager; 
 | 
  
 | 
    @Autowired 
 | 
    private IRedisCatchStorage redisCatchStorage; 
 | 
  
 | 
    @Autowired 
 | 
    private SIPProcessorObserver sipProcessorObserver; 
 | 
  
 | 
    @Autowired 
 | 
    private SubscribeHolder subscribeHolder; 
 | 
  
 | 
    @Autowired 
 | 
    private IPlatformService platformService; 
 | 
  
 | 
    @Override 
 | 
    public void afterPropertiesSet() throws Exception { 
 | 
        // 添加消息处理的订阅 
 | 
        sipProcessorObserver.addResponseProcessor(method, this); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 处理Register响应 
 | 
     * 
 | 
      * @param evt 事件 
 | 
     */ 
 | 
    @Override 
 | 
    public void process(ResponseEvent evt) { 
 | 
        SIPResponse response = (SIPResponse)evt.getResponse(); 
 | 
        String callId = response.getCallIdHeader().getCallId(); 
 | 
        PlatformRegisterInfo platformRegisterInfo = redisCatchStorage.queryPlatformRegisterInfo(callId); 
 | 
        if (platformRegisterInfo == null) { 
 | 
            logger.info(String.format("[国标级联]未找到callId: %s 的注册/注销平台id", callId )); 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(platformRegisterInfo.getPlatformId()); 
 | 
        if (parentPlatformCatch == null) { 
 | 
            logger.warn(String.format("[国标级联]收到注册/注销%S请求,平台:%s,但是平台缓存信息未查询到!!!", response.getStatusCode(),platformRegisterInfo.getPlatformId())); 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        String action = platformRegisterInfo.isRegister() ? "注册" : "注销"; 
 | 
        logger.info(String.format("[国标级联]%s %S响应,%s ", action, response.getStatusCode(), platformRegisterInfo.getPlatformId() )); 
 | 
        ParentPlatform parentPlatform = parentPlatformCatch.getParentPlatform(); 
 | 
        if (parentPlatform == null) { 
 | 
            logger.warn(String.format("[国标级联]收到 %s %s的%S请求, 但是平台信息未查询到!!!", platformRegisterInfo.getPlatformId(), action, response.getStatusCode())); 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        if (response.getStatusCode() == Response.UNAUTHORIZED) { 
 | 
            WWWAuthenticateHeader www = (WWWAuthenticateHeader)response.getHeader(WWWAuthenticateHeader.NAME); 
 | 
            SipTransactionInfo sipTransactionInfo = new SipTransactionInfo(response); 
 | 
            try { 
 | 
                sipCommanderForPlatform.register(parentPlatform, sipTransactionInfo, www, null, null, platformRegisterInfo.isRegister()); 
 | 
            } catch (SipException | InvalidArgumentException | ParseException e) { 
 | 
                logger.error("[命令发送失败] 国标级联 再次注册: {}", e.getMessage()); 
 | 
            } 
 | 
        }else if (response.getStatusCode() == Response.OK){ 
 | 
  
 | 
            if (platformRegisterInfo.isRegister()) { 
 | 
                SipTransactionInfo sipTransactionInfo = new SipTransactionInfo(response); 
 | 
                platformService.online(parentPlatform, sipTransactionInfo); 
 | 
            }else { 
 | 
                platformService.offline(parentPlatform, true); 
 | 
            } 
 | 
  
 | 
            // 注册/注销成功移除缓存的信息 
 | 
            redisCatchStorage.delPlatformRegisterInfo(callId); 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |