|  | @@ -1,7 +1,9 @@
 | 
	
		
			
				|  |  |  package com.genersoft.iot.vmp.gb28181.transmit;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.conf.SipConfig;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.SipLayer;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.gb28181.event.sip.SipEvent;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.utils.GitUtil;
 | 
	
		
			
				|  |  |  import gov.nist.javax.sip.SipProviderImpl;
 | 
	
	
		
			
				|  | @@ -21,6 +23,7 @@ import java.text.ParseException;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * 发送SIP消息
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  |   * @author lin
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  @Slf4j
 | 
	
	
		
			
				|  | @@ -35,75 +38,80 @@ public class SIPSender {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private SipSubscribe sipSubscribe;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private SipConfig sipConfig;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void transmitRequest(String ip, Message message) throws SipException, ParseException {
 | 
	
		
			
				|  |  | -        transmitRequest(ip, message, null, null);
 | 
	
		
			
				|  |  | +        transmitRequest(ip, message, null, null, null);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent) throws SipException, ParseException {
 | 
	
		
			
				|  |  | -        transmitRequest(ip, message, errorEvent, null);
 | 
	
		
			
				|  |  | +        transmitRequest(ip, message, errorEvent, null, null);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException {
 | 
	
		
			
				|  |  | -            ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
 | 
	
		
			
				|  |  | -            String transport = "UDP";
 | 
	
		
			
				|  |  | -            if (viaHeader == null) {
 | 
	
		
			
				|  |  | -                log.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据");
 | 
	
		
			
				|  |  | -            }else {
 | 
	
		
			
				|  |  | -                transport = viaHeader.getTransport();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (message.getHeader(UserAgentHeader.NAME) == null) {
 | 
	
		
			
				|  |  | -                try {
 | 
	
		
			
				|  |  | -                    message.addHeader(SipUtils.createUserAgentHeader(gitUtil));
 | 
	
		
			
				|  |  | -                } catch (ParseException e) {
 | 
	
		
			
				|  |  | -                    log.error("添加UserAgentHeader失败", e);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +        transmitRequest(ip, message, errorEvent, okEvent, null);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent, Long timeout) throws SipException {
 | 
	
		
			
				|  |  | +        ViaHeader viaHeader = (ViaHeader) message.getHeader(ViaHeader.NAME);
 | 
	
		
			
				|  |  | +        String transport = "UDP";
 | 
	
		
			
				|  |  | +        if (viaHeader == null) {
 | 
	
		
			
				|  |  | +            log.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据");
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            transport = viaHeader.getTransport();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (message.getHeader(UserAgentHeader.NAME) == null) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                message.addHeader(SipUtils.createUserAgentHeader(gitUtil));
 | 
	
		
			
				|  |  | +            } catch (ParseException e) {
 | 
	
		
			
				|  |  | +                log.error("添加UserAgentHeader失败", e);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        if (okEvent != null || errorEvent != null) {
 | 
	
		
			
				|  |  |              CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
 | 
	
		
			
				|  |  | -            // 添加错误订阅
 | 
	
		
			
				|  |  | -            if (errorEvent != null) {
 | 
	
		
			
				|  |  | -                sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
 | 
	
		
			
				|  |  | -                    sipSubscribe.removeErrorSubscribe(eventResult.callId);
 | 
	
		
			
				|  |  | -                    sipSubscribe.removeOkSubscribe(eventResult.callId);
 | 
	
		
			
				|  |  | -                    errorEvent.response(eventResult);
 | 
	
		
			
				|  |  | -                }));
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            // 添加订阅
 | 
	
		
			
				|  |  | -            if (okEvent != null) {
 | 
	
		
			
				|  |  | -                sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
 | 
	
		
			
				|  |  | -                    sipSubscribe.removeOkSubscribe(eventResult.callId);
 | 
	
		
			
				|  |  | -                    sipSubscribe.removeErrorSubscribe(eventResult.callId);
 | 
	
		
			
				|  |  | +            SipEvent sipEvent = SipEvent.getInstance(callIdHeader.getCallId(), eventResult -> {
 | 
	
		
			
				|  |  | +                sipSubscribe.removeSubscribe(eventResult.callId);
 | 
	
		
			
				|  |  | +                if(okEvent != null) {
 | 
	
		
			
				|  |  |                      okEvent.response(eventResult);
 | 
	
		
			
				|  |  | -                });
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if ("TCP".equals(transport)) {
 | 
	
		
			
				|  |  | -                SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
 | 
	
		
			
				|  |  | -                if (tcpSipProvider == null) {
 | 
	
		
			
				|  |  | -                    log.error("[发送信息失败] 未找到tcp://{}的监听信息", ip);
 | 
	
		
			
				|  |  | -                    return;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                if (message instanceof Request) {
 | 
	
		
			
				|  |  | -                    tcpSipProvider.sendRequest((Request)message);
 | 
	
		
			
				|  |  | -                }else if (message instanceof Response) {
 | 
	
		
			
				|  |  | -                    tcpSipProvider.sendResponse((Response)message);
 | 
	
		
			
				|  |  | +            }, (eventResult -> {
 | 
	
		
			
				|  |  | +                sipSubscribe.removeSubscribe(eventResult.callId);
 | 
	
		
			
				|  |  | +                if (errorEvent != null) {
 | 
	
		
			
				|  |  | +                    errorEvent.response(eventResult);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +            }), timeout == null ? sipConfig.getTimeout() : timeout);
 | 
	
		
			
				|  |  | +            sipSubscribe.addSubscribe(callIdHeader.getCallId(), sipEvent);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            } else if ("UDP".equals(transport)) {
 | 
	
		
			
				|  |  | -                SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
 | 
	
		
			
				|  |  | -                if (sipProvider == null) {
 | 
	
		
			
				|  |  | -                    log.error("[发送信息失败] 未找到udp://{}的监听信息", ip);
 | 
	
		
			
				|  |  | -                    return;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                if (message instanceof Request) {
 | 
	
		
			
				|  |  | -                    sipProvider.sendRequest((Request)message);
 | 
	
		
			
				|  |  | -                }else if (message instanceof Response) {
 | 
	
		
			
				|  |  | -                    sipProvider.sendResponse((Response)message);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +        if ("TCP".equals(transport)) {
 | 
	
		
			
				|  |  | +            SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
 | 
	
		
			
				|  |  | +            if (tcpSipProvider == null) {
 | 
	
		
			
				|  |  | +                log.error("[发送信息失败] 未找到tcp://{}的监听信息", ip);
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (message instanceof Request) {
 | 
	
		
			
				|  |  | +                tcpSipProvider.sendRequest((Request) message);
 | 
	
		
			
				|  |  | +            } else if (message instanceof Response) {
 | 
	
		
			
				|  |  | +                tcpSipProvider.sendResponse((Response) message);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        } else if ("UDP".equals(transport)) {
 | 
	
		
			
				|  |  | +            SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
 | 
	
		
			
				|  |  | +            if (sipProvider == null) {
 | 
	
		
			
				|  |  | +                log.error("[发送信息失败] 未找到udp://{}的监听信息", ip);
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (message instanceof Request) {
 | 
	
		
			
				|  |  | +                sipProvider.sendRequest((Request) message);
 | 
	
		
			
				|  |  | +            } else if (message instanceof Response) {
 | 
	
		
			
				|  |  | +                sipProvider.sendResponse((Response) message);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public CallIdHeader getNewCallIdHeader(String ip, String transport){
 | 
	
		
			
				|  |  | +    public CallIdHeader getNewCallIdHeader(String ip, String transport) {
 | 
	
		
			
				|  |  |          if (ObjectUtils.isEmpty(transport)) {
 | 
	
		
			
				|  |  |              return sipLayer.getUdpSipProvider().getNewCallId();
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -111,7 +119,7 @@ public class SIPSender {
 | 
	
		
			
				|  |  |          if (ObjectUtils.isEmpty(ip)) {
 | 
	
		
			
				|  |  |              sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider()
 | 
	
		
			
				|  |  |                      : sipLayer.getUdpSipProvider();
 | 
	
		
			
				|  |  | -        }else {
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  |              sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider(ip)
 | 
	
		
			
				|  |  |                      : sipLayer.getUdpSipProvider(ip);
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -122,9 +130,11 @@ public class SIPSender {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (sipProvider != null) {
 | 
	
		
			
				|  |  |              return sipProvider.getNewCallId();
 | 
	
		
			
				|  |  | -        }else {
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  |              log.warn("[新建CallIdHeader失败], ip={}, transport={}", ip, transport);
 | 
	
		
			
				|  |  |              return null;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 |