SipLayer.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package com.genersoft.iot.vmp.gb28181;
  2. import com.genersoft.iot.vmp.conf.SipConfig;
  3. import com.genersoft.iot.vmp.gb28181.transmit.ISIPProcessorObserver;
  4. import gov.nist.javax.sip.SipProviderImpl;
  5. import gov.nist.javax.sip.SipStackImpl;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.context.annotation.DependsOn;
  12. import javax.sip.*;
  13. import java.util.Properties;
  14. import java.util.TooManyListenersException;
  15. @Configuration
  16. public class SipLayer{
  17. private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
  18. @Autowired
  19. private SipConfig sipConfig;
  20. @Autowired
  21. private ISIPProcessorObserver sipProcessorObserver;
  22. private SipStackImpl sipStack;
  23. private SipFactory sipFactory;
  24. @Bean("sipFactory")
  25. SipFactory createSipFactory() {
  26. sipFactory = SipFactory.getInstance();
  27. sipFactory.setPathName("gov.nist");
  28. return sipFactory;
  29. }
  30. @Bean("sipStack")
  31. @DependsOn({"sipFactory"})
  32. SipStack createSipStack() throws PeerUnavailableException {
  33. Properties properties = new Properties();
  34. properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP");
  35. properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getMonitorIp());
  36. /**
  37. * 完整配置参考 gov.nist.javax.sip.SipStackImpl,需要下载源码
  38. * gov/nist/javax/sip/SipStackImpl.class
  39. */
  40. if (logger.isDebugEnabled()) {
  41. properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "false");
  42. }
  43. // 接收所有notify请求,即使没有订阅
  44. properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true");
  45. // 为_NULL _对话框传递_终止的_事件
  46. properties.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG", "true");
  47. // 会话清理策略
  48. properties.setProperty("gov.nist.javax.sip.RELEASE_REFERENCES_STRATEGY", "Normal");
  49. // 处理由该服务器处理的基于底层TCP的保持生存超时
  50. properties.setProperty("gov.nist.javax.sip.RELIABLE_CONNECTION_KEEP_ALIVE_TIMEOUT", "60");
  51. /**
  52. * sip_server_log.log 和 sip_debug_log.log ERROR, INFO, WARNING, OFF, DEBUG, TRACE
  53. */
  54. properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "ERROR");
  55. // if (logger.isDebugEnabled()) {
  56. // properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG");
  57. // }
  58. sipStack = (SipStackImpl) sipFactory.createSipStack(properties);
  59. return sipStack;
  60. }
  61. @Bean(name = "tcpSipProvider")
  62. @DependsOn("sipStack")
  63. SipProviderImpl startTcpListener() {
  64. ListeningPoint tcpListeningPoint = null;
  65. SipProviderImpl tcpSipProvider = null;
  66. try {
  67. tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "TCP");
  68. tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
  69. tcpSipProvider.setDialogErrorsAutomaticallyHandled();
  70. tcpSipProvider.addSipListener(sipProcessorObserver);
  71. // tcpSipProvider.setAutomaticDialogSupportEnabled(false);
  72. logger.info("[Sip Server] TCP 启动成功 {}:{}", sipConfig.getMonitorIp(), sipConfig.getPort());
  73. } catch (TransportNotSupportedException e) {
  74. e.printStackTrace();
  75. } catch (InvalidArgumentException e) {
  76. logger.error("[Sip Server] 无法使用 [ {}:{} ]作为SIP[ TCP ]服务,可排查: 1. sip.monitor-ip 是否为本机网卡IP; 2. sip.port 是否已被占用"
  77. , sipConfig.getMonitorIp(), sipConfig.getPort());
  78. } catch (TooManyListenersException e) {
  79. e.printStackTrace();
  80. } catch (ObjectInUseException e) {
  81. e.printStackTrace();
  82. }
  83. return tcpSipProvider;
  84. }
  85. @Bean(name = "udpSipProvider")
  86. @DependsOn("sipStack")
  87. SipProviderImpl startUdpListener() {
  88. ListeningPoint udpListeningPoint = null;
  89. SipProviderImpl udpSipProvider = null;
  90. try {
  91. udpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "UDP");
  92. udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint);
  93. udpSipProvider.addSipListener(sipProcessorObserver);
  94. // udpSipProvider.setAutomaticDialogSupportEnabled(false);
  95. } catch (TransportNotSupportedException e) {
  96. e.printStackTrace();
  97. } catch (InvalidArgumentException e) {
  98. logger.error("[Sip Server] 无法使用 [ {}:{} ]作为SIP[ UDP ]服务,可排查: 1. sip.monitor-ip 是否为本机网卡IP; 2. sip.port 是否已被占用"
  99. , sipConfig.getMonitorIp(), sipConfig.getPort());
  100. } catch (TooManyListenersException e) {
  101. e.printStackTrace();
  102. } catch (ObjectInUseException e) {
  103. e.printStackTrace();
  104. }
  105. logger.info("[Sip Server] UDP 启动成功 {}:{}", sipConfig.getMonitorIp(), sipConfig.getPort());
  106. return udpSipProvider;
  107. }
  108. }