设备注册 未完

This commit is contained in:
shikong 2023-08-12 15:34:54 +08:00
parent 6bb578d1bd
commit b5cb55c7ee
5 changed files with 86 additions and 59 deletions

View File

@ -1,4 +1,4 @@
package cn.skcks.docking.gb28181.core.sip.message.processor.request; package cn.skcks.docking.gb28181.core.sip.message.processor.register.request;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.skcks.docking.gb28181.config.sip.SipConfig; import cn.skcks.docking.gb28181.config.sip.SipConfig;
@ -11,10 +11,9 @@ 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.message.sender.SipMessageSender;
import cn.skcks.docking.gb28181.core.sip.utils.SipUtil; import cn.skcks.docking.gb28181.core.sip.utils.SipUtil;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice; 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.device.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.header.SIPDateHeader;
import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse; import gov.nist.javax.sip.message.SIPResponse;
@ -23,7 +22,6 @@ 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 org.springframework.util.ObjectUtils;
@ -32,12 +30,11 @@ import javax.sip.RequestEvent;
import javax.sip.address.Address; import javax.sip.address.Address;
import javax.sip.header.ExpiresHeader; import javax.sip.header.ExpiresHeader;
import javax.sip.header.FromHeader; import javax.sip.header.FromHeader;
import javax.sip.header.ViaHeader;
import javax.sip.message.Request; 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.Calendar;
import java.util.Locale; import java.util.Locale;
import java.util.Optional;
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@ -66,8 +63,8 @@ public class RegisterRequestProcessor implements MessageProcessor {
SipUri uri = (SipUri)address.getURI(); SipUri uri = (SipUri)address.getURI();
String deviceId = uri.getUser(); String deviceId = uri.getUser();
log.debug("请求注册 设备id => {}", deviceId); log.debug("请求注册 设备id => {}", deviceId);
DockingDevice deviceInfo = dockingDeviceService.getDeviceInfo(deviceId); DockingDevice device = dockingDeviceService.getDeviceInfo(deviceId);
if(deviceInfo == null){ if(device == null){
log.info("新注册的设备 deviceId => {}", deviceId); log.info("新注册的设备 deviceId => {}", deviceId);
} }
@ -104,38 +101,41 @@ public class RegisterRequestProcessor implements MessageProcessor {
} }
if (deviceInfo == null) { if (device == null) {
deviceInfo = new DockingDevice(); device = new DockingDevice();
deviceInfo.setStreamMode(ListeningPoint.UDP); device.setStreamMode(ListeningPoint.UDP);
deviceInfo.setCharset("GB2312"); device.setCharset("GB2312");
deviceInfo.setGeoCoordSys("WGS84"); device.setGeoCoordSys("WGS84");
deviceInfo.setDeviceId(deviceId); device.setDeviceId(deviceId);
deviceInfo.setOnLine(false); device.setOnLine(false);
} else { } else {
if (ObjectUtils.isEmpty(deviceInfo.getStreamMode())) { if (ObjectUtils.isEmpty(device.getStreamMode())) {
deviceInfo.setStreamMode(ListeningPoint.UDP); device.setStreamMode(ListeningPoint.UDP);
} }
if (ObjectUtils.isEmpty(deviceInfo.getCharset())) { if (ObjectUtils.isEmpty(device.getCharset())) {
deviceInfo.setCharset("GB2312"); device.setCharset("GB2312");
} }
if (ObjectUtils.isEmpty(deviceInfo.getGeoCoordSys())) { if (ObjectUtils.isEmpty(device.getGeoCoordSys())) {
deviceInfo.setGeoCoordSys("WGS84"); device.setGeoCoordSys("WGS84");
} }
} }
deviceInfo.setIp(remoteInfo.getIp()); device.setIp(remoteInfo.getIp());
deviceInfo.setPort(remoteInfo.getPort()); device.setPort(remoteInfo.getPort());
deviceInfo.setHostAddress(remoteInfo.getIp().concat(":").concat(String.valueOf(remoteInfo.getPort()))); device.setHostAddress(remoteInfo.getIp().concat(":").concat(String.valueOf(remoteInfo.getPort())));
deviceInfo.setLocalIp(senderIp); device.setLocalIp(senderIp);
ViaHeader viaHeader = request.getTopmostViaHeader();
String transport = viaHeader.getTransport();
device.setTransport(ListeningPoint.TCP.equalsIgnoreCase(transport) ? ListeningPoint.TCP : ListeningPoint.UDP);
int expires = request.getExpires().getExpires(); int expires = request.getExpires().getExpires();
deviceInfo.setExpires(expires); device.setExpires(expires);
// expires == 0 注销 // expires == 0 注销
if (expires == 0) { if (expires == 0) {
log.info("设备注销 deviceId => {}", deviceId); log.info("设备注销 deviceId => {}", deviceId);
} else { } else {
deviceInfo.setRegisterTime(DateUtil.now()); device.setRegisterTime(DateUtil.now());
SipTransactionInfo sipTransactionInfo = new SipTransactionInfo((SIPResponse)response); dockingDeviceService.online(device);
} }
sender.send(senderIp, response); sender.send(senderIp, response);

