From 7a8edea181871a96bd6e94b0b0c9f820e60817d3 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Wed, 7 Jun 2023 17:41:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=B3=A8=E5=86=8C=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/初始化.sql | 2 +- .../vmp/sip/dao/SipServerAccountMapper.java | 3 + .../iot/vmp/sip/dao/SipServerMapper.java | 6 +- .../iot/vmp/sip/service/ISipService.java | 7 ++ .../vmp/sip/service/Impl/SipListenerImpl.java | 8 ++ .../iot/vmp/sip/service/Impl/SipSdkImpl.java | 5 ++ .../vmp/sip/service/Impl/SipServiceImpl.java | 10 +++ .../SipRegisterResponseProcessor.java | 73 +++++++++++++++++++ .../genersoft/iot/vmp/sip/service/SipSdk.java | 3 + .../genersoft/iot/vmp/sip/utils/SipUtils.java | 18 +++++ 10 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/genersoft/iot/vmp/sip/service/Impl/response/SipRegisterResponseProcessor.java diff --git a/sql/初始化.sql b/sql/初始化.sql index ac8cbe5b..0e528668 100644 --- a/sql/初始化.sql +++ b/sql/初始化.sql @@ -281,7 +281,7 @@ create table wvp_user_role ( create table wvp_sip_server ( id serial primary key , - local_ip character varying(50) not null , + local_ip character varying(50) null , local_port integer, server_ip character varying(50) not null , server_port integer, diff --git a/src/main/java/com/genersoft/iot/vmp/sip/dao/SipServerAccountMapper.java b/src/main/java/com/genersoft/iot/vmp/sip/dao/SipServerAccountMapper.java index ba367dc6..68e06af3 100644 --- a/src/main/java/com/genersoft/iot/vmp/sip/dao/SipServerAccountMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/sip/dao/SipServerAccountMapper.java @@ -38,4 +38,7 @@ public interface SipServerAccountMapper { @Select("SELECT * FROM wvp_sip_server_account") List all(int id); + + @Select("SELECT * FROM wvp_sip_server_account WHERE sip_server_id = #{serverId} AND username = #{username}") + SipServerAccount getOneByUsername(int serverId, String username); } diff --git a/src/main/java/com/genersoft/iot/vmp/sip/dao/SipServerMapper.java b/src/main/java/com/genersoft/iot/vmp/sip/dao/SipServerMapper.java index 9fcd467e..0d14c949 100644 --- a/src/main/java/com/genersoft/iot/vmp/sip/dao/SipServerMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/sip/dao/SipServerMapper.java @@ -33,9 +33,9 @@ public interface SipServerMapper { @Select("SELECT * FROM wvp_sip_server WHERE id = #{sipServerId}") SipServer query(int sipServerId); - @Select("SELECT * FROM wvp_sip_server WHERE id = #{sipServerId}") + @Select("SELECT * FROM wvp_sip_server") List all(); - - + @Select("SELECT * FROM wvp_sip_server WHERE server_ip = #{host} AND server_port = #{port}") + SipServer getOneByServerAddress(String host, int port); } diff --git a/src/main/java/com/genersoft/iot/vmp/sip/service/ISipService.java b/src/main/java/com/genersoft/iot/vmp/sip/service/ISipService.java index 8b5bb56d..60df96f9 100644 --- a/src/main/java/com/genersoft/iot/vmp/sip/service/ISipService.java +++ b/src/main/java/com/genersoft/iot/vmp/sip/service/ISipService.java @@ -96,4 +96,11 @@ public interface ISipService { * 移除 */ void removeSipVideo(Integer videoId); + + /** + * 使用地址信息获取服务 + */ + SipServer getSipServerByServerAddress(String removeHost, int remotePort); + + SipServerAccount getAccountByUsername(int serverId,String username); } diff --git a/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipListenerImpl.java b/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipListenerImpl.java index 022ae1a7..7599c55c 100755 --- a/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipListenerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipListenerImpl.java @@ -30,6 +30,7 @@ public class SipListenerImpl implements SipListener { private Map responseProcessorMap = new ConcurrentHashMap<>(); + @Override @Async("taskExecutor") public void processRequest(RequestEvent requestEvent) { @@ -51,6 +52,9 @@ public class SipListenerImpl implements SipListener { if (((status >= Response.OK) && (status < Response.MULTIPLE_CHOICES)) || status == Response.UNAUTHORIZED) { CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME); String method = cseqHeader.getMethod(); +// if (method.equalsIgnoreCase("REGISTER")) { +// sipRegisterResponseProcessor.process(responseEvent); +// } ISIPResponseProcessor sipRequestProcessor = responseProcessorMap.get(method); if (sipRequestProcessor != null) { sipRequestProcessor.process(responseEvent); @@ -104,4 +108,8 @@ public class SipListenerImpl implements SipListener { public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) { } + + public void addProcessor(String method, ISIPResponseProcessor processor) { + responseProcessorMap.put(method, processor); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipSdkImpl.java b/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipSdkImpl.java index 8794af51..67b02ef8 100644 --- a/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipSdkImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipSdkImpl.java @@ -132,4 +132,9 @@ public class SipSdkImpl implements SipSdk { sipProviderMap.put(sipServer.getLocalIp() + ":" + sipServer.getLocalPort(), sipProvider); return sipProvider; } + + @Override + public SipProviderImpl getProvider(String ip, int port) { + return sipProviderMap.get(ip + ":" + port); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipServiceImpl.java index 9737eeb1..94caa190 100644 --- a/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/SipServiceImpl.java @@ -159,4 +159,14 @@ public class SipServiceImpl implements ISipService { public void removeSipVideo(Integer videoId) { videoMapper.remove(videoId); } + + @Override + public SipServer getSipServerByServerAddress(String host, int port) { + return serverMapper.getOneByServerAddress(host, port); + } + + @Override + public SipServerAccount getAccountByUsername(int serverId, String username) { + return accountMapper.getOneByUsername(serverId, username); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/response/SipRegisterResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/response/SipRegisterResponseProcessor.java new file mode 100644 index 00000000..c81acf52 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/sip/service/Impl/response/SipRegisterResponseProcessor.java @@ -0,0 +1,73 @@ +package com.genersoft.iot.vmp.sip.service.Impl.response; + +import com.genersoft.iot.vmp.sip.SipCommander; +import com.genersoft.iot.vmp.sip.bean.SipServer; +import com.genersoft.iot.vmp.sip.bean.SipServerAccount; +import com.genersoft.iot.vmp.sip.service.ISIPResponseProcessor; +import com.genersoft.iot.vmp.sip.service.ISipService; +import com.genersoft.iot.vmp.sip.service.SipSdk; +import com.genersoft.iot.vmp.sip.utils.SipUtils; +import gov.nist.javax.sip.SipProviderImpl; +import gov.nist.javax.sip.message.SIPResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.sip.InvalidArgumentException; +import javax.sip.ResponseEvent; +import javax.sip.SipException; +import javax.sip.header.WWWAuthenticateHeader; +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; + +/** + * Register响应处理器 + */ +@Component +public class SipRegisterResponseProcessor implements ISIPResponseProcessor { + + private final Logger logger = LoggerFactory.getLogger(SipRegisterResponseProcessor.class); + + @Autowired + private SipCommander sipCommander; + + @Autowired + private ISipService sipService; + + @Autowired + private SipSdk sipSdk; + + + + /** + * 处理Register响应 + * + * @param evt 事件 + */ + @Override + public void process(ResponseEvent evt) { + SIPResponse response = (SIPResponse) evt.getResponse(); + if (response.getStatusCode() == 401) { + WWWAuthenticateHeader authenticateHeader = (WWWAuthenticateHeader) response.getHeader(WWWAuthenticateHeader.NAME); + String removeHost = response.getRemoteAddress().getHostAddress(); + int remotePort = response.getRemotePort(); + SipServer server = sipService.getSipServerByServerAddress(removeHost, remotePort); + String username = SipUtils.getUserFromToHeader(response.getToHeader()); + SipServerAccount account = sipService.getAccountByUsername(server.getId(), username); + SipProviderImpl sipProvider = sipSdk.getProvider(removeHost, remotePort); + try { + sipCommander.register(server, account, sipProvider, authenticateHeader, true, (code1, msg1, data1)->{ + + + + }, (code2, msg2, data2)->{ + + }); + } catch (InvalidArgumentException | SipException | ParseException | NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } + } + +} diff --git a/src/main/java/com/genersoft/iot/vmp/sip/service/SipSdk.java b/src/main/java/com/genersoft/iot/vmp/sip/service/SipSdk.java index 69c7a93b..f27c9ee2 100644 --- a/src/main/java/com/genersoft/iot/vmp/sip/service/SipSdk.java +++ b/src/main/java/com/genersoft/iot/vmp/sip/service/SipSdk.java @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.sip.service; import com.genersoft.iot.vmp.sip.bean.ResultCallback; import com.genersoft.iot.vmp.sip.bean.SipServer; import com.genersoft.iot.vmp.sip.bean.SipServerAccount; +import gov.nist.javax.sip.SipProviderImpl; import javax.sip.InvalidArgumentException; import javax.sip.ObjectInUseException; @@ -16,4 +17,6 @@ import java.util.TooManyListenersException; public interface SipSdk { void register(SipServer sipServer, SipServerAccount account, ResultCallback callback) throws PeerUnavailableException, TransportNotSupportedException, InvalidArgumentException, ObjectInUseException, TooManyListenersException; + + SipProviderImpl getProvider(String ip, int port); } diff --git a/src/main/java/com/genersoft/iot/vmp/sip/utils/SipUtils.java b/src/main/java/com/genersoft/iot/vmp/sip/utils/SipUtils.java index 0f72b8ad..63b64c15 100644 --- a/src/main/java/com/genersoft/iot/vmp/sip/utils/SipUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/sip/utils/SipUtils.java @@ -7,6 +7,9 @@ import org.springframework.util.ObjectUtils; import javax.sip.PeerUnavailableException; import javax.sip.SipFactory; +import javax.sip.address.Address; +import javax.sip.address.SipURI; +import javax.sip.header.ToHeader; import javax.sip.header.UserAgentHeader; import java.io.IOException; import java.net.DatagramSocket; @@ -80,4 +83,19 @@ public class SipUtils { public static String getNewTag(){ return String.valueOf(System.currentTimeMillis()); } + + public static String getUserFromToHeader(ToHeader toHeader) { + Address address = toHeader.getAddress(); + String displayName = address.getDisplayName(); + boolean isSipURI = address.getURI().isSipURI(); + String user = null; + if (isSipURI) { + SipURI sipURI = (SipURI) address.getURI(); + user = sipURI.getUser(); + String host = sipURI.getHost(); + int port = sipURI.getPort(); + System.out.println(1111); + } + return user; + } }