设备注册 未完
This commit is contained in:
parent
ef96d0e6ac
commit
6bb578d1bd
@ -0,0 +1,22 @@
|
|||||||
|
package cn.skcks.docking.gb28181.core.sip.dto;
|
||||||
|
|
||||||
|
import gov.nist.javax.sip.message.SIPResponse;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class SipTransactionInfo {
|
||||||
|
|
||||||
|
private String callId;
|
||||||
|
private String fromTag;
|
||||||
|
private String toTag;
|
||||||
|
private String viaBranch;
|
||||||
|
|
||||||
|
public SipTransactionInfo(SIPResponse response) {
|
||||||
|
this.callId = response.getCallIdHeader().getCallId();
|
||||||
|
this.fromTag = response.getFromTag();
|
||||||
|
this.toTag = response.getToTag();
|
||||||
|
this.viaBranch = response.getTopmostViaHeader().getBranch();
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package cn.skcks.docking.gb28181.core.sip.sdp;
|
package cn.skcks.docking.gb28181.core.sip.gb28181.sdp;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
@ -0,0 +1,27 @@
|
|||||||
|
package cn.skcks.docking.gb28181.core.sip.gb28181.sip;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DatePattern;
|
||||||
|
import cn.hutool.core.date.format.FastDateFormat;
|
||||||
|
import gov.nist.javax.sip.header.SIPDate;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GB28181 SIP 日期
|
||||||
|
*/
|
||||||
|
public class GbSipDate extends SIPDate {
|
||||||
|
private final Calendar javaCal;
|
||||||
|
|
||||||
|
public GbSipDate(long timeMillis) {
|
||||||
|
super(timeMillis);
|
||||||
|
this.javaCal = new GregorianCalendar(TimeZone.getDefault(), Locale.getDefault());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StringBuilder encode(StringBuilder encoding) {
|
||||||
|
return encoding.append(FastDateFormat.getInstance(DatePattern.UTC_SIMPLE_MS_PATTERN, TimeZone.getTimeZone("Asia/Shanghai")).format(javaCal));
|
||||||
|
}
|
||||||
|
}
|
@ -9,6 +9,7 @@ import gov.nist.javax.sip.stack.SIPTransactionStack;
|
|||||||
import javax.sip.SipStack;
|
import javax.sip.SipStack;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public class ServerLoggerImpl implements ServerLogger {
|
public class ServerLoggerImpl implements ServerLogger {
|
||||||
|
|
||||||
private boolean showLog = true;
|
private boolean showLog = true;
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
*/
|
*/
|
||||||
package cn.skcks.docking.gb28181.core.sip.message.auth;
|
package cn.skcks.docking.gb28181.core.sip.message.auth;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.HexUtil;
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import gov.nist.core.InternalErrorHandler;
|
import gov.nist.core.InternalErrorHandler;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.ObjectUtils;
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
@ -189,6 +191,7 @@ public class DigestServerAuthenticationHelper {
|
|||||||
|
|
||||||
// nonce计数器,是一个16进制的数值,表示同一nonce下客户端发送出请求的数量
|
// nonce计数器,是一个16进制的数值,表示同一nonce下客户端发送出请求的数量
|
||||||
int nc = authHeader.getNonceCount();
|
int nc = authHeader.getNonceCount();
|
||||||
|
|
||||||
String ncStr = String.format("%08x", nc).toUpperCase();
|
String ncStr = String.format("%08x", nc).toUpperCase();
|
||||||
String A1 = String.join(":",username , realm , pass);
|
String A1 = String.join(":",username , realm , pass);
|
||||||
String A2 = String.join(":",request.getMethod().toUpperCase() , uri.toString());
|
String A2 = String.join(":",request.getMethod().toUpperCase() , uri.toString());
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package cn.skcks.docking.gb28181.core.sip.message.processor.request;
|
package cn.skcks.docking.gb28181.core.sip.message.processor.request;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.skcks.docking.gb28181.config.sip.SipConfig;
|
import cn.skcks.docking.gb28181.config.sip.SipConfig;
|
||||||
import cn.skcks.docking.gb28181.core.sip.dto.RemoteInfo;
|
import cn.skcks.docking.gb28181.core.sip.dto.RemoteInfo;
|
||||||
|
import cn.skcks.docking.gb28181.core.sip.dto.SipTransactionInfo;
|
||||||
|
import cn.skcks.docking.gb28181.core.sip.gb28181.sip.GbSipDate;
|
||||||
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;
|
||||||
@ -11,18 +14,30 @@ import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice;
|
|||||||
import cn.skcks.docking.gb28181.service.docking.DockingDeviceService;
|
import cn.skcks.docking.gb28181.service.docking.DockingDeviceService;
|
||||||
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;
|
||||||
|
import gov.nist.javax.sip.header.SIPDate;
|
||||||
|
import gov.nist.javax.sip.header.SIPDateHeader;
|
||||||
import gov.nist.javax.sip.message.SIPRequest;
|
import gov.nist.javax.sip.message.SIPRequest;
|
||||||
|
import gov.nist.javax.sip.message.SIPResponse;
|
||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.commons.lang3.math.NumberUtils;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
|
|
||||||
|
import javax.sip.ListeningPoint;
|
||||||
import javax.sip.RequestEvent;
|
import javax.sip.RequestEvent;
|
||||||
import javax.sip.address.Address;
|
import javax.sip.address.Address;
|
||||||
|
import javax.sip.header.ExpiresHeader;
|
||||||
import javax.sip.header.FromHeader;
|
import javax.sip.header.FromHeader;
|
||||||
|
import javax.sip.message.Request;
|
||||||
import javax.sip.message.Response;
|
import javax.sip.message.Response;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -61,10 +76,11 @@ public class RegisterRequestProcessor implements MessageProcessor {
|
|||||||
|
|
||||||
String password = sipConfig.getPassword();
|
String password = sipConfig.getPassword();
|
||||||
Authorization authorization = request.getAuthorization();
|
Authorization authorization = request.getAuthorization();
|
||||||
|
String senderIp = request.getLocalAddress().getHostAddress();
|
||||||
if(authorization == null && StringUtils.isNotBlank(password)){
|
if(authorization == null && StringUtils.isNotBlank(password)){
|
||||||
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);
|
sender.send(senderIp,response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,9 +91,75 @@ public class RegisterRequestProcessor implements MessageProcessor {
|
|||||||
Response response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
|
Response response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
|
||||||
response.setReasonPhrase("认证失败");
|
response.setReasonPhrase("认证失败");
|
||||||
log.info("设备注册信息认证失败 deviceId => {}", deviceId);
|
log.info("设备注册信息认证失败 deviceId => {}", deviceId);
|
||||||
sender.send(request.getLocalAddress().getHostAddress(),response);
|
sender.send(senderIp,response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
log.debug("设备 deviceId => {}, 认证通过", deviceId);
|
log.debug("设备 deviceId => {}, 认证通过", deviceId);
|
||||||
|
Response response = generateRegisterResponse(request);
|
||||||
|
if(response.getStatusCode() != Response.OK){
|
||||||
|
sender.send(senderIp, response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (deviceInfo == null) {
|
||||||
|
deviceInfo = new DockingDevice();
|
||||||
|
deviceInfo.setStreamMode(ListeningPoint.UDP);
|
||||||
|
deviceInfo.setCharset("GB2312");
|
||||||
|
deviceInfo.setGeoCoordSys("WGS84");
|
||||||
|
deviceInfo.setDeviceId(deviceId);
|
||||||
|
deviceInfo.setOnLine(false);
|
||||||
|
} else {
|
||||||
|
if (ObjectUtils.isEmpty(deviceInfo.getStreamMode())) {
|
||||||
|
deviceInfo.setStreamMode(ListeningPoint.UDP);
|
||||||
|
}
|
||||||
|
if (ObjectUtils.isEmpty(deviceInfo.getCharset())) {
|
||||||
|
deviceInfo.setCharset("GB2312");
|
||||||
|
}
|
||||||
|
if (ObjectUtils.isEmpty(deviceInfo.getGeoCoordSys())) {
|
||||||
|
deviceInfo.setGeoCoordSys("WGS84");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceInfo.setIp(remoteInfo.getIp());
|
||||||
|
deviceInfo.setPort(remoteInfo.getPort());
|
||||||
|
deviceInfo.setHostAddress(remoteInfo.getIp().concat(":").concat(String.valueOf(remoteInfo.getPort())));
|
||||||
|
deviceInfo.setLocalIp(senderIp);
|
||||||
|
|
||||||
|
int expires = request.getExpires().getExpires();
|
||||||
|
deviceInfo.setExpires(expires);
|
||||||
|
// expires == 0 时 注销
|
||||||
|
if (expires == 0) {
|
||||||
|
log.info("设备注销 deviceId => {}", deviceId);
|
||||||
|
} else {
|
||||||
|
deviceInfo.setRegisterTime(DateUtil.now());
|
||||||
|
SipTransactionInfo sipTransactionInfo = new SipTransactionInfo((SIPResponse)response);
|
||||||
|
}
|
||||||
|
|
||||||
|
sender.send(senderIp, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
private Response generateRegisterResponse(Request request){
|
||||||
|
SIPRequest sipRequest = (SIPRequest) request;
|
||||||
|
ExpiresHeader expires = sipRequest.getExpires();
|
||||||
|
if(expires == null){
|
||||||
|
return getMessageFactory().createResponse(Response.BAD_REQUEST, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
Response response = getMessageFactory().createResponse(Response.OK, request);
|
||||||
|
// 添加date头
|
||||||
|
SIPDateHeader dateHeader = new SIPDateHeader();
|
||||||
|
// GB28181 日期
|
||||||
|
GbSipDate gbSipDate = new GbSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis());
|
||||||
|
dateHeader.setDate(gbSipDate);
|
||||||
|
|
||||||
|
response.addHeader(dateHeader);
|
||||||
|
response.addHeader(sipRequest.getContactHeader());
|
||||||
|
response.addHeader(expires);
|
||||||
|
|
||||||
|
return response;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
|
|||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.skcks.docking.gb28181.common.config.ProjectConfig;
|
import cn.skcks.docking.gb28181.common.config.ProjectConfig;
|
||||||
import cn.skcks.docking.gb28181.core.sip.dto.RemoteInfo;
|
import cn.skcks.docking.gb28181.core.sip.dto.RemoteInfo;
|
||||||
import cn.skcks.docking.gb28181.core.sip.sdp.Gb28181Sdp;
|
import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.Gb28181Sdp;
|
||||||
import gov.nist.javax.sip.address.AddressImpl;
|
import gov.nist.javax.sip.address.AddressImpl;
|
||||||
import gov.nist.javax.sip.address.SipUri;
|
import gov.nist.javax.sip.address.SipUri;
|
||||||
import gov.nist.javax.sip.header.Subject;
|
import gov.nist.javax.sip.header.Subject;
|
||||||
|
Loading…
Reference in New Issue
Block a user