SipLayer.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package com.genersoft.iot.vmp.gb28181;
  2. import java.text.ParseException;
  3. import java.util.Properties;
  4. import javax.annotation.PostConstruct;
  5. import javax.sip.DialogTerminatedEvent;
  6. import javax.sip.IOExceptionEvent;
  7. import javax.sip.ListeningPoint;
  8. import javax.sip.RequestEvent;
  9. import javax.sip.ResponseEvent;
  10. import javax.sip.ServerTransaction;
  11. import javax.sip.SipFactory;
  12. import javax.sip.SipListener;
  13. import javax.sip.SipProvider;
  14. import javax.sip.SipStack;
  15. import javax.sip.TimeoutEvent;
  16. import javax.sip.TransactionAlreadyExistsException;
  17. import javax.sip.TransactionTerminatedEvent;
  18. import javax.sip.TransactionUnavailableException;
  19. import javax.sip.address.AddressFactory;
  20. import javax.sip.header.HeaderFactory;
  21. import javax.sip.header.ViaHeader;
  22. import javax.sip.message.MessageFactory;
  23. import javax.sip.message.Request;
  24. import javax.sip.message.Response;
  25. import org.slf4j.Logger;
  26. import org.slf4j.LoggerFactory;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Component;
  29. import com.genersoft.iot.vmp.conf.SipConfig;
  30. import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorFactory;
  31. import com.genersoft.iot.vmp.gb28181.transmit.request.ISIPRequestProcessor;
  32. import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
  33. import gov.nist.javax.sip.SipStackImpl;
  34. @Component
  35. public class SipLayer implements SipListener, Runnable {
  36. private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
  37. @Autowired
  38. private SipConfig sipConfig;
  39. private SipProvider tcpSipProvider;
  40. private SipProvider udpSipProvider;
  41. @Autowired
  42. private SIPProcessorFactory processorFactory;
  43. private SipStack sipStack;
  44. private AddressFactory addressFactory;
  45. private HeaderFactory headerFactory;
  46. private MessageFactory messageFactory;
  47. @PostConstruct
  48. private void initSipServer() {
  49. Thread thread = new Thread(this);
  50. thread.setDaemon(true);
  51. thread.setName("sip server thread start");
  52. thread.start();
  53. }
  54. @Override
  55. public void run() {
  56. SipFactory sipFactory = SipFactory.getInstance();
  57. sipFactory.setPathName("gov.nist");
  58. try {
  59. headerFactory = sipFactory.createHeaderFactory();
  60. addressFactory = sipFactory.createAddressFactory();
  61. messageFactory = sipFactory.createMessageFactory();
  62. Properties properties = new Properties();
  63. properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP");
  64. properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getSipIp());
  65. properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "false");
  66. /**
  67. * sip_server_log.log 和 sip_debug_log.log public static final int TRACE_NONE =
  68. * 0; public static final int TRACE_MESSAGES = 16; public static final int
  69. * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32;
  70. */
  71. properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "32");
  72. properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sip_server_log");
  73. properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sip_debug_log");
  74. sipStack = (SipStackImpl) sipFactory.createSipStack(properties);
  75. startTcpListener();
  76. startUdpListener();
  77. } catch (Exception e) {
  78. logger.error("Sip Server 启动失败! port {" + sipConfig.getSipPort() + "}");
  79. e.printStackTrace();
  80. }
  81. logger.info("Sip Server 启动成功 port {" + sipConfig.getSipPort() + "}");
  82. }
  83. private void startTcpListener() throws Exception {
  84. ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(),
  85. "TCP");
  86. tcpSipProvider = sipStack.createSipProvider(tcpListeningPoint);
  87. tcpSipProvider.addSipListener(this);
  88. }
  89. private void startUdpListener() throws Exception {
  90. ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(),
  91. "UDP");
  92. udpSipProvider = sipStack.createSipProvider(udpListeningPoint);
  93. udpSipProvider.addSipListener(this);
  94. }
  95. /**
  96. * SIP服务端接收消息的方法 Content 里面是GBK编码 This method is called by the SIP stack when a
  97. * new request arrives.
  98. */
  99. @Override
  100. public void processRequest(RequestEvent evt) {
  101. ISIPRequestProcessor processor = processorFactory.createRequestProcessor(evt);
  102. processor.process(evt, this);
  103. }
  104. @Override
  105. public void processResponse(ResponseEvent evt) {
  106. Response response = evt.getResponse();
  107. int status = response.getStatusCode();
  108. if ((status >= 200) && (status < 300)) { // Success!
  109. ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt);
  110. try {
  111. processor.process(evt, this, sipConfig);
  112. } catch (ParseException e) {
  113. // TODO Auto-generated catch block
  114. e.printStackTrace();
  115. }
  116. // } else if (status == Response.TRYING) {
  117. // trying不会回复
  118. } else if ((status >= 100) && (status < 200)) {
  119. // 增加其它无需回复的响应,如101、180等
  120. } else {
  121. logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase()/* .getContent().toString()*/);
  122. }
  123. // trying不会回复
  124. // if (status == Response.TRYING) {
  125. // }
  126. }
  127. /**
  128. * <p>
  129. * Title: processTimeout
  130. * </p>
  131. * <p>
  132. * Description:
  133. * </p>
  134. *
  135. * @param timeoutEvent
  136. */
  137. @Override
  138. public void processTimeout(TimeoutEvent timeoutEvent) {
  139. // TODO Auto-generated method stub
  140. }
  141. /**
  142. * <p>
  143. * Title: processIOException
  144. * </p>
  145. * <p>
  146. * Description:
  147. * </p>
  148. *
  149. * @param exceptionEvent
  150. */
  151. @Override
  152. public void processIOException(IOExceptionEvent exceptionEvent) {
  153. // TODO Auto-generated method stub
  154. }
  155. /**
  156. * <p>
  157. * Title: processTransactionTerminated
  158. * </p>
  159. * <p>
  160. * Description:
  161. * </p>
  162. *
  163. * @param transactionTerminatedEvent
  164. */
  165. @Override
  166. public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
  167. // TODO Auto-generated method stub
  168. }
  169. /**
  170. * <p>
  171. * Title: processDialogTerminated
  172. * </p>
  173. * <p>
  174. * Description:
  175. * </p>
  176. *
  177. * @param dialogTerminatedEvent
  178. */
  179. @Override
  180. public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
  181. // TODO Auto-generated method stub
  182. }
  183. public ServerTransaction getServerTransaction(RequestEvent evt) {
  184. Request request = evt.getRequest();
  185. ServerTransaction serverTransaction = evt.getServerTransaction();
  186. // 判断TCP还是UDP
  187. boolean isTcp = false;
  188. ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
  189. String transport = reqViaHeader.getTransport();
  190. if (transport.equals("TCP")) {
  191. isTcp = true;
  192. }
  193. if (serverTransaction == null) {
  194. try {
  195. if (isTcp) {
  196. serverTransaction = tcpSipProvider.getNewServerTransaction(request);
  197. } else {
  198. serverTransaction = udpSipProvider.getNewServerTransaction(request);
  199. }
  200. } catch (TransactionAlreadyExistsException e) {
  201. e.printStackTrace();
  202. } catch (TransactionUnavailableException e) {
  203. e.printStackTrace();
  204. }
  205. }
  206. return serverTransaction;
  207. }
  208. public AddressFactory getAddressFactory() {
  209. return addressFactory;
  210. }
  211. public HeaderFactory getHeaderFactory() {
  212. return headerFactory;
  213. }
  214. public MessageFactory getMessageFactory() {
  215. return messageFactory;
  216. }
  217. public SipProvider getTcpSipProvider() {
  218. return tcpSipProvider;
  219. }
  220. public SipProvider getUdpSipProvider() {
  221. return udpSipProvider;
  222. }
  223. }