SIPSender.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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 org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.util.ObjectUtils;
  12. import javax.sip.SipException;
  13. import javax.sip.header.CallIdHeader;
  14. import javax.sip.header.UserAgentHeader;
  15. import javax.sip.header.ViaHeader;
  16. import javax.sip.message.Message;
  17. import javax.sip.message.Request;
  18. import javax.sip.message.Response;
  19. import java.text.ParseException;
  20. /**
  21. * 发送SIP消息
  22. * @author lin
  23. */
  24. @Component
  25. public class SIPSender {
  26. private final Logger logger = LoggerFactory.getLogger(SIPSender.class);
  27. @Autowired
  28. private SipLayer sipLayer;
  29. @Autowired
  30. private GitUtil gitUtil;
  31. @Autowired
  32. private SipSubscribe sipSubscribe;
  33. public void transmitRequest(String ip, Message message) throws SipException, ParseException {
  34. transmitRequest(ip, message, null, null);
  35. }
  36. public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent) throws SipException, ParseException {
  37. transmitRequest(ip, message, errorEvent, null);
  38. }
  39. public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {
  40. try {
  41. ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
  42. logger.info("[server ---> device] transmitRequest ip:{} \n{}",ip,message);
  43. String transport = "UDP";
  44. if (viaHeader == null) {
  45. logger.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据");
  46. }else {
  47. transport = viaHeader.getTransport();
  48. }
  49. if (message.getHeader(UserAgentHeader.NAME) == null) {
  50. try {
  51. message.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
  52. } catch (ParseException e) {
  53. logger.error("添加UserAgentHeader失败", e);
  54. }
  55. }
  56. CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
  57. // 添加错误订阅
  58. if (errorEvent != null) {
  59. sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
  60. errorEvent.response(eventResult);
  61. sipSubscribe.removeErrorSubscribe(eventResult.callId);
  62. sipSubscribe.removeOkSubscribe(eventResult.callId);
  63. }));
  64. }
  65. // 添加订阅
  66. if (okEvent != null) {
  67. sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
  68. okEvent.response(eventResult);
  69. sipSubscribe.removeOkSubscribe(eventResult.callId);
  70. sipSubscribe.removeErrorSubscribe(eventResult.callId);
  71. });
  72. }
  73. if ("TCP".equals(transport)) {
  74. SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
  75. if (tcpSipProvider == null) {
  76. logger.error("[发送信息失败] 未找到tcp://{}的监听信息", ip);
  77. return;
  78. }
  79. if (message instanceof Request) {
  80. tcpSipProvider.sendRequest((Request)message);
  81. }else if (message instanceof Response) {
  82. tcpSipProvider.sendResponse((Response)message);
  83. }
  84. } else if ("UDP".equals(transport)) {
  85. SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
  86. if (sipProvider == null) {
  87. logger.error("[发送信息失败] 未找到udp://{}的监听信息", ip);
  88. return;
  89. }
  90. if (message instanceof Request) {
  91. sipProvider.sendRequest((Request)message);
  92. }else if (message instanceof Response) {
  93. sipProvider.sendResponse((Response)message);
  94. }
  95. }
  96. } finally {
  97. // logger.info("[SEND]:SUCCESS:{}", message);
  98. }
  99. }
  100. public CallIdHeader getNewCallIdHeader(String ip, String transport){
  101. if (ObjectUtils.isEmpty(transport)) {
  102. return sipLayer.getUdpSipProvider().getNewCallId();
  103. }
  104. SipProviderImpl sipProvider;
  105. if (ObjectUtils.isEmpty(ip)) {
  106. sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider()
  107. : sipLayer.getUdpSipProvider();
  108. }else {
  109. sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider(ip)
  110. : sipLayer.getUdpSipProvider(ip);
  111. }
  112. if (sipProvider == null) {
  113. sipProvider = sipLayer.getUdpSipProvider();
  114. }
  115. if (sipProvider != null) {
  116. return sipProvider.getNewCallId();
  117. }else {
  118. logger.warn("[新建CallIdHeader失败], ip={}, transport={}", ip, transport);
  119. return null;
  120. }
  121. }
  122. }