648540858
2024-03-14 d4f6ec39b7e0421757a6b9d1a68b1c4610ea2e8c
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java
@@ -5,22 +5,19 @@
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.utils.GitUtil;
import gov.nist.javax.sip.SipProviderImpl;
import gov.nist.javax.sip.message.SIPRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import javax.sip.SipException;
import javax.sip.SipFactory;
import javax.sip.header.CallIdHeader;
import javax.sip.header.UserAgentHeader;
import javax.sip.header.ViaHeader;
import javax.sip.message.Message;
import javax.sip.message.Request;
import javax.sip.message.Response;
import java.net.InetAddress;
import java.text.ParseException;
/**
@@ -49,67 +46,87 @@
        transmitRequest(ip, message, errorEvent, null);
    }
    public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {
        ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
        String transport = "UDP";
        if (viaHeader == null) {
            logger.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据");
        }else {
            transport = viaHeader.getTransport();
        }
        if (message.getHeader(UserAgentHeader.NAME) == null) {
            try {
                message.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
            } catch (ParseException e) {
                logger.error("添加UserAgentHeader失败", e);
    public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException {
            ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
            String transport = "UDP";
            if (viaHeader == null) {
                logger.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据");
            }else {
                transport = viaHeader.getTransport();
            }
        }
        CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
        // 添加错误订阅
        if (errorEvent != null) {
            sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
                errorEvent.response(eventResult);
                sipSubscribe.removeErrorSubscribe(eventResult.callId);
                sipSubscribe.removeOkSubscribe(eventResult.callId);
            }));
        }
        // 添加订阅
        if (okEvent != null) {
            sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
                okEvent.response(eventResult);
                sipSubscribe.removeOkSubscribe(eventResult.callId);
                sipSubscribe.removeErrorSubscribe(eventResult.callId);
            });
        }
        if ("TCP".equals(transport)) {
            SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
            if (tcpSipProvider == null) {
                logger.error("[发送信息失败] 未找到tcp://{}的监听信息", ip);
                return;
            }
            if (message instanceof Request) {
                tcpSipProvider.sendRequest((Request)message);
            }else if (message instanceof Response) {
                tcpSipProvider.sendResponse((Response)message);
            if (message.getHeader(UserAgentHeader.NAME) == null) {
                try {
                    message.addHeader(SipUtils.createUserAgentHeader(gitUtil));
                } catch (ParseException e) {
                    logger.error("添加UserAgentHeader失败", e);
                }
            }
        } else if ("UDP".equals(transport)) {
            SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
            if (sipProvider == null) {
                logger.error("[发送信息失败] 未找到udp://{}的监听信息", ip);
                return;
            CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
            // 添加错误订阅
            if (errorEvent != null) {
                sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
                    sipSubscribe.removeErrorSubscribe(eventResult.callId);
                    sipSubscribe.removeOkSubscribe(eventResult.callId);
                    errorEvent.response(eventResult);
                }));
            }
            if (message instanceof Request) {
                sipProvider.sendRequest((Request)message);
            }else if (message instanceof Response) {
                sipProvider.sendResponse((Response)message);
            // 添加订阅
            if (okEvent != null) {
                sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
                    sipSubscribe.removeOkSubscribe(eventResult.callId);
                    sipSubscribe.removeErrorSubscribe(eventResult.callId);
                    okEvent.response(eventResult);
                });
            }
        }
            if ("TCP".equals(transport)) {
                SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
                if (tcpSipProvider == null) {
                    logger.error("[发送信息失败] 未找到tcp://{}的监听信息", ip);
                    return;
                }
                if (message instanceof Request) {
                    tcpSipProvider.sendRequest((Request)message);
                }else if (message instanceof Response) {
                    tcpSipProvider.sendResponse((Response)message);
                }
            } else if ("UDP".equals(transport)) {
                SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
                if (sipProvider == null) {
                    logger.error("[发送信息失败] 未找到udp://{}的监听信息", ip);
                    return;
                }
                if (message instanceof Request) {
                    sipProvider.sendRequest((Request)message);
                }else if (message instanceof Response) {
                    sipProvider.sendResponse((Response)message);
                }
            }
    }
    public CallIdHeader getNewCallIdHeader(String ip, String transport){
        return  transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider(ip).getNewCallId()
                : sipLayer.getUdpSipProvider(ip).getNewCallId();
        if (ObjectUtils.isEmpty(transport)) {
            return sipLayer.getUdpSipProvider().getNewCallId();
        }
        SipProviderImpl sipProvider;
        if (ObjectUtils.isEmpty(ip)) {
            sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider()
                    : sipLayer.getUdpSipProvider();
        }else {
            sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider(ip)
                    : sipLayer.getUdpSipProvider(ip);
        }
        if (sipProvider == null) {
            sipProvider = sipLayer.getUdpSipProvider();
        }
        if (sipProvider != null) {
            return sipProvider.getNewCallId();
        }else {
            logger.warn("[新建CallIdHeader失败], ip={}, transport={}", ip, transport);
            return null;
        }
    }
}