|  |  | 
 |  |  | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; | 
 |  |  | import com.genersoft.iot.vmp.utils.GitUtil; | 
 |  |  | import gov.nist.javax.sip.SipProviderImpl; | 
 |  |  | import gov.nist.javax.sip.message.SIPRequest; | 
 |  |  | import org.slf4j.Logger; | 
 |  |  | import org.slf4j.LoggerFactory; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.annotation.Qualifier; | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  | import org.springframework.util.ObjectUtils; | 
 |  |  |  | 
 |  |  | import javax.sip.SipException; | 
 |  |  | import javax.sip.SipFactory; | 
 |  |  | import javax.sip.header.CallIdHeader; | 
 |  |  | import javax.sip.header.UserAgentHeader; | 
 |  |  | import javax.sip.header.ViaHeader; | 
 |  |  | import javax.sip.message.Message; | 
 |  |  | import javax.sip.message.Request; | 
 |  |  | import javax.sip.message.Response; | 
 |  |  | import java.net.InetAddress; | 
 |  |  | import java.text.ParseException; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |         transmitRequest(ip, message, errorEvent, null); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException { | 
 |  |  |         ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME); | 
 |  |  |         String transport = "UDP"; | 
 |  |  |         if (viaHeader == null) { | 
 |  |  |             logger.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据"); | 
 |  |  |         }else { | 
 |  |  |             transport = viaHeader.getTransport(); | 
 |  |  |         } | 
 |  |  |         if (message.getHeader(UserAgentHeader.NAME) == null) { | 
 |  |  |             try { | 
 |  |  |                 message.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil)); | 
 |  |  |             } catch (ParseException e) { | 
 |  |  |                 logger.error("添加UserAgentHeader失败", e); | 
 |  |  |     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) { | 
 |  |  |                 logger.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据"); | 
 |  |  |             }else { | 
 |  |  |                 transport = viaHeader.getTransport(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME); | 
 |  |  |         // 添加错误订阅 | 
 |  |  |         if (errorEvent != null) { | 
 |  |  |             sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> { | 
 |  |  |                 errorEvent.response(eventResult); | 
 |  |  |                 sipSubscribe.removeErrorSubscribe(eventResult.callId); | 
 |  |  |                 sipSubscribe.removeOkSubscribe(eventResult.callId); | 
 |  |  |             })); | 
 |  |  |         } | 
 |  |  |         // 添加订阅 | 
 |  |  |         if (okEvent != null) { | 
 |  |  |             sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> { | 
 |  |  |                 okEvent.response(eventResult); | 
 |  |  |                 sipSubscribe.removeOkSubscribe(eventResult.callId); | 
 |  |  |                 sipSubscribe.removeErrorSubscribe(eventResult.callId); | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |         if ("TCP".equals(transport)) { | 
 |  |  |             SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip); | 
 |  |  |             if (tcpSipProvider == null) { | 
 |  |  |                 logger.error("[发送信息失败] 未找到tcp://{}的监听信息", ip); | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |             if (message instanceof Request) { | 
 |  |  |                 tcpSipProvider.sendRequest((Request)message); | 
 |  |  |             }else if (message instanceof Response) { | 
 |  |  |                 tcpSipProvider.sendResponse((Response)message); | 
 |  |  |             if (message.getHeader(UserAgentHeader.NAME) == null) { | 
 |  |  |                 try { | 
 |  |  |                     message.addHeader(SipUtils.createUserAgentHeader(gitUtil)); | 
 |  |  |                 } catch (ParseException e) { | 
 |  |  |                     logger.error("添加UserAgentHeader失败", e); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } else if ("UDP".equals(transport)) { | 
 |  |  |             SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip); | 
 |  |  |             if (sipProvider == null) { | 
 |  |  |                 logger.error("[发送信息失败] 未找到udp://{}的监听信息", ip); | 
 |  |  |                 return; | 
 |  |  |             CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME); | 
 |  |  |             // 添加错误订阅 | 
 |  |  |             if (errorEvent != null) { | 
 |  |  |                 sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> { | 
 |  |  |                     errorEvent.response(eventResult); | 
 |  |  |                     sipSubscribe.removeErrorSubscribe(eventResult.callId); | 
 |  |  |                     sipSubscribe.removeOkSubscribe(eventResult.callId); | 
 |  |  |                 })); | 
 |  |  |             } | 
 |  |  |             if (message instanceof Request) { | 
 |  |  |                 sipProvider.sendRequest((Request)message); | 
 |  |  |             }else if (message instanceof Response) { | 
 |  |  |                 sipProvider.sendResponse((Response)message); | 
 |  |  |             // 添加订阅 | 
 |  |  |             if (okEvent != null) { | 
 |  |  |                 sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> { | 
 |  |  |                     okEvent.response(eventResult); | 
 |  |  |                     sipSubscribe.removeOkSubscribe(eventResult.callId); | 
 |  |  |                     sipSubscribe.removeErrorSubscribe(eventResult.callId); | 
 |  |  |                 }); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |             if ("TCP".equals(transport)) { | 
 |  |  |                 SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip); | 
 |  |  |                 if (tcpSipProvider == null) { | 
 |  |  |                     logger.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) { | 
 |  |  |                     logger.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){ | 
 |  |  |         return  transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider(ip).getNewCallId() | 
 |  |  |                 : sipLayer.getUdpSipProvider(ip).getNewCallId(); | 
 |  |  |         if (ObjectUtils.isEmpty(transport)) { | 
 |  |  |             return sipLayer.getUdpSipProvider().getNewCallId(); | 
 |  |  |         } | 
 |  |  |         SipProviderImpl sipProvider; | 
 |  |  |         if (ObjectUtils.isEmpty(ip)) { | 
 |  |  |             sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider() | 
 |  |  |                     : sipLayer.getUdpSipProvider(); | 
 |  |  |         }else { | 
 |  |  |             sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider(ip) | 
 |  |  |                     : sipLayer.getUdpSipProvider(ip); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (sipProvider == null) { | 
 |  |  |             sipProvider = sipLayer.getUdpSipProvider(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (sipProvider != null) { | 
 |  |  |             return sipProvider.getNewCallId(); | 
 |  |  |         }else { | 
 |  |  |             logger.warn("[新建CallIdHeader失败], ip={}, transport={}", ip, transport); | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } |