消息发送, 设备注册 未完
This commit is contained in:
parent
6ca8cd7265
commit
a1b1a17d23
@ -7,8 +7,10 @@ import org.springframework.scheduling.annotation.Async;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.sip.*;
|
import javax.sip.*;
|
||||||
|
import javax.sip.header.CSeqHeader;
|
||||||
import javax.sip.header.CallIdHeader;
|
import javax.sip.header.CallIdHeader;
|
||||||
import javax.sip.message.Request;
|
import javax.sip.message.Request;
|
||||||
|
import javax.sip.message.Response;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
@ -34,7 +36,48 @@ public class SipListenerImpl implements SipListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processResponse(ResponseEvent responseEvent) {
|
public void processResponse(ResponseEvent responseEvent) {
|
||||||
|
Response response = responseEvent.getResponse();
|
||||||
|
int status = response.getStatusCode();
|
||||||
|
|
||||||
|
// Success
|
||||||
|
if (((status >= Response.OK) && (status < Response.MULTIPLE_CHOICES)) || status == Response.UNAUTHORIZED) {
|
||||||
|
CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME);
|
||||||
|
String method = cseqHeader.getMethod();
|
||||||
|
// ISIPResponseProcessor sipRequestProcessor = responseProcessorMap.get(method);
|
||||||
|
// if (sipRequestProcessor != null) {
|
||||||
|
// sipRequestProcessor.process(responseEvent);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (status != Response.UNAUTHORIZED && responseEvent.getResponse() != null && sipSubscribe.getOkSubscribesSize() > 0 ) {
|
||||||
|
// CallIdHeader callIdHeader = (CallIdHeader)responseEvent.getResponse().getHeader(CallIdHeader.NAME);
|
||||||
|
// if (callIdHeader != null) {
|
||||||
|
// SipSubscribe.Event subscribe = sipSubscribe.getOkSubscribe(callIdHeader.getCallId());
|
||||||
|
// if (subscribe != null) {
|
||||||
|
// SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(responseEvent);
|
||||||
|
// sipSubscribe.removeOkSubscribe(callIdHeader.getCallId());
|
||||||
|
// subscribe.response(eventResult);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
} else if ((status >= Response.TRYING) && (status < Response.OK)) {
|
||||||
|
// 增加其它无需回复的响应,如101、180等
|
||||||
|
} else {
|
||||||
|
log.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase());
|
||||||
|
// if (responseEvent.getResponse() != null && sipSubscribe.getErrorSubscribesSize() > 0 ) {
|
||||||
|
// CallIdHeader callIdHeader = (CallIdHeader)responseEvent.getResponse().getHeader(CallIdHeader.NAME);
|
||||||
|
// if (callIdHeader != null) {
|
||||||
|
// SipSubscribe.Event subscribe = sipSubscribe.getErrorSubscribe(callIdHeader.getCallId());
|
||||||
|
// if (subscribe != null) {
|
||||||
|
// SipSubscribe.EventResult<?> eventResult = new SipSubscribe.EventResult(responseEvent);
|
||||||
|
// subscribe.response(eventResult);
|
||||||
|
// sipSubscribe.removeErrorSubscribe(callIdHeader.getCallId());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
if (responseEvent.getDialog() != null) {
|
||||||
|
responseEvent.getDialog().delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -5,6 +5,7 @@ import cn.skcks.docking.gb28181.core.sip.dto.RemoteInfo;
|
|||||||
import cn.skcks.docking.gb28181.core.sip.listener.SipListener;
|
import cn.skcks.docking.gb28181.core.sip.listener.SipListener;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.auth.DigestServerAuthenticationHelper;
|
import cn.skcks.docking.gb28181.core.sip.message.auth.DigestServerAuthenticationHelper;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor;
|
import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor;
|
||||||
|
import cn.skcks.docking.gb28181.core.sip.message.sender.SipMessageSender;
|
||||||
import cn.skcks.docking.gb28181.core.sip.utils.SipUtil;
|
import cn.skcks.docking.gb28181.core.sip.utils.SipUtil;
|
||||||
import gov.nist.javax.sip.address.SipUri;
|
import gov.nist.javax.sip.address.SipUri;
|
||||||
import gov.nist.javax.sip.header.Authorization;
|
import gov.nist.javax.sip.header.Authorization;
|
||||||
@ -27,6 +28,7 @@ public class RegisterRequestProcessor implements MessageProcessor {
|
|||||||
private final static String METHOD = "REGISTER";
|
private final static String METHOD = "REGISTER";
|
||||||
|
|
||||||
private final SipListener sipListener;
|
private final SipListener sipListener;
|
||||||
|
private final SipMessageSender sender;
|
||||||
|
|
||||||
private final SipConfig sipConfig;
|
private final SipConfig sipConfig;
|
||||||
|
|
||||||
@ -56,5 +58,6 @@ public class RegisterRequestProcessor implements MessageProcessor {
|
|||||||
|
|
||||||
Response response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
|
Response response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
|
||||||
DigestServerAuthenticationHelper.generateChallenge(getHeaderFactory(),response,sipConfig.getDomain());
|
DigestServerAuthenticationHelper.generateChallenge(getHeaderFactory(),response,sipConfig.getDomain());
|
||||||
|
sender.send(request.getLocalAddress().getHostAddress(),response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
package cn.skcks.docking.gb28181.core.sip.message.send;
|
|
||||||
|
|
||||||
import cn.skcks.docking.gb28181.core.sip.service.SipService;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Component
|
|
||||||
public class SipMessageSender {
|
|
||||||
private final SipService sipService;
|
|
||||||
}
|
|
@ -0,0 +1,64 @@
|
|||||||
|
package cn.skcks.docking.gb28181.core.sip.message.sender;
|
||||||
|
|
||||||
|
import cn.skcks.docking.gb28181.core.sip.service.SipService;
|
||||||
|
import cn.skcks.docking.gb28181.core.sip.utils.SipUtil;
|
||||||
|
import gov.nist.javax.sip.message.SIPMessage;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.sip.ListeningPoint;
|
||||||
|
import javax.sip.PeerUnavailableException;
|
||||||
|
import javax.sip.SipException;
|
||||||
|
import javax.sip.SipProvider;
|
||||||
|
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.text.ParseException;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Component
|
||||||
|
public class SipMessageSender {
|
||||||
|
private final SipService sipService;
|
||||||
|
|
||||||
|
public void send(String ip, Message message) {
|
||||||
|
SIPMessage sipMessage = (SIPMessage)message;
|
||||||
|
ViaHeader viaHeader = sipMessage.getTopmostViaHeader();
|
||||||
|
String transport;
|
||||||
|
if(ObjectUtils.anyNull(viaHeader)){
|
||||||
|
transport = ListeningPoint.UDP;
|
||||||
|
log.warn("缺少信息头 ViaHeader, 默认使用 {} 连接发送信息",transport);
|
||||||
|
} else {
|
||||||
|
transport = viaHeader.getTransport();
|
||||||
|
}
|
||||||
|
log.debug("将使用 {} 连接发送消息", transport);
|
||||||
|
|
||||||
|
if (message.getHeader(UserAgentHeader.NAME) == null) {
|
||||||
|
try {
|
||||||
|
message.addHeader(SipUtil.createUserAgentHeader());
|
||||||
|
} catch (PeerUnavailableException | ParseException e) {
|
||||||
|
log.error("UserAgent 添加失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CallIdHeader callIdHeader = sipMessage.getCallIdHeader();
|
||||||
|
SipProvider sipProvider = sipService.getProvider(transport, ip);
|
||||||
|
Optional.ofNullable(sipProvider).ifPresentOrElse(provider->{
|
||||||
|
try {
|
||||||
|
if (message instanceof Request) {
|
||||||
|
provider.sendRequest((Request) message);
|
||||||
|
} else if (message instanceof Response) {
|
||||||
|
provider.sendResponse((Response) message);
|
||||||
|
}
|
||||||
|
} catch (SipException e) {
|
||||||
|
log.error("消息发送失败");
|
||||||
|
}
|
||||||
|
},()-> log.error("未能找到 {}://{} 监听信息", transport,ip));
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,10 @@
|
|||||||
package cn.skcks.docking.gb28181.core.sip.service;
|
package cn.skcks.docking.gb28181.core.sip.service;
|
||||||
|
|
||||||
|
import javax.sip.SipProvider;
|
||||||
|
|
||||||
public interface SipService {
|
public interface SipService {
|
||||||
void run();
|
void run();
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
|
SipProvider getProvider(String transport, String ip);
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,14 @@ public class SipServiceImpl implements SipService {
|
|||||||
pool.clear();
|
pool.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SipProvider getProvider(String transport, String ip) {
|
||||||
|
return pool.parallelStream().filter(sipProvider -> {
|
||||||
|
ListeningPoint listeningPoint = sipProvider.getListeningPoint();
|
||||||
|
return listeningPoint != null && listeningPoint.getIPAddress().equals(ip) && listeningPoint.getTransport().equalsIgnoreCase(transport);
|
||||||
|
}).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
public void listen(String ip, int port){
|
public void listen(String ip, int port){
|
||||||
try{
|
try{
|
||||||
sipStack = (SipStackImpl)sipFactory.createSipStack(DefaultProperties.getProperties("GB28181_SIP_LOG",true));
|
sipStack = (SipStackImpl)sipFactory.createSipStack(DefaultProperties.getProperties("GB28181_SIP_LOG",true));
|
||||||
|
Loading…
Reference in New Issue
Block a user