wvp-GB28181-pro/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java

141 lines
4.6 KiB
Java
Raw Normal View History

package com.genersoft.iot.vmp.gb28181;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting;
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;
2022-10-26 17:15:29 +08:00
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
2022-11-10 09:40:01 +08:00
import org.springframework.util.ObjectUtils;
import javax.sip.*;
2022-10-26 17:15:29 +08:00
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
2022-10-26 17:15:29 +08:00
@Component
2023-02-22 18:01:30 +08:00
@Order(value=10)
2022-10-26 17:15:29 +08:00
public class SipLayer implements CommandLineRunner {
private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
@Autowired
private SipConfig sipConfig;
@Autowired
private ISIPProcessorObserver sipProcessorObserver;
@Autowired
private UserSetting userSetting;
2022-10-26 17:15:29 +08:00
private final Map<String, SipProviderImpl> tcpSipProviderMap = new ConcurrentHashMap<>();
private final Map<String, SipProviderImpl> udpSipProviderMap = new ConcurrentHashMap<>();
2022-10-26 17:15:29 +08:00
@Override
public void run(String... args) {
List<String> 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());
}
2023-04-13 17:14:04 +08:00
SipFactory.getInstance().setPathName("gov.nist");
2022-10-26 17:15:29 +08:00
if (monitorIps.size() > 0) {
for (String monitorIp : monitorIps) {
addListeningPoint(monitorIp, sipConfig.getPort());
}
if (udpSipProviderMap.size() + tcpSipProviderMap.size() == 0) {
System.exit(1);
}
}
}
2022-10-26 17:15:29 +08:00
private void addListeningPoint(String monitorIp, int port){
SipStackImpl sipStack;
try {
2023-04-13 17:14:04 +08:00
sipStack = (SipStackImpl)SipFactory.getInstance().createSipStack(DefaultProperties.getProperties(monitorIp, userSetting.getSipLog()));
2022-10-26 17:15:29 +08:00
} catch (PeerUnavailableException e) {
logger.error("[SIP SERVER] SIP服务启动失败 监听地址{}失败,请检查ip是否正确", monitorIp);
2022-10-26 17:15:29 +08:00
return;
}
2020-10-16 09:50:19 +08:00
try {
2022-10-26 17:15:29 +08:00
ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "TCP");
SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
2022-11-17 17:01:54 +08:00
2021-12-02 17:37:29 +08:00
tcpSipProvider.setDialogErrorsAutomaticallyHandled();
tcpSipProvider.addSipListener(sipProcessorObserver);
2022-10-26 17:15:29 +08:00
tcpSipProviderMap.put(monitorIp, tcpSipProvider);
logger.info("[SIP SERVER] tcp://{}:{} 启动成功", monitorIp, port);
2022-10-26 17:15:29 +08:00
} catch (TransportNotSupportedException
| TooManyListenersException
| ObjectInUseException
| InvalidArgumentException e) {
logger.error("[SIP SERVER] tcp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确"
2022-10-26 17:15:29 +08:00
, monitorIp, port);
2020-10-16 09:50:19 +08:00
}
2022-10-26 17:15:29 +08:00
2021-07-16 16:34:51 +08:00
try {
2022-10-26 17:15:29 +08:00
ListeningPoint udpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "UDP");
SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint);
udpSipProvider.addSipListener(sipProcessorObserver);
2022-10-26 17:15:29 +08:00
udpSipProviderMap.put(monitorIp, udpSipProvider);
logger.info("[SIP SERVER] udp://{}:{} 启动成功", monitorIp, port);
2022-10-26 17:15:29 +08:00
} catch (TransportNotSupportedException
| TooManyListenersException
| ObjectInUseException
| InvalidArgumentException e) {
logger.error("[SIP SERVER] udp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确"
2022-10-26 17:15:29 +08:00
, monitorIp, port);
2021-07-16 16:34:51 +08:00
}
}
2022-10-26 17:15:29 +08:00
public SipProviderImpl getUdpSipProvider(String ip) {
2022-11-10 09:40:01 +08:00
if (ObjectUtils.isEmpty(ip)) {
return null;
}
2022-10-26 17:15:29 +08:00
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) {
2022-11-10 09:40:01 +08:00
if (ObjectUtils.isEmpty(ip)) {
return null;
}
2022-10-26 17:15:29 +08:00
return tcpSipProviderMap.get(ip);
}
2022-11-17 17:01:54 +08:00
public String getLocalIp(String deviceLocalIp) {
if (!ObjectUtils.isEmpty(deviceLocalIp)) {
return deviceLocalIp;
}
return getUdpSipProvider().getListeningPoint().getIPAddress();
}
}