View File

@ -1,23 +0,0 @@
package cn.skcks.docking.gb28181.service.docking;
import cn.skcks.docking.gb28181.common.redis.RedisUtil;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.mapper.DockingDeviceDynamicSqlSupport;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.mapper.DockingDeviceMapper;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.springframework.stereotype.Service;
@Slf4j
@RequiredArgsConstructor
@Service
public class DockingDeviceService {
private final DockingDeviceMapper dockingDeviceMapper;
public DockingDevice getDeviceInfo(String deviceId){
return dockingDeviceMapper.selectOne((s -> {
return s.where(DockingDeviceDynamicSqlSupport.deviceId, SqlBuilder.isEqualTo(deviceId));
})).orElse(null);
}
}

View File

@ -0,0 +1,38 @@
package cn.skcks.docking.gb28181.service.docking.device;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.mapper.DockingDeviceDynamicSqlSupport;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.mapper.DockingDeviceMapper;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice;
import cn.skcks.docking.gb28181.service.docking.device.cache.DockingDeviceCacheService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class DockingDeviceService {
private final DockingDeviceMapper dockingDeviceMapper;
private final DockingDeviceCacheService deviceCacheService;
public DockingDevice getDeviceInfo(String deviceId) {
DockingDevice device = deviceCacheService.getDeviceInfo(deviceId);
if (device == null) {
device = dockingDeviceMapper
.selectOne((s -> s.where(DockingDeviceDynamicSqlSupport.deviceId, SqlBuilder.isEqualTo(deviceId))))
.orElse(null);
if (device != null) {
deviceCacheService.cacheDeviceInfo(deviceId, device);
}
}
return device;
}
public void online(DockingDevice device) {
String deviceId = device.getDeviceId();
log.info("[设备上线] deviceId => {}, {}://{}:{}", deviceId, device.getTransport(), device.getIp(), device.getPort());
dockingDeviceMapper.insert(device);
deviceCacheService.cacheDeviceInfo(deviceId, device);
}
}

View File

@ -1,9 +1,8 @@
package cn.skcks.docking.gb28181.service.cache; package cn.skcks.docking.gb28181.service.docking.device.cache;
import cn.skcks.docking.gb28181.common.json.JsonUtils; import cn.skcks.docking.gb28181.common.json.JsonUtils;
import cn.skcks.docking.gb28181.common.redis.RedisUtil; import cn.skcks.docking.gb28181.common.redis.RedisUtil;
import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice; import cn.skcks.docking.gb28181.orm.mybatis.dynamic.model.DockingDevice;
import cn.skcks.docking.gb28181.service.docking.DockingDeviceService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -13,19 +12,19 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class DockingDeviceCacheService { public class DockingDeviceCacheService {
private final DockingDeviceService dockingDeviceService;
public static final String PREFIX = "DockingDevice"; public static final String PREFIX = "DockingDevice";
public DockingDevice getDeviceInfo(String deviceId) { public DockingDevice getDeviceInfo(String deviceId) {
String key = StringUtils.joinWith(":", PREFIX, deviceId); String key = StringUtils.joinWith(":", PREFIX, deviceId);
String json = RedisUtil.StringOps.get(key); String json = RedisUtil.StringOps.get(key);
if (json == null){ if (json == null){
DockingDevice device = dockingDeviceService.getDeviceInfo(deviceId); return null;
if(device != null){
RedisUtil.StringOps.set(key, JsonUtils.toCompressJson(device));
}
return device;
} }
return JsonUtils.parse(json, DockingDevice.class); return JsonUtils.parse(json, DockingDevice.class);
} }
public void cacheDeviceInfo(String deviceId,DockingDevice device) {
String key = StringUtils.joinWith(":", PREFIX, deviceId);
RedisUtil.StringOps.set(key,JsonUtils.toCompressJson(device));
}
} }

View File

@ -5,6 +5,19 @@ project:
version: @project.version@ version: @project.version@
spring: spring:
data:
redis:
# [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
# host: 192.168.1.241
host: 10.10.10.200
# [必须修改] 端口号
port: 16379
# [可选] 数据库 DB
database: 10
# [可选] 访问密码,若你的redis服务器没有设置密码就不需要用密码去连接
password: 12341234
# [可选] 超时时间
timeout: 10000
datasource: datasource:
type: com.zaxxer.hikari.HikariDataSource type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver