package com.genersoft.iot.vmp.gb28181; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.conf.DefaultProperties; import com.genersoft.iot.vmp.gb28181.transmit.ISIPProcessorObserver; import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.sip.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Component @Order(value=1) public class SipLayer implements CommandLineRunner { private final static Logger logger = LoggerFactory.getLogger(SipLayer.class); @Autowired private SipConfig sipConfig; @Autowired private ISIPProcessorObserver sipProcessorObserver; private final Map tcpSipProviderMap = new ConcurrentHashMap<>(); private final Map udpSipProviderMap = new ConcurrentHashMap<>(); private SipFactory sipFactory; @Override public void run(String... args) { List monitorIps = new ArrayList<>(); // 使用逗号分割多个ip String separator = ","; if (sipConfig.getIp().indexOf(separator) > 0) { String[] split = sipConfig.getIp().split(separator); monitorIps.addAll(Arrays.asList(split)); }else { monitorIps.add(sipConfig.getIp()); } sipFactory = SipFactory.getInstance(); sipFactory.setPathName("gov.nist"); if (monitorIps.size() > 0) { for (String monitorIp : monitorIps) { addListeningPoint(monitorIp, sipConfig.getPort()); } if (udpSipProviderMap.size() + tcpSipProviderMap.size() == 0) { System.exit(1); } } } private void addListeningPoint(String monitorIp, int port){ SipStackImpl sipStack; try { sipStack = (SipStackImpl)sipFactory.createSipStack(DefaultProperties.getProperties(monitorIp, false)); } catch (PeerUnavailableException e) { logger.error("[Sip Server] SIP服务启动失败, 监听地址{}失败,请检查ip是否正确", monitorIp); return; } try { ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "TCP"); SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint); tcpSipProvider.setDialogErrorsAutomaticallyHandled(); tcpSipProvider.addSipListener(sipProcessorObserver); tcpSipProviderMap.put(monitorIp, tcpSipProvider); logger.info("[Sip Server] tcp://{}:{} 启动成功", monitorIp, port); } catch (TransportNotSupportedException | TooManyListenersException | ObjectInUseException | InvalidArgumentException e) { logger.error("[Sip Server] tcp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确" , monitorIp, port); } try { ListeningPoint udpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "UDP"); SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint); udpSipProvider.addSipListener(sipProcessorObserver); udpSipProviderMap.put(monitorIp, udpSipProvider); logger.info("[Sip Server] udp://{}:{} 启动成功", monitorIp, port); } catch (TransportNotSupportedException | TooManyListenersException | ObjectInUseException | InvalidArgumentException e) { logger.error("[Sip Server] udp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确" , monitorIp, port); } } public SipFactory getSipFactory() { return sipFactory; } public SipProviderImpl getUdpSipProvider(String ip) { return udpSipProviderMap.get(ip); } public SipProviderImpl getUdpSipProvider() { if (udpSipProviderMap.size() != 1) { return null; } return udpSipProviderMap.values().stream().findFirst().get(); } public SipProviderImpl getTcpSipProvider() { if (tcpSipProviderMap.size() != 1) { return null; } return tcpSipProviderMap.values().stream().findFirst().get(); } public SipProviderImpl getTcpSipProvider(String ip) { return tcpSipProviderMap.get(ip); } }