|  |  | 
 |  |  | 
 | 
 |  |  | import javax.sip.RequestEvent;
 | 
 |  |  | import javax.sip.ResponseEvent;
 | 
 |  |  | import javax.sip.SipProvider;
 | 
 |  |  | import javax.sip.header.CSeqHeader;
 | 
 |  |  | import javax.sip.message.Request;
 | 
 |  |  | import javax.sip.message.Response;
 | 
 |  |  | 
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
 | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
 | 
 |  |  | import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
 | 
 |  |  | import com.genersoft.iot.vmp.service.IPlayService;
 | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
 |  |  | import org.springframework.context.annotation.Lazy;
 | 
 |  |  | import org.springframework.stereotype.Component;
 | 
 |  |  | 
 | 
 |  |  | import com.genersoft.iot.vmp.conf.SipConfig;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.AckRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.ByeRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.CancelRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.InviteRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.MessageRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.NotifyRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.OtherRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.RegisterRequestProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.request.impl.SubscribeRequestProcessor;
 | 
 |  |  | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.response.impl.CancelResponseProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.response.impl.InviteResponseProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.response.impl.OtherResponseProcessor;
 | 
 |  |  | import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 | 
 |  |  | import com.genersoft.iot.vmp.utils.SpringBeanFactory;
 | 
 |  |  | import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 | 
 |  |  | 
 | 
 |  |  | /**    
 | 
 |  |  |  * @Description:TODO(这里用一句话描述这个类的作用)    | 
 |  |  |  * @author: songww
 | 
 |  |  |  * @Description: SIP信令处理分配
 | 
 |  |  |  * @author: swwheihei
 | 
 |  |  |  * @date:   2020年5月3日 下午4:24:37     
 | 
 |  |  |  */
 | 
 |  |  | @Component
 | 
 |  |  | public class SIPProcessorFactory {
 | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private InviteRequestProcessor inviteRequestProcessor;
 | 
 |  |  |    // private final static Logger logger = LoggerFactory.getLogger(SIPProcessorFactory.class);
 | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private RegisterRequestProcessor registerRequestProcessor;
 | 
 |  |  |    private SipConfig sipConfig;
 | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private SubscribeRequestProcessor subscribeRequestProcessor;
 | 
 |  |  |    private RegisterLogicHandler handler;
 | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private AckRequestProcessor ackRequestProcessor;
 | 
 |  |  |    private IVideoManagerStorager storager;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private IRedisCatchStorage redisCatchStorage;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private EventPublisher publisher;
 | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private ByeRequestProcessor byeRequestProcessor;
 | 
 |  |  |    private SIPCommander cmder;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private SIPCommanderFroPlatform cmderFroPlatform;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private RedisUtil redis;
 | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private CancelRequestProcessor cancelRequestProcessor;
 | 
 |  |  |    private DeferredResultHolder deferredResultHolder;
 | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private MessageRequestProcessor messageRequestProcessor;
 | 
 |  |  | 	 | 
 |  |  |    @Autowired
 | 
 |  |  |    private OtherRequestProcessor otherRequestProcessor;
 | 
 |  |  |    private DeviceOffLineDetector offLineDetector;
 | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private InviteResponseProcessor inviteResponseProcessor;
 | 
 |  |  | 
 |  |  |    
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private CancelResponseProcessor cancelResponseProcessor;
 | 
 |  |  | 	 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    @Lazy
 | 
 |  |  |    private RegisterResponseProcessor registerResponseProcessor;
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private OtherResponseProcessor otherResponseProcessor;
 | 
 |  |  | 	 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private IPlayService playService;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private ZLMRTPServerFactory zlmrtpServerFactory;
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |    // 注:这里使用注解会导致循环依赖注入,暂用springBean
 | 
 |  |  |    private SipProvider tcpSipProvider;
 | 
 |  |  | 		 | 
 |  |  |    // 注:这里使用注解会导致循环依赖注入,暂用springBean
 | 
 |  |  |    private SipProvider udpSipProvider;
 | 
 |  |  |    
 | 
 |  |  |    public ISIPRequestProcessor createRequestProcessor(RequestEvent evt) {
 | 
 |  |  |       Request request = evt.getRequest();
 | 
 |  |  |       String method = request.getMethod();
 | 
 |  |  | 		 | 
 |  |  | //      logger.info("接收到消息:"+request.getMethod());
 | 
 |  |  | //      sipSubscribe.getSubscribe(evt.getServerTransaction().getBranchId()).response(evt);
 | 
 |  |  |       if (Request.INVITE.equals(method)) {
 | 
 |  |  |          return inviteRequestProcessor;
 | 
 |  |  |          InviteRequestProcessor processor = new InviteRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          processor.setTcpSipProvider(getTcpSipProvider());
 | 
 |  |  |          processor.setUdpSipProvider(getUdpSipProvider());
 | 
 |  |  | 
 | 
 |  |  |          processor.setCmder(cmder);
 | 
 |  |  |          processor.setCmderFroPlatform(cmderFroPlatform);
 | 
 |  |  |          processor.setPlayService(playService);
 | 
 |  |  |          processor.setStorager(storager);
 | 
 |  |  |          processor.setRedisCatchStorage(redisCatchStorage);
 | 
 |  |  |          processor.setZlmrtpServerFactory(zlmrtpServerFactory);
 | 
 |  |  |          return processor;
 | 
 |  |  |       } else if (Request.REGISTER.equals(method)) {
 | 
 |  |  |          return registerRequestProcessor;
 | 
 |  |  |          RegisterRequestProcessor processor = new RegisterRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          processor.setTcpSipProvider(getTcpSipProvider());
 | 
 |  |  |          processor.setUdpSipProvider(getUdpSipProvider());
 | 
 |  |  |          processor.setHandler(handler);
 | 
 |  |  |          processor.setPublisher(publisher);
 | 
 |  |  |          processor.setSipConfig(sipConfig);
 | 
 |  |  |          processor.setVideoManagerStorager(storager);
 | 
 |  |  |          return processor;
 | 
 |  |  |       } else if (Request.SUBSCRIBE.equals(method)) {
 | 
 |  |  |          return subscribeRequestProcessor;
 | 
 |  |  |          SubscribeRequestProcessor processor = new SubscribeRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          return processor;
 | 
 |  |  |       } else if (Request.ACK.equals(method)) {
 | 
 |  |  |          return ackRequestProcessor;
 | 
 |  |  |          AckRequestProcessor processor = new AckRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          processor.setRedisCatchStorage(redisCatchStorage);
 | 
 |  |  |          processor.setZlmrtpServerFactory(zlmrtpServerFactory);
 | 
 |  |  |          return processor;
 | 
 |  |  |       } else if (Request.BYE.equals(method)) {
 | 
 |  |  |          return byeRequestProcessor;
 | 
 |  |  |          ByeRequestProcessor processor = new ByeRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          processor.setRedisCatchStorage(redisCatchStorage);
 | 
 |  |  |          processor.setZlmrtpServerFactory(zlmrtpServerFactory);
 | 
 |  |  |          processor.setSIPCommander(cmder);
 | 
 |  |  |          return processor;
 | 
 |  |  |       } else if (Request.CANCEL.equals(method)) {
 | 
 |  |  |          return cancelRequestProcessor;
 | 
 |  |  |          CancelRequestProcessor processor = new CancelRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          return processor;
 | 
 |  |  |       } else if (Request.MESSAGE.equals(method)) {
 | 
 |  |  |          return messageRequestProcessor;
 | 
 |  |  |          MessageRequestProcessor processor = new MessageRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          processor.setTcpSipProvider(getTcpSipProvider());
 | 
 |  |  |          processor.setUdpSipProvider(getUdpSipProvider());
 | 
 |  |  |          processor.setPublisher(publisher);
 | 
 |  |  |          processor.setRedis(redis);
 | 
 |  |  |          processor.setDeferredResultHolder(deferredResultHolder);
 | 
 |  |  |          processor.setOffLineDetector(offLineDetector);
 | 
 |  |  |          processor.setCmder(cmder);
 | 
 |  |  |          processor.setCmderFroPlatform(cmderFroPlatform);
 | 
 |  |  |          processor.setStorager(storager);
 | 
 |  |  |          processor.setRedisCatchStorage(redisCatchStorage);
 | 
 |  |  |          return processor;
 | 
 |  |  |       } else if (Request.NOTIFY.equalsIgnoreCase(method)) {
 | 
 |  |  |          NotifyRequestProcessor processor = new NotifyRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          processor.setTcpSipProvider(getTcpSipProvider());
 | 
 |  |  |          processor.setUdpSipProvider(getUdpSipProvider());
 | 
 |  |  |          processor.setPublisher(publisher);
 | 
 |  |  |          processor.setRedis(redis);
 | 
 |  |  |          processor.setDeferredResultHolder(deferredResultHolder);
 | 
 |  |  |          processor.setOffLineDetector(offLineDetector);
 | 
 |  |  |          processor.setCmder(cmder);
 | 
 |  |  |          processor.setStorager(storager);
 | 
 |  |  |          processor.setRedisCatchStorage(redisCatchStorage);
 | 
 |  |  |          return processor;
 | 
 |  |  |       } else {
 | 
 |  |  |          return otherRequestProcessor;
 | 
 |  |  |          OtherRequestProcessor processor = new OtherRequestProcessor();
 | 
 |  |  |          processor.setRequestEvent(evt);
 | 
 |  |  |          return processor;
 | 
 |  |  |       }
 | 
 |  |  |    }
 | 
 |  |  |    
 | 
 |  |  |    public ISIPResponseProcessor createResponseProcessor(ResponseEvent evt) {
 | 
 |  |  | 
 | 
 |  |  |       Response response = evt.getResponse();
 | 
 |  |  |       CSeqHeader cseqHeader = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
 | 
 |  |  |       String method = cseqHeader.getMethod();
 | 
 |  |  | 
 |  |  |          return byeResponseProcessor;
 | 
 |  |  |       } else if (Request.CANCEL.equals(method)) {
 | 
 |  |  |          return cancelResponseProcessor;
 | 
 |  |  |       }else if (Request.REGISTER.equals(method)) {
 | 
 |  |  |          return registerResponseProcessor;
 | 
 |  |  |       } else {
 | 
 |  |  |          return otherResponseProcessor;
 | 
 |  |  |       }
 | 
 |  |  |    }
 | 
 |  |  |    
 | 
 |  |  |    private SipProvider getTcpSipProvider() {
 | 
 |  |  |       if (tcpSipProvider == null) {
 | 
 |  |  |          tcpSipProvider = (SipProvider) SpringBeanFactory.getBean("tcpSipProvider");
 | 
 |  |  |       }
 | 
 |  |  |       return tcpSipProvider;
 | 
 |  |  |    }
 | 
 |  |  | 	 | 
 |  |  |    private SipProvider getUdpSipProvider() {
 | 
 |  |  |       if (udpSipProvider == null) {
 | 
 |  |  |          udpSipProvider = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
 | 
 |  |  |       }
 | 
 |  |  |       return udpSipProvider;
 | 
 |  |  |    }
 | 
 |  |  | 	 | 
 |  |  | }
 |