From 7833c87303cbd1c2fc2a23c0fa346557e68702ce Mon Sep 17 00:00:00 2001 From: htjcAdmin Date: Mon, 29 Dec 2025 11:06:08 +0800 Subject: [PATCH] =?UTF-8?q?/*=E5=A2=9E=E5=8A=A0rport*/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sip/service/SipClientService.java | 21 +++++++++++++++---- .../tcpserver/sip/service/SipVideoClient.java | 1 + src/main/resources/application-dev.yml | 2 +- src/main/resources/application.yml | 4 ++-- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/inspect/tcpserver/sip/service/SipClientService.java b/src/main/java/com/inspect/tcpserver/sip/service/SipClientService.java index e2472ec..e701286 100644 --- a/src/main/java/com/inspect/tcpserver/sip/service/SipClientService.java +++ b/src/main/java/com/inspect/tcpserver/sip/service/SipClientService.java @@ -211,6 +211,11 @@ public class SipClientService implements SipListener { Properties properties = new Properties(); properties.setProperty("javax.sip.STACK_NAME", "spring-boot-sip-stack"); properties.setProperty("gov.nist.javax.sip.IP_ADDRESS", localIp); + // 新增这些(JAIN-SIP RI 支持的 NAT 参数) + properties.setProperty("gov.nist.javax.sip.OUTBOUND_PROXY", domain + ":" + port + ";" + transport); // 可选:强制出站代理 + properties.setProperty("gov.nist.javax.sip.AUTOMATIC_NAT_SUPPORT", "true"); // 如果版本支持 + properties.setProperty("gov.nist.javax.sip.USE_RPORT_AS_OUTBOUND", "true"); // 使用 rport 作为出站 + properties.setProperty("gov.nist.javax.sip.FIX_CONTACT_HEADER", "true"); // 修复 Contact properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sipdebug.txt"); properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sipserverlog.txt"); @@ -267,7 +272,7 @@ public class SipClientService implements SipListener { public void sendRegister(AuthorizationHeader authHeader) throws Exception { SipURI requestUri = addressFactory.createSipURI(null, domain); -// requestUri.setTransportParam(transport.toUpperCase()); + requestUri.setTransportParam(transport.toUpperCase()); requestUri.setPort(port); Address fromAddress = addressFactory.createAddress(username, addressFactory.createSipURI(username, domain)); @@ -279,11 +284,18 @@ public class SipClientService implements SipListener { CSeqHeader cSeq = headerFactory.createCSeqHeader(1L, Request.REGISTER); MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); + //String natIp = "172.19.1.1"; // 避免硬编码:用环境变量注入 + //int natPort = localPort; // 通常保持本地端口,或映射后端口 + String natIp = System.getenv("SIP_NAT_IP") != null ? System.getenv("SIP_NAT_IP") : localIp; + int natPort = System.getenv("SIP_NAT_PORT") != null ? Integer.parseInt(System.getenv("SIP_NAT_PORT")) : localPort; + log.info("SEND_REGISTER NAT_IP: {}, NAT_PORT: {}", natIp, natPort); // 创建带自定义deviceid参数的Contact URI - SipURI contactUri = addressFactory.createSipURI(username, localIp); - contactUri.setPort(localPort); + //SipURI contactUri = addressFactory.createSipURI(username, localIp); + SipURI contactUri = addressFactory.createSipURI(username, natIp); + //contactUri.setPort(localPort); + contactUri.setPort(natPort); contactUri.setTransportParam(transport.toUpperCase()); -// contactUri.setParameter("deviceid", "123456"); + contactUri.setParameter("deviceid", "123456"); Address contactAddress = addressFactory.createAddress(contactUri); ContactHeader contactHeader = headerFactory.createContactHeader(contactAddress); @@ -291,6 +303,7 @@ public class SipClientService implements SipListener { List viaHeaders = new ArrayList<>(); ViaHeader viaHeader = headerFactory.createViaHeader(localIp, localPort, transport.toUpperCase(), null); + viaHeader.setRPort(); viaHeaders.add(viaHeader); Request request = messageFactory.createRequest( diff --git a/src/main/java/com/inspect/tcpserver/sip/service/SipVideoClient.java b/src/main/java/com/inspect/tcpserver/sip/service/SipVideoClient.java index 8b6c0e7..fddceed 100644 --- a/src/main/java/com/inspect/tcpserver/sip/service/SipVideoClient.java +++ b/src/main/java/com/inspect/tcpserver/sip/service/SipVideoClient.java @@ -66,6 +66,7 @@ public class SipVideoClient implements SipListener { sipStack = sipFactory.createSipStack(properties); ListeningPoint lp = sipStack.createListeningPoint(localIp, localPort, transport); + //ListeningPoint lp = sipStack.createListeningPoint("0.0.0.0", localPort, transport); sipProvider = sipStack.createSipProvider(lp); sipProvider.addSipListener(this); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index ce12085..b8fa741 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -52,7 +52,7 @@ sip: domain: 192.168.1.116 # 平台SIP服务IP或域名 port: 5060 transport: tcp # 也可以为udp - local-ip: 192.168.1.11 # 本服务的外网或可达IP + local-ip: 192.168.1.8 # 本服务的外网或可达IP local-port: 5061 expires: 3600 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bb7ccee..5e8822d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -47,13 +47,13 @@ minio: bucket-name: mybucket sip: - enable: false + enable: true username: 290010021201070000 password: 123456 domain: 192.168.1.116 # 平台SIP服务IP或域名 port: 5060 transport: tcp # 也可以为udp - local-ip: 192.168.1.11 # 本服务的外网或可达IP + local-ip: 192.168.1.8 # 本服务的外网或可达IP local-port: 5061 expires: 3600