SIPSender.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package com.genersoft.iot.vmp.gb28181.transmit;
  2. import com.genersoft.iot.vmp.gb28181.SipLayer;
  3. import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
  4. import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
  5. import com.genersoft.iot.vmp.utils.GitUtil;
  6. import gov.nist.javax.sip.SipProviderImpl;
  7. import gov.nist.javax.sip.message.SIPRequest;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.beans.factory.annotation.Qualifier;
  12. import org.springframework.stereotype.Component;
  13. import javax.sip.SipException;
  14. import javax.sip.SipFactory;
  15. import javax.sip.header.CallIdHeader;
  16. import javax.sip.header.UserAgentHeader;
  17. import javax.sip.header.ViaHeader;
  18. import javax.sip.message.Message;
  19. import javax.sip.message.Request;
  20. import javax.sip.message.Response;
  21. import java.net.InetAddress;
  22. import java.text.ParseException;
  23. /**
  24. * 发送SIP消息
  25. * @author lin
  26. */
  27. @Component
  28. public class SIPSender {
  29. private final Logger logger = LoggerFactory.getLogger(SIPSender.class);
  30. @Autowired
  31. private SipLayer sipLayer;
  32. @Autowired
  33. private GitUtil gitUtil;
  34. @Autowired
  35. private SipSubscribe sipSubscribe;
  36. public void transmitRequest(String ip, Message message) throws SipException, ParseException {
  37. transmitRequest(ip, message, null, null);
  38. }
  39. public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent) throws SipException, ParseException {
  40. transmitRequest(ip, message, errorEvent, null);
  41. }
  42. public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {
  43. ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
  44. String transport = "UDP";
  45. if (viaHeader == null) {
  46. logger.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据");
  47. }else {
  48. transport = viaHeader.getTransport();
  49. }
  50. if (message.getHeader(UserAgentHeader.NAME) == null) {
  51. try {
  52. message.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
  53. } catch (ParseException e) {
  54. logger.error("添加UserAgentHeader失败", e);
  55. }
  56. }
  57. CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
  58. // 添加错误订阅
  59. if (errorEvent != null) {
  60. sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
  61. errorEvent.response(eventResult);
  62. sipSubscribe.removeErrorSubscribe(eventResult.callId);
  63. sipSubscribe.removeOkSubscribe(eventResult.callId);
  64. }));
  65. }
  66. // 添加订阅
  67. if (okEvent != null) {
  68. sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
  69. okEvent.response(eventResult);
  70. sipSubscribe.removeOkSubscribe(eventResult.callId);
  71. sipSubscribe.removeErrorSubscribe(eventResult.callId);
  72. });
  73. }
  74. if ("TCP".equals(transport)) {
  75. SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
  76. if (tcpSipProvider == null) {
  77. logger.error("[发送信息失败] 未找到tcp://{}的监听信息", ip);
  78. return;
  79. }
  80. if (message instanceof Request) {
  81. tcpSipProvider.sendRequest((Request)message);
  82. }else if (message instanceof Response) {
  83. tcpSipProvider.sendResponse((Response)message);
  84. }
  85. } else if ("UDP".equals(transport)) {
  86. SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
  87. if (sipProvider == null) {
  88. logger.error("[发送信息失败] 未找到udp://{}的监听信息", ip);
  89. return;
  90. }
  91. if (message instanceof Request) {
  92. sipProvider.sendRequest((Request)message);
  93. }else if (message instanceof Response) {
  94. sipProvider.sendResponse((Response)message);
  95. }
  96. }
  97. }
  98. public CallIdHeader getNewCallIdHeader(String ip, String transport){
  99. return transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider(ip).getNewCallId()
  100. : sipLayer.getUdpSipProvider(ip).getNewCallId();
  101. }
  102. }