648540858
2023-02-07 922a9e8b3216ee5b6fd36ce607eaa81f6adf70ca
src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
@@ -1,9 +1,11 @@
package com.genersoft.iot.vmp.gb28181.utils;
import com.genersoft.iot.vmp.gb28181.bean.RemoteAddressInfo;
import com.genersoft.iot.vmp.utils.GitUtil;
import gov.nist.javax.sip.address.AddressImpl;
import gov.nist.javax.sip.address.SipUri;
import gov.nist.javax.sip.header.Subject;
import gov.nist.javax.sip.message.SIPRequest;
import org.springframework.util.ObjectUtils;
import javax.sip.PeerUnavailableException;
@@ -122,4 +124,48 @@
    public static String getNewCallId() {
        return (int) Math.floor(Math.random() * 10000) + "";
    }
    public static int getTypeCodeFromGbCode(String deviceId) {
        if (ObjectUtils.isEmpty(deviceId)) {
            return 0;
        }
        return Integer.parseInt(deviceId.substring(10, 13));
    }
    /**
     * 判断是否是前端外围设备
     * @param deviceId
     * @return
     */
    public static boolean isFrontEnd(String deviceId) {
        int typeCodeFromGbCode = getTypeCodeFromGbCode(deviceId);
        return typeCodeFromGbCode > 130 && typeCodeFromGbCode < 199;
    }
    /**
     * 从请求中获取设备ip地址和端口号
     * @param request 请求
     * @param sipUseSourceIpAsRemoteAddress  false 从via中获取地址, true 直接获取远程地址
     * @return 地址信息
     */
    public static RemoteAddressInfo getRemoteAddressFromRequest(SIPRequest request, boolean sipUseSourceIpAsRemoteAddress) {
        String remoteAddress;
        int remotePort;
        if (sipUseSourceIpAsRemoteAddress) {
            remoteAddress = request.getRemoteAddress().getHostAddress();
            remotePort = request.getRemotePort();
        }else {
            // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息
            // 获取到通信地址等信息
            remoteAddress = request.getTopmostViaHeader().getReceived();
            remotePort = request.getTopmostViaHeader().getRPort();
            // 解析本地地址替代
            if (ObjectUtils.isEmpty(remoteAddress) || remotePort == -1) {
                remoteAddress = request.getTopmostViaHeader().getHost();
                remotePort = request.getTopmostViaHeader().getPort();
            }
        }
        return new RemoteAddressInfo(remoteAddress, remotePort);
    }
}