Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0

This commit is contained in:
mk1990 2022-05-06 17:46:01 +08:00 committed by GitHub
commit 80d7a0cae5
68 changed files with 732 additions and 458 deletions

View File

@ -7,7 +7,6 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.oas.annotations.EnableOpenApi;

View File

@ -1,5 +1,9 @@
package com.genersoft.iot.vmp.common; package com.genersoft.iot.vmp.common;
/**
* 为API重命名, 方便向数据库记录数据的时候展示
* @author lin
*/
public class ApiSaveConstant { public class ApiSaveConstant {
public static String getVal(String key) { public static String getVal(String key) {
@ -35,35 +39,47 @@ public class ApiSaveConstant {
return "[设备控制] 强制关键帧"; return "[设备控制] 强制关键帧";
case "home_position": case "home_position":
return "[设备控制] 看守位控制"; return "[设备控制] 看守位控制";
default:
return "";
} }
break;
case "query": case "query":
if (keyItemArray.length <= 5) return null; if (keyItemArray.length <= 5) {
return null;
}
switch (keyItemArray[4]) { switch (keyItemArray[4]) {
case "devices": case "devices":
if (keyItemArray.length < 7) return null; if (keyItemArray.length < 7) {
return null;
}
switch (keyItemArray[6]) { switch (keyItemArray[6]) {
case "sync": case "sync":
return "[设备查询] 同步设备通道"; return "[设备查询] 同步设备通道";
case "delete": case "delete":
return "[设备查询] 移除设备"; return "[设备查询] 移除设备";
default:
return "";
} }
break;
case "channel": case "channel":
return "[设备查询] 更新通道信息"; return "[设备查询] 更新通道信息";
case "transport": case "transport":
return "[设备查询] 修改数据流传输模式"; return "[设备查询] 修改数据流传输模式";
default:
return "";
} }
default:
return "";
}
break; break;
}
case "gbStream": case "gbStream":
switch (keyItemArray[3]) { switch (keyItemArray[3]) {
case "del": case "del":
return "移除通道与国标的关联"; return "移除通道与国标的关联";
case "add": case "add":
return "添加通道与国标的关联"; return "添加通道与国标的关联";
default:
return "";
} }
break;
case "media": case "media":
break; break;
case "position": case "position":
@ -81,8 +97,9 @@ public class ApiSaveConstant {
return "向上级平台添加国标通道"; return "向上级平台添加国标通道";
case "del_channel_for_gb": case "del_channel_for_gb":
return "从上级平台移除国标通道"; return "从上级平台移除国标通道";
default:
return "";
} }
break;
case "platform_gb_stream": case "platform_gb_stream":
break; break;
case "play": case "play":
@ -97,32 +114,36 @@ public class ApiSaveConstant {
return "结束转码"; return "结束转码";
case "broadcast": case "broadcast":
return "语音广播"; return "语音广播";
default:
return "";
} }
break;
case "download": case "download":
switch (keyItemArray[3]) { switch (keyItemArray[3]) {
case "start": case "start":
return "开始历史媒体下载"; return "开始历史媒体下载";
case "stop": case "stop":
return "停止历史媒体下载"; return "停止历史媒体下载";
default:
return "";
} }
break;
case "playback": case "playback":
switch (keyItemArray[3]) { switch (keyItemArray[3]) {
case "start": case "start":
return "开始视频回放"; return "开始视频回放";
case "stop": case "stop":
return "停止视频回放"; return "停止视频回放";
default:
return "";
} }
break;
case "ptz": case "ptz":
switch (keyItemArray[3]) { switch (keyItemArray[3]) {
case "control": case "control":
return "云台控制"; return "云台控制";
case "front_end_command": case "front_end_command":
return "通用前端控制命令"; return "通用前端控制命令";
default:
return "";
} }
break;
case "gb_record": case "gb_record":
break; break;
case "onvif": case "onvif":
@ -142,16 +163,18 @@ public class ApiSaveConstant {
return "启用代理"; return "启用代理";
case "stop": case "stop":
return "停用代理"; return "停用代理";
default:
return "";
} }
break;
case "push": case "push":
switch (keyItemArray[3]) { switch (keyItemArray[3]) {
case "save_to_gb": case "save_to_gb":
return "将推流添加到国标"; return "将推流添加到国标";
case "remove_form_gb": case "remove_form_gb":
return "将推流移出到国标"; return "将推流移出到国标";
default:
return "";
} }
break;
case "user": case "user":
switch (keyItemArray[3]) { switch (keyItemArray[3]) {
case "login": case "login":
@ -162,8 +185,11 @@ public class ApiSaveConstant {
return "添加用户"; return "添加用户";
case "delete": case "delete":
return "删除用户"; return "删除用户";
default:
return "";
} }
break; default:
return "";
} }
} }
return null; return null;

View File

@ -7,6 +7,10 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
/**
* ThreadPoolTask 配置类
* @author lin
*/
@Configuration @Configuration
@EnableAsync(proxyTargetClass = true) @EnableAsync(proxyTargetClass = true)
public class ThreadPoolTaskConfig { public class ThreadPoolTaskConfig {
@ -40,6 +44,10 @@ public class ThreadPoolTaskConfig {
*/ */
private static final String threadNamePrefix = "wvp-"; private static final String threadNamePrefix = "wvp-";
/**
*
* @return
*/
@Bean("taskExecutor") // bean的名称默认为首字母小写的方法名 @Bean("taskExecutor") // bean的名称默认为首字母小写的方法名
public ThreadPoolTaskExecutor taskExecutor() { public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.conf; package com.genersoft.iot.vmp.conf;
import io.swagger.models.auth.In;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -19,7 +20,7 @@ public class UserSetting {
private Boolean seniorSdp = Boolean.FALSE; private Boolean seniorSdp = Boolean.FALSE;
private Long playTimeout = 18000L; private Integer playTimeout = 18000;
private int platformPlayTimeout = 60000; private int platformPlayTimeout = 60000;
@ -55,7 +56,7 @@ public class UserSetting {
return seniorSdp; return seniorSdp;
} }
public Long getPlayTimeout() { public Integer getPlayTimeout() {
return playTimeout; return playTimeout;
} }
@ -83,7 +84,7 @@ public class UserSetting {
this.seniorSdp = seniorSdp; this.seniorSdp = seniorSdp;
} }
public void setPlayTimeout(Long playTimeout) { public void setPlayTimeout(Integer playTimeout) {
this.playTimeout = playTimeout; this.playTimeout = playTimeout;
} }

View File

@ -13,6 +13,7 @@ import java.io.IOException;
/** /**
* 处理匿名用户访问逻辑 * 处理匿名用户访问逻辑
* @author lin
*/ */
@Component @Component
public class AnonymousAuthenticationEntryPoint implements AuthenticationEntryPoint { public class AnonymousAuthenticationEntryPoint implements AuthenticationEntryPoint {
@ -21,7 +22,6 @@ public class AnonymousAuthenticationEntryPoint implements AuthenticationEntryPoi
@Override @Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) {
// logger.debug("用户需要登录,访问[{}]失败AuthenticationException=[{}]", request.getRequestURI(), e.getMessage());
// 允许跨域 // 允许跨域
response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Origin", "*");
// 允许自定义请求头token(允许head跨域) // 允许自定义请求头token(允许head跨域)
@ -30,7 +30,8 @@ public class AnonymousAuthenticationEntryPoint implements AuthenticationEntryPoi
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("code", "-1"); jsonObject.put("code", "-1");
jsonObject.put("msg", "请登录后重新请求"); jsonObject.put("msg", "请登录后重新请求");
if (request.getRequestURI().contains("api/user/login")){ String logUri = "api/user/login";
if (request.getRequestURI().contains(logUri)){
jsonObject.put("msg", e.getMessage()); jsonObject.put("msg", e.getMessage());
} }
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

View File

@ -8,6 +8,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -18,7 +19,7 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Component @Configuration
public class SipLayer{ public class SipLayer{
private final static Logger logger = LoggerFactory.getLogger(SipLayer.class); private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
@ -35,7 +36,7 @@ public class SipLayer{
@Bean("sipFactory") @Bean("sipFactory")
private SipFactory createSipFactory() { SipFactory createSipFactory() {
sipFactory = SipFactory.getInstance(); sipFactory = SipFactory.getInstance();
sipFactory.setPathName("gov.nist"); sipFactory.setPathName("gov.nist");
return sipFactory; return sipFactory;
@ -43,7 +44,7 @@ public class SipLayer{
@Bean("sipStack") @Bean("sipStack")
@DependsOn({"sipFactory"}) @DependsOn({"sipFactory"})
private SipStack createSipStack() throws PeerUnavailableException { SipStack createSipStack() throws PeerUnavailableException {
Properties properties = new Properties(); Properties properties = new Properties();
properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP"); properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP");
properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getMonitorIp()); properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getMonitorIp());
@ -64,7 +65,7 @@ public class SipLayer{
@Bean(name = "tcpSipProvider") @Bean(name = "tcpSipProvider")
@DependsOn("sipStack") @DependsOn("sipStack")
private SipProviderImpl startTcpListener() { SipProviderImpl startTcpListener() {
ListeningPoint tcpListeningPoint = null; ListeningPoint tcpListeningPoint = null;
SipProviderImpl tcpSipProvider = null; SipProviderImpl tcpSipProvider = null;
try { try {
@ -89,7 +90,7 @@ public class SipLayer{
@Bean(name = "udpSipProvider") @Bean(name = "udpSipProvider")
@DependsOn("sipStack") @DependsOn("sipStack")
private SipProviderImpl startUdpListener() { SipProviderImpl startUdpListener() {
ListeningPoint udpListeningPoint = null; ListeningPoint udpListeningPoint = null;
SipProviderImpl udpSipProvider = null; SipProviderImpl udpSipProvider = null;
try { try {

View File

@ -129,7 +129,9 @@ public class DigestServerAuthenticationHelper {
*/ */
public boolean doAuthenticateHashedPassword(Request request, String hashedPassword) { public boolean doAuthenticateHashedPassword(Request request, String hashedPassword) {
AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
if ( authHeader == null ) return false; if ( authHeader == null ) {
return false;
}
String realm = authHeader.getRealm(); String realm = authHeader.getRealm();
String username = authHeader.getUsername(); String username = authHeader.getUsername();
@ -176,7 +178,9 @@ public class DigestServerAuthenticationHelper {
*/ */
public boolean doAuthenticatePlainTextPassword(Request request, String pass) { public boolean doAuthenticatePlainTextPassword(Request request, String pass) {
AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
if ( authHeader == null ) return false; if ( authHeader == null ) {
return false;
}
String realm = authHeader.getRealm().trim(); String realm = authHeader.getRealm().trim();
String username = authHeader.getUsername().trim(); String username = authHeader.getUsername().trim();

View File

@ -0,0 +1,40 @@
package com.genersoft.iot.vmp.gb28181.bean;
/**
* 报警方式
* @author lin
* 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警,
* 7其他报警;可以为直接组合如12为电话报警或 设备报警-
*/
public enum DeviceAlarmMethod {
// 1为电话报警
Telephone(1),
// 2为设备报警
Device(2),
// 3为短信报警
SMS(3),
// 4为 GPS报警
GPS(4),
// 5为视频报警
Video(5),
// 6为设备故障报警
DeviceFailure(6),
// 7其他报警
Other(7);
private final int val;
DeviceAlarmMethod(int val) {
this.val=val;
}
public int getVal() {
return val;
}
}

View File

@ -25,6 +25,7 @@ public class GbStream extends PlatformGbStream{
return gbStreamId; return gbStreamId;
} }
@Override
public void setGbStreamId(Integer gbStreamId) { public void setGbStreamId(Integer gbStreamId) {
this.gbStreamId = gbStreamId; this.gbStreamId = gbStreamId;
} }

View File

@ -59,7 +59,9 @@ public class SubscribeHolder {
mobilePositionMap.put(platformId, subscribeInfo); mobilePositionMap.put(platformId, subscribeInfo);
String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + "MobilePosition_" + platformId; String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + "MobilePosition_" + platformId;
// 添加任务处理GPS定时推送 // 添加任务处理GPS定时推送
dynamicTask.startCron(key, new MobilePositionSubscribeHandlerTask(redisCatchStorage, sipCommanderForPlatform, storager, platformId, subscribeInfo.getSn(), key, this), subscribeInfo.getGpsInterval()); dynamicTask.startCron(key, new MobilePositionSubscribeHandlerTask(redisCatchStorage, sipCommanderForPlatform,
storager, platformId, subscribeInfo.getSn(), key, this, dynamicTask),
subscribeInfo.getGpsInterval());
String taskOverdueKey = taskOverduePrefix + "MobilePosition_" + platformId; String taskOverdueKey = taskOverduePrefix + "MobilePosition_" + platformId;
dynamicTask.stop(taskOverdueKey); dynamicTask.stop(taskOverdueKey);
// 添加任务处理订阅过期 // 添加任务处理订阅过期

View File

@ -1,28 +0,0 @@
package com.genersoft.iot.vmp.gb28181.event;
import com.genersoft.iot.vmp.conf.UserSetting;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
/**
* @description:设备离在线状态检测器用于检测设备状态
* @author: swwheihei
* @date: 2020年5月13日 下午2:40:29
*/
@Component
public class DeviceOffLineDetector {
@Autowired
private RedisUtil redis;
@Autowired
private UserSetting userSetting;
public boolean isOnline(String deviceId) {
String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + deviceId;
return redis.hasKey(key);
}
}

View File

@ -62,7 +62,9 @@ public class OnlineEventListener implements ApplicationListener<OnlineEvent> {
logger.info("设备上线事件触发deviceId" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); logger.info("设备上线事件触发deviceId" + event.getDevice().getDeviceId() + ",from:" + event.getFrom());
Device device = event.getDevice(); Device device = event.getDevice();
if (device == null) return; if (device == null) {
return;
}
String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDevice().getDeviceId(); String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDevice().getDeviceId();
Device deviceInStore = storager.queryVideoDevice(device.getDeviceId()); Device deviceInStore = storager.queryVideoDevice(device.getDeviceId());
device.setOnline(1); device.setOnline(1);

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.gb28181.event.platformNotRegister; package com.genersoft.iot.vmp.gb28181.event.platformNotRegister;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
@ -22,6 +23,8 @@ public class PlatformCycleRegisterEventLister implements ApplicationListener<Pla
private IVideoManagerStorage storager; private IVideoManagerStorage storager;
@Autowired @Autowired
private ISIPCommanderForPlatform sipCommanderFroPlatform; private ISIPCommanderForPlatform sipCommanderFroPlatform;
@Autowired
private DynamicTask dynamicTask;
@Override @Override
public void onApplicationEvent(PlatformCycleRegisterEvent event) { public void onApplicationEvent(PlatformCycleRegisterEvent event) {
@ -31,17 +34,13 @@ public class PlatformCycleRegisterEventLister implements ApplicationListener<Pla
logger.info("[ 平台未注册事件 ] 平台已经删除!!! 平台国标ID" + event.getPlatformGbID()); logger.info("[ 平台未注册事件 ] 平台已经删除!!! 平台国标ID" + event.getPlatformGbID());
return; return;
} }
Timer timer = new Timer(); String taskKey = "platform-cycle-register" + parentPlatform.getServerGBId();;
SipSubscribe.Event okEvent = (responseEvent)->{ SipSubscribe.Event okEvent = (responseEvent)->{
timer.cancel(); dynamicTask.stop(taskKey);
}; };
sipCommanderFroPlatform.register(parentPlatform, null, okEvent); dynamicTask.startCron(taskKey, ()->{
timer.schedule(new TimerTask() {
@Override
public void run() {
logger.info("[平台注册]再次向平台注册平台国标ID" + event.getPlatformGbID()); logger.info("[平台注册]再次向平台注册平台国标ID" + event.getPlatformGbID());
sipCommanderFroPlatform.register(parentPlatform, null, okEvent); sipCommanderFroPlatform.register(parentPlatform, null, okEvent);
} }, Integer.parseInt(parentPlatform.getExpires())* 1000);
}, 15*1000 ,Long.parseLong(parentPlatform.getExpires())* 1000);
} }
} }

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.gb28181.event.platformNotRegister; package com.genersoft.iot.vmp.gb28181.event.platformNotRegister;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
@ -46,6 +47,9 @@ public class PlatformNotRegisterEventLister implements ApplicationListener<Platf
@Autowired @Autowired
private SipConfig config; private SipConfig config;
@Autowired
private DynamicTask dynamicTask;
// @Autowired // @Autowired
// private RedisUtil redis; // private RedisUtil redis;
@ -75,19 +79,13 @@ public class PlatformNotRegisterEventLister implements ApplicationListener<Platf
} }
} }
Timer timer = new Timer(); String taskKey = "platform-not-register-" + parentPlatform.getServerGBId();
SipSubscribe.Event okEvent = (responseEvent)->{ SipSubscribe.Event okEvent = (responseEvent)->{
timer.cancel(); dynamicTask.stop(taskKey);
}; };
logger.info("[平台注册]平台国标ID" + event.getPlatformGbID()); dynamicTask.startCron(taskKey, ()->{
sipCommanderFroPlatform.register(parentPlatform, null, okEvent);
// 设置注册失败则每隔15秒发起一次注册
timer.schedule(new TimerTask() {
@Override
public void run() {
logger.info("[平台注册]再次向平台注册平台国标ID" + event.getPlatformGbID()); logger.info("[平台注册]再次向平台注册平台国标ID" + event.getPlatformGbID());
sipCommanderFroPlatform.register(parentPlatform, null, okEvent); sipCommanderFroPlatform.register(parentPlatform, null, okEvent);
} }, config.getRegisterTimeInterval()* 1000);
}, config.getRegisterTimeInterval()* 1000, config.getRegisterTimeInterval()* 1000);//十五秒后再次发起注册
} }
} }

View File

@ -60,7 +60,9 @@ public class CatalogEventLister implements ApplicationListener<CatalogEvent> {
Map<String, List<ParentPlatform>> parentPlatformMap = new HashMap<>(); Map<String, List<ParentPlatform>> parentPlatformMap = new HashMap<>();
if (event.getPlatformId() != null) { if (event.getPlatformId() != null) {
parentPlatform = storager.queryParentPlatByServerGBId(event.getPlatformId()); parentPlatform = storager.queryParentPlatByServerGBId(event.getPlatformId());
if (parentPlatform != null && !parentPlatform.isStatus())return; if (parentPlatform != null && !parentPlatform.isStatus()) {
return;
}
subscribe = subscribeHolder.getCatalogSubscribe(event.getPlatformId()); subscribe = subscribeHolder.getCatalogSubscribe(event.getPlatformId());
if (subscribe == null) { if (subscribe == null) {
@ -80,7 +82,9 @@ public class CatalogEventLister implements ApplicationListener<CatalogEvent> {
}else if (event.getGbStreams() != null) { }else if (event.getGbStreams() != null) {
if (platforms.size() > 0) { if (platforms.size() > 0) {
for (GbStream gbStream : event.getGbStreams()) { for (GbStream gbStream : event.getGbStreams()) {
if (gbStream == null || StringUtils.isEmpty(gbStream.getGbId())) continue; if (gbStream == null || StringUtils.isEmpty(gbStream.getGbId())) {
continue;
}
List<ParentPlatform> parentPlatformsForGB = storager.queryPlatFormListForStreamWithGBId(gbStream.getApp(),gbStream.getStream(), platforms); List<ParentPlatform> parentPlatformsForGB = storager.queryPlatFormListForStreamWithGBId(gbStream.getApp(),gbStream.getStream(), platforms);
parentPlatformMap.put(gbStream.getGbId(), parentPlatformsForGB); parentPlatformMap.put(gbStream.getGbId(), parentPlatformsForGB);
} }
@ -113,7 +117,9 @@ public class CatalogEventLister implements ApplicationListener<CatalogEvent> {
if (parentPlatforms != null && parentPlatforms.size() > 0) { if (parentPlatforms != null && parentPlatforms.size() > 0) {
for (ParentPlatform platform : parentPlatforms) { for (ParentPlatform platform : parentPlatforms) {
SubscribeInfo subscribeInfo = subscribeHolder.getCatalogSubscribe(platform.getServerGBId()); SubscribeInfo subscribeInfo = subscribeHolder.getCatalogSubscribe(platform.getServerGBId());
if (subscribeInfo == null) continue; if (subscribeInfo == null) {
continue;
}
logger.info("[Catalog事件: {}]平台:{},影响通道{}", event.getType(), platform.getServerGBId(), gbId); logger.info("[Catalog事件: {}]平台:{},影响通道{}", event.getType(), platform.getServerGBId(), gbId);
List<DeviceChannel> deviceChannelList = new ArrayList<>(); List<DeviceChannel> deviceChannelList = new ArrayList<>();
DeviceChannel deviceChannel = new DeviceChannel(); DeviceChannel deviceChannel = new DeviceChannel();
@ -155,7 +161,9 @@ public class CatalogEventLister implements ApplicationListener<CatalogEvent> {
if (parentPlatforms != null && parentPlatforms.size() > 0) { if (parentPlatforms != null && parentPlatforms.size() > 0) {
for (ParentPlatform platform : parentPlatforms) { for (ParentPlatform platform : parentPlatforms) {
SubscribeInfo subscribeInfo = subscribeHolder.getCatalogSubscribe(platform.getServerGBId()); SubscribeInfo subscribeInfo = subscribeHolder.getCatalogSubscribe(platform.getServerGBId());
if (subscribeInfo == null) continue; if (subscribeInfo == null) {
continue;
}
logger.info("[Catalog事件: {}]平台:{},影响通道{}", event.getType(), platform.getServerGBId(), gbId); logger.info("[Catalog事件: {}]平台:{},影响通道{}", event.getType(), platform.getServerGBId(), gbId);
List<DeviceChannel> deviceChannelList = new ArrayList<>(); List<DeviceChannel> deviceChannelList = new ArrayList<>();
DeviceChannel deviceChannel = storager.queryChannelInParentPlatform(platform.getServerGBId(), gbId); DeviceChannel deviceChannel = storager.queryChannelInParentPlatform(platform.getServerGBId(), gbId);

View File

@ -65,19 +65,25 @@ public class CatalogDataCatch {
public List<DeviceChannel> get(String deviceId) { public List<DeviceChannel> get(String deviceId) {
CatalogData catalogData = data.get(deviceId); CatalogData catalogData = data.get(deviceId);
if (catalogData == null) return null; if (catalogData == null) {
return null;
}
return catalogData.getChannelList(); return catalogData.getChannelList();
} }
public int getTotal(String deviceId) { public int getTotal(String deviceId) {
CatalogData catalogData = data.get(deviceId); CatalogData catalogData = data.get(deviceId);
if (catalogData == null) return 0; if (catalogData == null) {
return 0;
}
return catalogData.getTotal(); return catalogData.getTotal();
} }
public SyncStatus getSyncStatus(String deviceId) { public SyncStatus getSyncStatus(String deviceId) {
CatalogData catalogData = data.get(deviceId); CatalogData catalogData = data.get(deviceId);
if (catalogData == null) return null; if (catalogData == null) {
return null;
}
SyncStatus syncStatus = new SyncStatus(); SyncStatus syncStatus = new SyncStatus();
syncStatus.setCurrent(catalogData.getChannelList().size()); syncStatus.setCurrent(catalogData.getChannelList().size());
syncStatus.setTotal(catalogData.getTotal()); syncStatus.setTotal(catalogData.getTotal());
@ -87,7 +93,9 @@ public class CatalogDataCatch {
public boolean isSyncRunning(String deviceId) { public boolean isSyncRunning(String deviceId) {
CatalogData catalogData = data.get(deviceId); CatalogData catalogData = data.get(deviceId);
if (catalogData == null) return false; if (catalogData == null) {
return false;
}
return !catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end); return !catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end);
} }
@ -125,7 +133,9 @@ public class CatalogDataCatch {
public void setChannelSyncEnd(String deviceId, String errorMsg) { public void setChannelSyncEnd(String deviceId, String errorMsg) {
CatalogData catalogData = data.get(deviceId); CatalogData catalogData = data.get(deviceId);
if (catalogData == null)return; if (catalogData == null) {
return;
}
catalogData.setStatus(CatalogData.CatalogDataStatus.end); catalogData.setStatus(CatalogData.CatalogDataStatus.end);
catalogData.setErrorMsg(errorMsg); catalogData.setErrorMsg(errorMsg);
} }

View File

@ -78,7 +78,9 @@ public class VideoStreamSessionManager {
public ClientTransaction getTransactionByStream(String deviceId, String channelId, String stream){ public ClientTransaction getTransactionByStream(String deviceId, String channelId, String stream){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) return null; if (ssrcTransaction == null) {
return null;
}
byte[] transactionByteArray = ssrcTransaction.getTransaction(); byte[] transactionByteArray = ssrcTransaction.getTransaction();
ClientTransaction clientTransaction = (ClientTransaction)SerializeUtils.deSerialize(transactionByteArray); ClientTransaction clientTransaction = (ClientTransaction)SerializeUtils.deSerialize(transactionByteArray);
return clientTransaction; return clientTransaction;
@ -86,39 +88,63 @@ public class VideoStreamSessionManager {
public SIPDialog getDialogByStream(String deviceId, String channelId, String stream){ public SIPDialog getDialogByStream(String deviceId, String channelId, String stream){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) return null; if (ssrcTransaction == null) {
return null;
}
byte[] dialogByteArray = ssrcTransaction.getDialog(); byte[] dialogByteArray = ssrcTransaction.getDialog();
if (dialogByteArray == null) return null; if (dialogByteArray == null) {
return null;
}
SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray); SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray);
return dialog; return dialog;
} }
public SIPDialog getDialogByCallId(String deviceId, String channelId, String callID){ public SIPDialog getDialogByCallId(String deviceId, String channelId, String callID){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callID, null); SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callID, null);
if (ssrcTransaction == null) return null; if (ssrcTransaction == null) {
return null;
}
byte[] dialogByteArray = ssrcTransaction.getDialog(); byte[] dialogByteArray = ssrcTransaction.getDialog();
if (dialogByteArray == null) return null; if (dialogByteArray == null) {
return null;
}
SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray); SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray);
return dialog; return dialog;
} }
public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){ public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){
if (StringUtils.isEmpty(callId)) callId ="*"; if (StringUtils.isEmpty(callId)) {
if (StringUtils.isEmpty(stream)) stream ="*"; callId ="*";
}
if (StringUtils.isEmpty(stream)) {
stream ="*";
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream; String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
List<Object> scanResult = redisUtil.scan(key); List<Object> scanResult = redisUtil.scan(key);
if (scanResult.size() == 0) return null; if (scanResult.size() == 0) {
return null;
}
return (SsrcTransaction)redisUtil.get((String) scanResult.get(0)); return (SsrcTransaction)redisUtil.get((String) scanResult.get(0));
} }
public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream){ public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream){
if (StringUtils.isEmpty(deviceId)) deviceId ="*"; if (StringUtils.isEmpty(deviceId)) {
if (StringUtils.isEmpty(channelId)) channelId ="*"; deviceId ="*";
if (StringUtils.isEmpty(callId)) callId ="*"; }
if (StringUtils.isEmpty(stream)) stream ="*"; if (StringUtils.isEmpty(channelId)) {
channelId ="*";
}
if (StringUtils.isEmpty(callId)) {
callId ="*";
}
if (StringUtils.isEmpty(stream)) {
stream ="*";
}
String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream; String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
List<Object> scanResult = redisUtil.scan(key); List<Object> scanResult = redisUtil.scan(key);
if (scanResult.size() == 0) return null; if (scanResult.size() == 0) {
return null;
}
List<SsrcTransaction> result = new ArrayList<>(); List<SsrcTransaction> result = new ArrayList<>();
for (Object keyObj : scanResult) { for (Object keyObj : scanResult) {
result.add((SsrcTransaction)redisUtil.get((String) keyObj)); result.add((SsrcTransaction)redisUtil.get((String) keyObj));
@ -128,19 +154,25 @@ public class VideoStreamSessionManager {
public String getMediaServerId(String deviceId, String channelId, String stream){ public String getMediaServerId(String deviceId, String channelId, String stream){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) return null; if (ssrcTransaction == null) {
return null;
}
return ssrcTransaction.getMediaServerId(); return ssrcTransaction.getMediaServerId();
} }
public String getSSRC(String deviceId, String channelId, String stream){ public String getSSRC(String deviceId, String channelId, String stream){
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) return null; if (ssrcTransaction == null) {
return null;
}
return ssrcTransaction.getSsrc(); return ssrcTransaction.getSsrc();
} }
public void remove(String deviceId, String channelId, String stream) { public void remove(String deviceId, String channelId, String stream) {
SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
if (ssrcTransaction == null) return; if (ssrcTransaction == null) {
return;
}
redisUtil.del(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" redisUtil.del(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_"
+ deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream()); + deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream());
} }

View File

@ -2,6 +2,9 @@ package com.genersoft.iot.vmp.gb28181.task;
import javax.sip.DialogState; import javax.sip.DialogState;
/**
* @author lin
*/
public interface ISubscribeTask extends Runnable{ public interface ISubscribeTask extends Runnable{
void stop(); void stop();

View File

@ -1,11 +1,13 @@
package com.genersoft.iot.vmp.gb28181.task.impl; package com.genersoft.iot.vmp.gb28181.task.impl;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import javax.sip.Dialog; import javax.sip.Dialog;
import javax.sip.DialogState; import javax.sip.DialogState;
@ -15,6 +17,7 @@ import java.util.TimerTask;
/** /**
* 目录订阅任务 * 目录订阅任务
* @author lin
*/ */
public class CatalogSubscribeTask implements ISubscribeTask { public class CatalogSubscribeTask implements ISubscribeTask {
private final Logger logger = LoggerFactory.getLogger(CatalogSubscribeTask.class); private final Logger logger = LoggerFactory.getLogger(CatalogSubscribeTask.class);
@ -22,18 +25,21 @@ public class CatalogSubscribeTask implements ISubscribeTask {
private final ISIPCommander sipCommander; private final ISIPCommander sipCommander;
private Dialog dialog; private Dialog dialog;
private Timer timer ; private DynamicTask dynamicTask;
public CatalogSubscribeTask(Device device, ISIPCommander sipCommander) { private String taskKey = "catalog-subscribe-timeout";
public CatalogSubscribeTask(Device device, ISIPCommander sipCommander, DynamicTask dynamicTask) {
this.device = device; this.device = device;
this.sipCommander = sipCommander; this.sipCommander = sipCommander;
this.dynamicTask = dynamicTask;
} }
@Override @Override
public void run() { public void run() {
if (timer != null ) { if (dynamicTask.get(taskKey) != null) {
timer.cancel(); dynamicTask.stop(taskKey);
timer = null;
} }
sipCommander.catalogSubscribe(device, dialog, eventResult -> { sipCommander.catalogSubscribe(device, dialog, eventResult -> {
if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) { if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) {
@ -51,13 +57,7 @@ public class CatalogSubscribeTask implements ISubscribeTask {
dialog = null; dialog = null;
// 失败 // 失败
logger.warn("[目录订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg); logger.warn("[目录订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg);
timer = new Timer(); dynamicTask.startDelay(taskKey, CatalogSubscribeTask.this, 2000);
timer.schedule(new TimerTask() {
@Override
public void run() {
CatalogSubscribeTask.this.run();
}
}, 2000);
}); });
} }
@ -71,9 +71,8 @@ public class CatalogSubscribeTask implements ISubscribeTask {
* TERMINATED-> Terminated Dialog状态-终止 * TERMINATED-> Terminated Dialog状态-终止
*/ */
logger.info("取消目录订阅时dialog状态为{}", DialogState.CONFIRMED); logger.info("取消目录订阅时dialog状态为{}", DialogState.CONFIRMED);
if (timer != null ) { if (dynamicTask.get(taskKey) != null) {
timer.cancel(); dynamicTask.stop(taskKey);
timer = null;
} }
if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) { if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) {
device.setSubscribeCycleForCatalog(0); device.setSubscribeCycleForCatalog(0);
@ -95,7 +94,9 @@ public class CatalogSubscribeTask implements ISubscribeTask {
@Override @Override
public DialogState getDialogState() { public DialogState getDialogState() {
if (dialog == null) return null; if (dialog == null) {
return null;
}
return dialog.getState(); return dialog.getState();
} }
} }

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.gb28181.task.impl; package com.genersoft.iot.vmp.gb28181.task.impl;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
@ -15,6 +16,7 @@ import java.util.List;
/** /**
* 向已经订阅(移动位置)的上级发送MobilePosition消息 * 向已经订阅(移动位置)的上级发送MobilePosition消息
* @author lin
*/ */
public class MobilePositionSubscribeHandlerTask implements ISubscribeTask { public class MobilePositionSubscribeHandlerTask implements ISubscribeTask {
@ -25,10 +27,18 @@ public class MobilePositionSubscribeHandlerTask implements ISubscribeTask {
private ISIPCommanderForPlatform sipCommanderForPlatform; private ISIPCommanderForPlatform sipCommanderForPlatform;
private SubscribeHolder subscribeHolder; private SubscribeHolder subscribeHolder;
private ParentPlatform platform; private ParentPlatform platform;
private String sn; private String sn;
private String key; private String key;
public MobilePositionSubscribeHandlerTask(IRedisCatchStorage redisCatchStorage, ISIPCommanderForPlatform sipCommanderForPlatform, IVideoManagerStorage storager, String platformId, String sn, String key, SubscribeHolder subscribeInfo) { public MobilePositionSubscribeHandlerTask(IRedisCatchStorage redisCatchStorage,
ISIPCommanderForPlatform sipCommanderForPlatform,
IVideoManagerStorage storager,
String platformId,
String sn,
String key,
SubscribeHolder subscribeInfo,
DynamicTask dynamicTask) {
this.redisCatchStorage = redisCatchStorage; this.redisCatchStorage = redisCatchStorage;
this.storager = storager; this.storager = storager;
this.platform = storager.queryParentPlatByServerGBId(platformId); this.platform = storager.queryParentPlatByServerGBId(platformId);
@ -41,7 +51,9 @@ public class MobilePositionSubscribeHandlerTask implements ISubscribeTask {
@Override @Override
public void run() { public void run() {
if (platform == null) return; if (platform == null) {
return;
}
SubscribeInfo subscribe = subscribeHolder.getMobilePositionSubscribe(platform.getServerGBId()); SubscribeInfo subscribe = subscribeHolder.getMobilePositionSubscribe(platform.getServerGBId());
if (subscribe != null) { if (subscribe != null) {

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.gb28181.task.impl; package com.genersoft.iot.vmp.gb28181.task.impl;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
@ -16,25 +17,26 @@ import java.util.TimerTask;
/** /**
* 移动位置订阅的定时更新 * 移动位置订阅的定时更新
* @author lin
*/ */
public class MobilePositionSubscribeTask implements ISubscribeTask { public class MobilePositionSubscribeTask implements ISubscribeTask {
private final Logger logger = LoggerFactory.getLogger(MobilePositionSubscribeTask.class); private final Logger logger = LoggerFactory.getLogger(MobilePositionSubscribeTask.class);
private Device device; private Device device;
private ISIPCommander sipCommander; private ISIPCommander sipCommander;
private Dialog dialog; private Dialog dialog;
private DynamicTask dynamicTask;
private String taskKey = "mobile-position-subscribe-timeout";
private Timer timer ; public MobilePositionSubscribeTask(Device device, ISIPCommander sipCommander, DynamicTask dynamicTask) {
public MobilePositionSubscribeTask(Device device, ISIPCommander sipCommander) {
this.device = device; this.device = device;
this.sipCommander = sipCommander; this.sipCommander = sipCommander;
this.dynamicTask = dynamicTask;
} }
@Override @Override
public void run() { public void run() {
if (timer != null ) { if (dynamicTask.get(taskKey) != null) {
timer.cancel(); dynamicTask.stop(taskKey);
timer = null;
} }
sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> {
// if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) { // if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) {
@ -52,13 +54,7 @@ public class MobilePositionSubscribeTask implements ISubscribeTask {
dialog = null; dialog = null;
// 失败 // 失败
logger.warn("[移动位置订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg); logger.warn("[移动位置订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg);
timer = new Timer(); dynamicTask.startDelay(taskKey, MobilePositionSubscribeTask.this, 2000);
timer.schedule(new TimerTask() {
@Override
public void run() {
MobilePositionSubscribeTask.this.run();
}
}, 2000);
}); });
} }
@ -72,9 +68,8 @@ public class MobilePositionSubscribeTask implements ISubscribeTask {
* COMPLETED-> Completed Dialog状态-已完成 * COMPLETED-> Completed Dialog状态-已完成
* TERMINATED-> Terminated Dialog状态-终止 * TERMINATED-> Terminated Dialog状态-终止
*/ */
if (timer != null ) { if (dynamicTask.get(taskKey) != null) {
timer.cancel(); dynamicTask.stop(taskKey);
timer = null;
} }
if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) { if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) {
logger.info("取消移动订阅时dialog状态为{}", dialog.getState()); logger.info("取消移动订阅时dialog状态为{}", dialog.getState());
@ -96,7 +91,9 @@ public class MobilePositionSubscribeTask implements ISubscribeTask {
} }
@Override @Override
public DialogState getDialogState() { public DialogState getDialogState() {
if (dialog == null) return null; if (dialog == null) {
return null;
}
return dialog.getState(); return dialog.getState();
} }
} }

View File

@ -62,7 +62,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver {
* @param processor 处理程序 * @param processor 处理程序
*/ */
public void addTimeoutProcessor(ITimeoutProcessor processor) { public void addTimeoutProcessor(ITimeoutProcessor processor) {
this.timeoutProcessor = processor; timeoutProcessor = processor;
} }
/** /**

View File

@ -29,6 +29,7 @@ public class CheckForAllRecordsThread extends Thread {
this.recordInfo = recordInfo; this.recordInfo = recordInfo;
} }
@Override
public void run() { public void run() {
String cacheKey = this.key; String cacheKey = this.key;

View File

@ -65,12 +65,16 @@ public class DeferredResultHolder {
public DeferredResult get(String key, String id) { public DeferredResult get(String key, String id) {
Map<String, DeferredResult> deferredResultMap = map.get(key); Map<String, DeferredResult> deferredResultMap = map.get(key);
if (deferredResultMap == null) return null; if (deferredResultMap == null) {
return null;
}
return deferredResultMap.get(id); return deferredResultMap.get(id);
} }
public boolean exist(String key, String id){ public boolean exist(String key, String id){
if (key == null) return false; if (key == null) {
return false;
}
Map<String, DeferredResult> deferredResultMap = map.get(key); Map<String, DeferredResult> deferredResultMap = map.get(key);
if (id == null) { if (id == null) {
return deferredResultMap != null; return deferredResultMap != null;

View File

@ -68,9 +68,6 @@ public class SIPRequestHeaderPlarformProvider {
toHeader, viaHeaders, maxForwards); toHeader, viaHeaders, maxForwards);
List<String> agentParam = new ArrayList<>(); List<String> agentParam = new ArrayList<>();
agentParam.add("wvp-pro");
UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
request.addHeader(userAgentHeader);
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
request.setContent(content, contentTypeHeader); request.setContent(content, contentTypeHeader);
@ -115,10 +112,6 @@ public class SIPRequestHeaderPlarformProvider {
ExpiresHeader expires = sipFactory.createHeaderFactory().createExpiresHeader(Integer.parseInt(platform.getExpires())); ExpiresHeader expires = sipFactory.createHeaderFactory().createExpiresHeader(Integer.parseInt(platform.getExpires()));
request.addHeader(expires); request.addHeader(expires);
List<String> agentParam = new ArrayList<>();
agentParam.add("wvp-pro");
UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
request.addHeader(userAgentHeader);
return request; return request;
} }
@ -226,10 +219,6 @@ public class SIPRequestHeaderPlarformProvider {
messageFactory.setDefaultContentEncodingCharset(parentPlatform.getCharacterSet()); messageFactory.setDefaultContentEncodingCharset(parentPlatform.getCharacterSet());
request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards); toHeader, viaHeaders, maxForwards);
List<String> agentParam = new ArrayList<>();
agentParam.add("wvp-pro");
UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
request.addHeader(userAgentHeader);
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
request.setContent(content, contentTypeHeader); request.setContent(content, contentTypeHeader);

View File

@ -228,9 +228,13 @@ public class SIPRequestHeaderProvider {
public Request createInfoRequest(Device device, StreamInfo streamInfo, String content) public Request createInfoRequest(Device device, StreamInfo streamInfo, String content)
throws PeerUnavailableException, ParseException, InvalidArgumentException { throws PeerUnavailableException, ParseException, InvalidArgumentException {
Request request = null; Request request = null;
if (streamInfo == null) return null; if (streamInfo == null) {
return null;
}
Dialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream()); Dialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream());
if (dialog == null) return null; if (dialog == null) {
return null;
}
SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(),
device.getHostAddress()); device.getHostAddress());

View File

@ -27,6 +27,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringBootVersion;
import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -37,7 +38,9 @@ import javax.sip.header.*;
import javax.sip.message.Request; import javax.sip.message.Request;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.text.ParseException; import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
/** /**
* @description:设备能力接口用于定义设备的控制查询能力 * @description:设备能力接口用于定义设备的控制查询能力
@ -346,7 +349,9 @@ public class SIPCommander implements ISIPCommander {
ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) {
String streamId = ssrcInfo.getStream(); String streamId = ssrcInfo.getStream();
try { try {
if (device == null) return; if (device == null) {
return;
}
String streamMode = device.getStreamMode().toUpperCase(); String streamMode = device.getStreamMode().toUpperCase();
logger.info("{} 分配的ZLM为: {} [{}:{}]", streamId, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); logger.info("{} 分配的ZLM为: {} [{}:{}]", streamId, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
@ -694,7 +699,9 @@ public class SIPCommander implements ISIPCommander {
if (callId != null) { if (callId != null) {
dialog = streamSession.getDialogByCallId(deviceId, channelId, callId); dialog = streamSession.getDialogByCallId(deviceId, channelId, callId);
}else { }else {
if (stream == null) return; if (stream == null) {
return;
}
dialog = streamSession.getDialogByStream(deviceId, channelId, stream); dialog = streamSession.getDialogByStream(deviceId, channelId, stream);
} }
if (ssrcTransaction != null) { if (ssrcTransaction != null) {
@ -1454,6 +1461,7 @@ public class SIPCommander implements ISIPCommander {
* @param device 视频设备 * @param device 视频设备
* @return true = 命令发送成功 * @return true = 命令发送成功
*/ */
@Override
public boolean mobilePositionSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) { public boolean mobilePositionSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) {
try { try {
StringBuffer subscribePostitionXml = new StringBuffer(200); StringBuffer subscribePostitionXml = new StringBuffer(200);
@ -1505,6 +1513,7 @@ public class SIPCommander implements ISIPCommander {
* @param endTime 报警发生终止时间可选 * @param endTime 报警发生终止时间可选
* @return true = 命令发送成功 * @return true = 命令发送成功
*/ */
@Override
public boolean alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime) { public boolean alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime) {
try { try {
StringBuffer cmdXml = new StringBuffer(200); StringBuffer cmdXml = new StringBuffer(200);
@ -1637,7 +1646,18 @@ public class SIPCommander implements ISIPCommander {
} else if("UDP".equals(device.getTransport())) { } else if("UDP".equals(device.getTransport())) {
clientTransaction = udpSipProvider.getNewClientTransaction(request); clientTransaction = udpSipProvider.getNewClientTransaction(request);
} }
if (request.getHeader(UserAgentHeader.NAME) == null) {
List<String> agentParam = new ArrayList<>();
agentParam.add("wvp-pro");
// TODO 添加版本信息以及日期
UserAgentHeader userAgentHeader = null;
try {
userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
} catch (ParseException e) {
throw new RuntimeException(e);
}
request.addHeader(userAgentHeader);
}
CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
// 添加错误订阅 // 添加错误订阅
if (errorEvent != null) { if (errorEvent != null) {
@ -1701,7 +1721,9 @@ public class SIPCommander implements ISIPCommander {
content.append("CSeq: " + cseq + "\r\n"); content.append("CSeq: " + cseq + "\r\n");
content.append("Range: npt=now-\r\n"); content.append("Range: npt=now-\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) return; if (request == null) {
return;
}
logger.info(request.toString()); logger.info(request.toString());
ClientTransaction clientTransaction = null; ClientTransaction clientTransaction = null;
if ("TCP".equals(device.getTransport())) { if ("TCP".equals(device.getTransport())) {
@ -1730,7 +1752,9 @@ public class SIPCommander implements ISIPCommander {
content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n"); content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) return; if (request == null) {
return;
}
logger.info(request.toString()); logger.info(request.toString());
ClientTransaction clientTransaction = null; ClientTransaction clientTransaction = null;
if ("TCP".equals(device.getTransport())) { if ("TCP".equals(device.getTransport())) {
@ -1758,7 +1782,9 @@ public class SIPCommander implements ISIPCommander {
content.append("CSeq: " + cseq + "\r\n"); content.append("CSeq: " + cseq + "\r\n");
content.append("Scale: " + String.format("%.1f",speed) + "\r\n"); content.append("Scale: " + String.format("%.1f",speed) + "\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) return; if (request == null) {
return;
}
logger.info(request.toString()); logger.info(request.toString());
ClientTransaction clientTransaction = null; ClientTransaction clientTransaction = null;
if ("TCP".equals(device.getTransport())) { if ("TCP".equals(device.getTransport())) {
@ -1824,7 +1850,9 @@ public class SIPCommander implements ISIPCommander {
// 设置编码 防止中文乱码 // 设置编码 防止中文乱码
messageFactory.setDefaultContentEncodingCharset(characterSet); messageFactory.setDefaultContentEncodingCharset(characterSet);
Dialog dialog = subscribeInfo.getDialog(); Dialog dialog = subscribeInfo.getDialog();
if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) return; if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) {
return;
}
SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY); SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY);
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
notifyRequest.setContent(catalogXmlContent, contentTypeHeader); notifyRequest.setContent(catalogXmlContent, contentTypeHeader);

View File

@ -529,7 +529,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
// 设置编码 防止中文乱码 // 设置编码 防止中文乱码
messageFactory.setDefaultContentEncodingCharset(characterSet); messageFactory.setDefaultContentEncodingCharset(characterSet);
Dialog dialog = subscribeInfo.getDialog(); Dialog dialog = subscribeInfo.getDialog();
if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) return; if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) {
return;
}
SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY); SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY);
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
notifyRequest.setContent(catalogXmlContent, contentTypeHeader); notifyRequest.setContent(catalogXmlContent, contentTypeHeader);

View File

@ -139,7 +139,9 @@ public abstract class SIPRequestProcessorParent {
serverTransaction.sendResponse(response); serverTransaction.sendResponse(response);
if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) {
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
} }
} }
@ -149,7 +151,9 @@ public abstract class SIPRequestProcessorParent {
ServerTransaction serverTransaction = getServerTransaction(evt); ServerTransaction serverTransaction = getServerTransaction(evt);
serverTransaction.sendResponse(response); serverTransaction.sendResponse(response);
if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) {
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
} }
} }
@ -215,7 +219,9 @@ public abstract class SIPRequestProcessorParent {
return getRootElement(evt, "gb2312"); return getRootElement(evt, "gb2312");
} }
public Element getRootElement(RequestEvent evt, String charset) throws DocumentException { public Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
if (charset == null) charset = "gb2312"; if (charset == null) {
charset = "gb2312";
}
Request request = evt.getRequest(); Request request = evt.getRequest();
SAXReader reader = new SAXReader(); SAXReader reader = new SAXReader();
reader.setEncoding(charset); reader.setEncoding(charset);

View File

@ -72,7 +72,9 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In
public void process(RequestEvent evt) { public void process(RequestEvent evt) {
Dialog dialog = evt.getDialog(); Dialog dialog = evt.getDialog();
CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME);
if (dialog == null) return; if (dialog == null) {
return;
}
if (dialog.getState()== DialogState.CONFIRMED) { if (dialog.getState()== DialogState.CONFIRMED) {
String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
logger.info("ACK请求 platformGbId->{}", platformGbId); logger.info("ACK请求 platformGbId->{}", platformGbId);

View File

@ -81,7 +81,9 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
responseAck(evt, Response.OK); responseAck(evt, Response.OK);
Dialog dialog = evt.getDialog(); Dialog dialog = evt.getDialog();
CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME);
if (dialog == null) return; if (dialog == null) {
return;
}
if (dialog.getState().equals(DialogState.TERMINATED)) { if (dialog.getState().equals(DialogState.TERMINATED)) {
String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();

View File

@ -321,7 +321,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
response = getMessageFactory().createResponse(event.statusCode, evt.getRequest()); response = getMessageFactory().createResponse(event.statusCode, evt.getRequest());
ServerTransaction serverTransaction = getServerTransaction(evt); ServerTransaction serverTransaction = getServerTransaction(evt);
serverTransaction.sendResponse(response); serverTransaction.sendResponse(response);
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
} catch (ParseException | SipException | InvalidArgumentException e) { } catch (ParseException | SipException | InvalidArgumentException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -5,7 +5,6 @@ import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
@ -19,7 +18,6 @@ import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.utils.GpsUtil;
import com.genersoft.iot.vmp.utils.redis.RedisUtil; import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
import org.dom4j.Element; import org.dom4j.Element;
@ -65,10 +63,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
@Autowired @Autowired
private EventPublisher publisher; private EventPublisher publisher;
@Autowired
private DeviceOffLineDetector offLineDetector;
private String method = "NOTIFY"; private String method = "NOTIFY";
@Autowired @Autowired
@ -240,7 +234,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
// 回复200 OK // 回复200 OK
responseAck(evt, Response.OK); responseAck(evt, Response.OK);
if (offLineDetector.isOnline(deviceId)) { if (redisCatchStorage.deviceIsOnline(deviceId)) {
publisher.deviceAlarmEventPublish(deviceAlarm); publisher.deviceAlarmEventPublish(deviceAlarm);
} }
} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
@ -331,7 +325,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
} }
if (!offLineDetector.isOnline(deviceId)) { if (!redisCatchStorage.deviceIsOnline(deviceId)) {
publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
} }
} }
@ -357,10 +351,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
public void setDeferredResultHolder(DeferredResultHolder deferredResultHolder) { public void setDeferredResultHolder(DeferredResultHolder deferredResultHolder) {
} }
public void setOffLineDetector(DeviceOffLineDetector offLineDetector) {
this.offLineDetector = offLineDetector;
}
public IRedisCatchStorage getRedisCatchStorage() { public IRedisCatchStorage getRedisCatchStorage() {
return redisCatchStorage; return redisCatchStorage;
} }

View File

@ -130,7 +130,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
response = getMessageFactory().createResponse(Response.BAD_REQUEST, request); response = getMessageFactory().createResponse(Response.BAD_REQUEST, request);
ServerTransaction serverTransaction = getServerTransaction(evt); ServerTransaction serverTransaction = getServerTransaction(evt);
serverTransaction.sendResponse(response); serverTransaction.sendResponse(response);
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
return; return;
} }
// 添加Contact头 // 添加Contact头
@ -195,7 +197,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
return; return;
} }
serverTransaction.sendResponse(response); serverTransaction.sendResponse(response);
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
} }
} }

View File

@ -35,22 +35,17 @@ import java.text.ParseException;
/** /**
* SIP命令类型 SUBSCRIBE请求 * SIP命令类型 SUBSCRIBE请求
* @author lin
*/ */
@Component @Component
public class SubscribeRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { public class SubscribeRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor {
private Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class); private final Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class);
private String method = "SUBSCRIBE"; private final String method = "SUBSCRIBE";
@Autowired @Autowired
private SIPProcessorObserver sipProcessorObserver; private SIPProcessorObserver sipProcessorObserver;
@Autowired
private IRedisCatchStorage redisCatchStorage;
@Autowired
private ISIPCommanderForPlatform sipCommanderForPlatform;
@Autowired @Autowired
private IVideoManagerStorage storager; private IVideoManagerStorage storager;
@ -82,7 +77,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
/** /**
* 处理SUBSCRIBE请求 * 处理SUBSCRIBE请求
* *
* @param evt * @param evt 事件
*/ */
@Override @Override
public void process(RequestEvent evt) { public void process(RequestEvent evt) {
@ -101,13 +96,12 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
} else { } else {
logger.info("接收到消息:" + cmd); logger.info("接收到消息:" + cmd);
Response response = null; Response response = getMessageFactory().createResponse(200, request);
response = getMessageFactory().createResponse(200, request);
if (response != null) { if (response != null) {
ExpiresHeader expireHeader = getHeaderFactory().createExpiresHeader(30); ExpiresHeader expireHeader = getHeaderFactory().createExpiresHeader(30);
response.setExpires(expireHeader); response.setExpires(expireHeader);
} }
logger.info("response : " + response.toString()); logger.info("response : " + response);
ServerTransaction transaction = getServerTransaction(evt); ServerTransaction transaction = getServerTransaction(evt);
if (transaction != null) { if (transaction != null) {
transaction.sendResponse(response); transaction.sendResponse(response);
@ -117,13 +111,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
logger.info("processRequest serverTransactionId is null."); logger.info("processRequest serverTransactionId is null.");
} }
} }
} catch (ParseException e) { } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
e.printStackTrace();
} catch (SipException e) {
e.printStackTrace();
} catch (InvalidArgumentException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -134,14 +122,14 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
*/ */
private void processNotifyMobilePosition(RequestEvent evt, Element rootElement) throws SipException { private void processNotifyMobilePosition(RequestEvent evt, Element rootElement) throws SipException {
String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
String deviceID = XmlUtil.getText(rootElement, "DeviceID"); String deviceId = XmlUtil.getText(rootElement, "DeviceID");
ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId); SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId);
if (platform == null) { if (platform == null) {
return; return;
} }
if (evt.getServerTransaction() == null) { if (evt.getServerTransaction() == null) {
ServerTransaction serverTransaction = platform.getTransport().equals("TCP") ? tcpSipProvider.getNewServerTransaction(evt.getRequest()) ServerTransaction serverTransaction = "TCP".equals(platform.getTransport()) ? tcpSipProvider.getNewServerTransaction(evt.getRequest())
: udpSipProvider.getNewServerTransaction(evt.getRequest()); : udpSipProvider.getNewServerTransaction(evt.getRequest());
subscribeInfo.setTransaction(serverTransaction); subscribeInfo.setTransaction(serverTransaction);
Dialog dialog = serverTransaction.getDialog(); Dialog dialog = serverTransaction.getDialog();
@ -154,13 +142,14 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
resultXml.append("<?xml version=\"1.0\" ?>\r\n") resultXml.append("<?xml version=\"1.0\" ?>\r\n")
.append("<Response>\r\n") .append("<Response>\r\n")
.append("<CmdType>MobilePosition</CmdType>\r\n") .append("<CmdType>MobilePosition</CmdType>\r\n")
.append("<SN>" + sn + "</SN>\r\n") .append("<SN>").append(sn).append("</SN>\r\n")
.append("<DeviceID>" + deviceID + "</DeviceID>\r\n") .append("<DeviceID>").append(deviceId).append("</DeviceID>\r\n")
.append("<Result>OK</Result>\r\n") .append("<Result>OK</Result>\r\n")
.append("</Response>\r\n"); .append("</Response>\r\n");
if (subscribeInfo.getExpires() > 0) { if (subscribeInfo.getExpires() > 0) {
String interval = XmlUtil.getText(rootElement, "Interval"); // GPS上报时间间隔 // GPS上报时间间隔
String interval = XmlUtil.getText(rootElement, "Interval");
if (interval == null) { if (interval == null) {
subscribeInfo.setGpsInterval(5); subscribeInfo.setGpsInterval(5);
}else { }else {
@ -169,15 +158,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
subscribeInfo.setSn(sn); subscribeInfo.setSn(sn);
subscribeHolder.putMobilePositionSubscribe(platformId, subscribeInfo); subscribeHolder.putMobilePositionSubscribe(platformId, subscribeInfo);
// if (subscribeHolder.getMobilePositionSubscribe(platformId) == null ) {
// subscribeHolder.putMobilePositionSubscribe(platformId, subscribeInfo);
// }else {
// if (subscribeHolder.getMobilePositionSubscribe(platformId).getDialog() != null
// && subscribeHolder.getMobilePositionSubscribe(platformId).getDialog().getState() != null
// && !subscribeHolder.getMobilePositionSubscribe(platformId).getDialog().getState().equals(DialogState.CONFIRMED)) {
// subscribeHolder.putMobilePositionSubscribe(platformId, subscribeInfo);
// }
// }
}else if (subscribeInfo.getExpires() == 0) { }else if (subscribeInfo.getExpires() == 0) {
subscribeHolder.removeMobilePositionSubscribe(platformId); subscribeHolder.removeMobilePositionSubscribe(platformId);
} }
@ -185,11 +166,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
try { try {
ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId);
responseXmlAck(evt, resultXml.toString(), parentPlatform); responseXmlAck(evt, resultXml.toString(), parentPlatform);
} catch (SipException e) { } catch (SipException | InvalidArgumentException | ParseException e) {
e.printStackTrace();
} catch (InvalidArgumentException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -200,12 +177,14 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
private void processNotifyCatalogList(RequestEvent evt, Element rootElement) throws SipException { private void processNotifyCatalogList(RequestEvent evt, Element rootElement) throws SipException {
String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
String deviceID = XmlUtil.getText(rootElement, "DeviceID"); String deviceId = XmlUtil.getText(rootElement, "DeviceID");
ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
if (platform == null)return; if (platform == null){
return;
}
SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId); SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId);
if (evt.getServerTransaction() == null) { if (evt.getServerTransaction() == null) {
ServerTransaction serverTransaction = platform.getTransport().equals("TCP") ? tcpSipProvider.getNewServerTransaction(evt.getRequest()) ServerTransaction serverTransaction = "TCP".equals(platform.getTransport()) ? tcpSipProvider.getNewServerTransaction(evt.getRequest())
: udpSipProvider.getNewServerTransaction(evt.getRequest()); : udpSipProvider.getNewServerTransaction(evt.getRequest());
subscribeInfo.setTransaction(serverTransaction); subscribeInfo.setTransaction(serverTransaction);
Dialog dialog = serverTransaction.getDialog(); Dialog dialog = serverTransaction.getDialog();
@ -213,13 +192,13 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
subscribeInfo.setDialog(dialog); subscribeInfo.setDialog(dialog);
} }
String sn = XmlUtil.getText(rootElement, "SN"); String sn = XmlUtil.getText(rootElement, "SN");
logger.info("[回复 目录订阅]: {}/{}", platformId, deviceID); logger.info("[回复 目录订阅]: {}/{}", platformId, deviceId);
StringBuilder resultXml = new StringBuilder(200); StringBuilder resultXml = new StringBuilder(200);
resultXml.append("<?xml version=\"1.0\" ?>\r\n") resultXml.append("<?xml version=\"1.0\" ?>\r\n")
.append("<Response>\r\n") .append("<Response>\r\n")
.append("<CmdType>Catalog</CmdType>\r\n") .append("<CmdType>Catalog</CmdType>\r\n")
.append("<SN>" + sn + "</SN>\r\n") .append("<SN>").append(sn).append("</SN>\r\n")
.append("<DeviceID>" + deviceID + "</DeviceID>\r\n") .append("<DeviceID>").append(deviceId).append("</DeviceID>\r\n")
.append("<Result>OK</Result>\r\n") .append("<Result>OK</Result>\r\n")
.append("</Response>\r\n"); .append("</Response>\r\n");
@ -232,11 +211,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
try { try {
ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId);
responseXmlAck(evt, resultXml.toString(), parentPlatform); responseXmlAck(evt, resultXml.toString(), parentPlatform);
} catch (SipException e) { } catch (SipException | InvalidArgumentException | ParseException e) {
e.printStackTrace();
} catch (InvalidArgumentException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -1,10 +1,8 @@
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd;
import com.alibaba.fastjson.JSON;
import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
@ -14,7 +12,6 @@ import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
import com.genersoft.iot.vmp.service.IDeviceAlarmService; import com.genersoft.iot.vmp.service.IDeviceAlarmService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.utils.GpsUtil;
import org.dom4j.Element; import org.dom4j.Element;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -35,7 +32,7 @@ import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.*;
@Component @Component
public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler {
private Logger logger = LoggerFactory.getLogger(AlarmNotifyMessageHandler.class); private final Logger logger = LoggerFactory.getLogger(AlarmNotifyMessageHandler.class);
private final String cmdType = "Alarm"; private final String cmdType = "Alarm";
@Autowired @Autowired
@ -59,9 +56,6 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
@Autowired @Autowired
private IDeviceAlarmService deviceAlarmService; private IDeviceAlarmService deviceAlarmService;
@Autowired
private DeviceOffLineDetector offLineDetector;
@Override @Override
public void afterPropertiesSet() throws Exception { public void afterPropertiesSet() throws Exception {
notifyMessageHandler.addHandler(cmdType, this); notifyMessageHandler.addHandler(cmdType, this);
@ -91,24 +85,27 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority")); deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority"));
deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod")); deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod"));
deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime")); deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime"));
if (getText(rootElement, "AlarmDescription") == null) { String alarmDescription = getText(rootElement, "AlarmDescription");
if (alarmDescription == null) {
deviceAlarm.setAlarmDescription(""); deviceAlarm.setAlarmDescription("");
} else { } else {
deviceAlarm.setAlarmDescription(getText(rootElement, "AlarmDescription")); deviceAlarm.setAlarmDescription(alarmDescription);
} }
if (NumericUtil.isDouble(getText(rootElement, "Longitude"))) { String longitude = getText(rootElement, "Longitude");
deviceAlarm.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); if (longitude != null && NumericUtil.isDouble(longitude)) {
deviceAlarm.setLongitude(Double.parseDouble(longitude));
} else { } else {
deviceAlarm.setLongitude(0.00); deviceAlarm.setLongitude(0.00);
} }
if (NumericUtil.isDouble(getText(rootElement, "Latitude"))) { String latitude = getText(rootElement, "Latitude");
deviceAlarm.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); if (latitude != null && NumericUtil.isDouble(latitude)) {
deviceAlarm.setLatitude(Double.parseDouble(latitude));
} else { } else {
deviceAlarm.setLatitude(0.00); deviceAlarm.setLatitude(0.00);
} }
if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) { if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) {
if ( deviceAlarm.getAlarmMethod().equals("4")) { if ( deviceAlarm.getAlarmMethod().contains(DeviceAlarmMethod.GPS.getVal() + "")) {
MobilePosition mobilePosition = new MobilePosition(); MobilePosition mobilePosition = new MobilePosition();
mobilePosition.setDeviceId(deviceAlarm.getDeviceId()); mobilePosition.setDeviceId(deviceAlarm.getDeviceId());
mobilePosition.setTime(deviceAlarm.getAlarmTime()); mobilePosition.setTime(deviceAlarm.getAlarmTime());
@ -128,7 +125,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
} }
} }
if (!StringUtils.isEmpty(deviceAlarm.getDeviceId())) { if (!StringUtils.isEmpty(deviceAlarm.getDeviceId())) {
if (deviceAlarm.getAlarmMethod().equals("5")) { if (deviceAlarm.getAlarmMethod().contains(DeviceAlarmMethod.Video.getVal() + "")) {
deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType")); deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType"));
} }
} }
@ -151,7 +148,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
} }
if (offLineDetector.isOnline(device.getDeviceId())) { if (redisCatchStorage.deviceIsOnline(device.getDeviceId())) {
publisher.deviceAlarmEventPublish(deviceAlarm); publisher.deviceAlarmEventPublish(deviceAlarm);
} }
} }
@ -179,25 +176,28 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority")); deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority"));
deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod")); deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod"));
deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime")); deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime"));
if (getText(rootElement, "AlarmDescription") == null) { String alarmDescription = getText(rootElement, "AlarmDescription");
if (alarmDescription == null) {
deviceAlarm.setAlarmDescription(""); deviceAlarm.setAlarmDescription("");
} else { } else {
deviceAlarm.setAlarmDescription(getText(rootElement, "AlarmDescription")); deviceAlarm.setAlarmDescription(alarmDescription);
} }
if (NumericUtil.isDouble(getText(rootElement, "Longitude"))) { String longitude = getText(rootElement, "Longitude");
deviceAlarm.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); if (longitude != null && NumericUtil.isDouble(longitude)) {
deviceAlarm.setLongitude(Double.parseDouble(longitude));
} else { } else {
deviceAlarm.setLongitude(0.00); deviceAlarm.setLongitude(0.00);
} }
if (NumericUtil.isDouble(getText(rootElement, "Latitude"))) { String latitude = getText(rootElement, "Latitude");
deviceAlarm.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); if (latitude != null && NumericUtil.isDouble(latitude)) {
deviceAlarm.setLatitude(Double.parseDouble(latitude));
} else { } else {
deviceAlarm.setLatitude(0.00); deviceAlarm.setLatitude(0.00);
} }
if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) { if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) {
if (deviceAlarm.getAlarmMethod().equals("5")) { if (deviceAlarm.getAlarmMethod().contains(DeviceAlarmMethod.Video.getVal() + "")) {
deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType")); deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType"));
} }
} }

View File

@ -70,8 +70,10 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp
videoManagerStorager.updateDevice(device); videoManagerStorager.updateDevice(device);
redisCatchStorage.updateDevice(device); redisCatchStorage.updateDevice(device);
} }
if (!redisCatchStorage.deviceIsOnline(device.getDeviceId())) {
publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
} }
}
} catch (SipException e) { } catch (SipException e) {
e.printStackTrace(); e.printStackTrace();
} catch (InvalidArgumentException e) { } catch (InvalidArgumentException e) {

View File

@ -1,14 +1,11 @@
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.session.CatalogDataCatch; import com.genersoft.iot.vmp.gb28181.session.CatalogDataCatch;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
@ -17,8 +14,6 @@ import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.utils.GpsUtil;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
import org.dom4j.Element; import org.dom4j.Element;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -58,9 +53,6 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp
@Autowired @Autowired
private CatalogDataCatch catalogDataCatch; private CatalogDataCatch catalogDataCatch;
@Autowired
private DeviceOffLineDetector offLineDetector;
@Autowired @Autowired
private SipConfig config; private SipConfig config;

View File

@ -4,13 +4,13 @@ import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
import org.dom4j.Element; import org.dom4j.Element;
@ -42,10 +42,10 @@ public class DeviceInfoResponseMessageHandler extends SIPRequestProcessorParent
private IVideoManagerStorage storager; private IVideoManagerStorage storager;
@Autowired @Autowired
private DeferredResultHolder deferredResultHolder; private IRedisCatchStorage redisCatchStorage;
@Autowired @Autowired
private DeviceOffLineDetector offLineDetector; private DeferredResultHolder deferredResultHolder;
@Autowired @Autowired
private SipConfig config; private SipConfig config;
@ -82,7 +82,7 @@ public class DeviceInfoResponseMessageHandler extends SIPRequestProcessorParent
deferredResultHolder.invokeAllResult(msg); deferredResultHolder.invokeAllResult(msg);
// 回复200 OK // 回复200 OK
responseAck(evt, Response.OK); responseAck(evt, Response.OK);
if (offLineDetector.isOnline(device.getDeviceId())) { if (redisCatchStorage.deviceIsOnline(device.getDeviceId())) {
publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
} }
} catch (DocumentException e) { } catch (DocumentException e) {

View File

@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
@ -12,6 +11,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import org.dom4j.Element; import org.dom4j.Element;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -34,8 +34,6 @@ public class DeviceStatusResponseMessageHandler extends SIPRequestProcessorParen
@Autowired @Autowired
private ResponseMessageHandler responseMessageHandler; private ResponseMessageHandler responseMessageHandler;
@Autowired
private DeviceOffLineDetector offLineDetector;
@Autowired @Autowired
private DeferredResultHolder deferredResultHolder; private DeferredResultHolder deferredResultHolder;
@ -43,6 +41,9 @@ public class DeviceStatusResponseMessageHandler extends SIPRequestProcessorParen
@Autowired @Autowired
private EventPublisher publisher; private EventPublisher publisher;
@Autowired
private IRedisCatchStorage redisCatchStorage;
@Override @Override
public void afterPropertiesSet() throws Exception { public void afterPropertiesSet() throws Exception {
responseMessageHandler.addHandler(cmdType, this); responseMessageHandler.addHandler(cmdType, this);
@ -74,10 +75,8 @@ public class DeviceStatusResponseMessageHandler extends SIPRequestProcessorParen
msg.setData(json); msg.setData(json);
deferredResultHolder.invokeAllResult(msg); deferredResultHolder.invokeAllResult(msg);
if (offLineDetector.isOnline(device.getDeviceId())) { if (redisCatchStorage.deviceIsOnline(device.getDeviceId())) {
publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
} else {
} }
} }

View File

@ -25,7 +25,9 @@ public class SipUtils {
* */ * */
public static String getChannelIdFromHeader(Request request) { public static String getChannelIdFromHeader(Request request) {
Header subject = request.getHeader("subject"); Header subject = request.getHeader("subject");
if (subject == null) return null; if (subject == null) {
return null;
}
return ((Subject) subject).getSubject().split(":")[0]; return ((Subject) subject).getSubject().split(":")[0];
} }

View File

@ -85,7 +85,9 @@ public class ZLMHttpHookSubscribe {
if (result == null) { if (result == null) {
result = key.getString(s).equals(hookResponse.getString(s)); result = key.getString(s).equals(hookResponse.getString(s));
}else { }else {
if (key.getString(s) == null) continue; if (key.getString(s) == null) {
continue;
}
result = result && key.getString(s).equals(hookResponse.getString(s)); result = result && key.getString(s).equals(hookResponse.getString(s));
} }
} }

View File

@ -67,7 +67,9 @@ public class ZLMMediaListManager {
// 使用异步的当时更新媒体流列表 // 使用异步的当时更新媒体流列表
zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{ zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{
if (mediaList == null) return; if (mediaList == null) {
return;
}
String dataStr = mediaList.getString("data"); String dataStr = mediaList.getString("data");
Integer code = mediaList.getInteger("code"); Integer code = mediaList.getInteger("code");
@ -176,7 +178,9 @@ public class ZLMMediaListManager {
//使用异步更新推流 //使用异步更新推流
zlmresTfulUtils.getMediaList(mediaServerItem, app, streamId, "rtmp", json->{ zlmresTfulUtils.getMediaList(mediaServerItem, app, streamId, "rtmp", json->{
if (json == null) return; if (json == null) {
return;
}
String dataStr = json.getString("data"); String dataStr = json.getString("data");
Integer code = json.getInteger("code"); Integer code = json.getInteger("code");

View File

@ -23,7 +23,9 @@ public class ZLMRTPServerFactory {
private int[] portRangeArray = new int[2]; private int[] portRangeArray = new int[2];
public int getFreePort(MediaServerItem mediaServerItem, int startPort, int endPort, List<Integer> usedFreelist) { public int getFreePort(MediaServerItem mediaServerItem, int startPort, int endPort, List<Integer> usedFreelist) {
if (endPort <= startPort) return -1; if (endPort <= startPort) {
return -1;
}
if (usedFreelist == null) { if (usedFreelist == null) {
usedFreelist = new ArrayList<>(); usedFreelist = new ArrayList<>();
} }

View File

@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.conf.MediaConfig;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
@ -51,6 +52,9 @@ public class ZLMRunner implements CommandLineRunner {
@Autowired @Autowired
private MediaConfig mediaConfig; private MediaConfig mediaConfig;
@Autowired
private DynamicTask dynamicTask;
@Qualifier("taskExecutor") @Qualifier("taskExecutor")
@Autowired @Autowired
private ThreadPoolTaskExecutor taskExecutor; private ThreadPoolTaskExecutor taskExecutor;
@ -97,27 +101,25 @@ public class ZLMRunner implements CommandLineRunner {
all.add(mediaConfig.getMediaSerItem()); all.add(mediaConfig.getMediaSerItem());
} }
for (MediaServerItem mediaServerItem : all) { for (MediaServerItem mediaServerItem : all) {
if (startGetMedia == null) startGetMedia = new HashMap<>(); if (startGetMedia == null) {
startGetMedia = new HashMap<>();
}
startGetMedia.put(mediaServerItem.getId(), true); startGetMedia.put(mediaServerItem.getId(), true);
taskExecutor.execute(()->{ taskExecutor.execute(()->{
connectZlmServer(mediaServerItem); connectZlmServer(mediaServerItem);
}); });
} }
Timer timer = new Timer(); String taskKey = "zlm-connect-timeout";
// 10分钟后未连接到则不再去主动连接, TODO 并对重启前使用此在zlm的通道发送bye dynamicTask.startDelay(taskKey, ()->{
timer.schedule(new TimerTask() {
@Override
public void run() {
if (startGetMedia != null) { if (startGetMedia != null) {
Set<String> allZlmId = startGetMedia.keySet(); Set<String> allZlmId = startGetMedia.keySet();
for (String id : allZlmId) { for (String id : allZlmId) {
logger.error("[ {} ]]主动连接失败,不再主动连接", id); logger.error("[ {} ]]主动连接失败,不再尝试连接", id);
} }
startGetMedia = null; startGetMedia = null;
} }
// TODO 清理数据库中与redis不匹配的zlm // TODO 清理数据库中与redis不匹配的zlm
} }, 6 * 1000 );
}, 60 * 1000 * 10);
} }
@Async @Async
@ -139,12 +141,12 @@ public class ZLMRunner implements CommandLineRunner {
if ( startGetMedia.get(mediaServerItem.getId()) == null || !startGetMedia.get(mediaServerItem.getId())) { if ( startGetMedia.get(mediaServerItem.getId()) == null || !startGetMedia.get(mediaServerItem.getId())) {
return null; return null;
} }
JSONObject responseJSON = zlmresTfulUtils.getMediaServerConfig(mediaServerItem); JSONObject responseJson = zlmresTfulUtils.getMediaServerConfig(mediaServerItem);
ZLMServerConfig ZLMServerConfig = null; ZLMServerConfig zlmServerConfig = null;
if (responseJSON != null) { if (responseJson != null) {
JSONArray data = responseJSON.getJSONArray("data"); JSONArray data = responseJson.getJSONArray("data");
if (data != null && data.size() > 0) { if (data != null && data.size() > 0) {
ZLMServerConfig = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class); zlmServerConfig = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class);
} }
} else { } else {
logger.error("[ {} ]-[ {}:{} ]第{}次主动连接失败, 2s后重试", logger.error("[ {} ]-[ {}:{} ]第{}次主动连接失败, 2s后重试",
@ -159,9 +161,9 @@ public class ZLMRunner implements CommandLineRunner {
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
ZLMServerConfig = getMediaServerConfig(mediaServerItem, index += 1); zlmServerConfig = getMediaServerConfig(mediaServerItem, index += 1);
} }
return ZLMServerConfig; return zlmServerConfig;
} }

View File

@ -29,18 +29,22 @@ public class StreamProxyItem extends GbStream {
this.type = type; this.type = type;
} }
@Override
public String getApp() { public String getApp() {
return app; return app;
} }
@Override
public void setApp(String app) { public void setApp(String app) {
this.app = app; this.app = app;
} }
@Override
public String getStream() { public String getStream() {
return stream; return stream;
} }
@Override
public void setStream(String stream) { public void setStream(String stream) {
this.stream = stream; this.stream = stream;
} }

View File

@ -124,18 +124,22 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte
this.id = id; this.id = id;
} }
@Override
public String getApp() { public String getApp() {
return app; return app;
} }
@Override
public void setApp(String app) { public void setApp(String app) {
this.app = app; this.app = app;
} }
@Override
public String getStream() { public String getStream() {
return stream; return stream;
} }
@Override
public void setStream(String stream) { public void setStream(String stream) {
this.stream = stream; this.stream = stream;
} }

View File

@ -12,6 +12,8 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.sip.DialogState; import javax.sip.DialogState;
@ -43,7 +45,7 @@ public class DeviceServiceImpl implements IDeviceService {
} }
logger.info("[添加目录订阅] 设备{}", device.getDeviceId()); logger.info("[添加目录订阅] 设备{}", device.getDeviceId());
// 添加目录订阅 // 添加目录订阅
CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander); CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander, dynamicTask);
// 提前开始刷新订阅 // 提前开始刷新订阅
int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForCatalog(),30); int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForCatalog(),30);
// 设置最小值为30 // 设置最小值为30
@ -68,10 +70,10 @@ public class DeviceServiceImpl implements IDeviceService {
} }
logger.info("[添加移动位置订阅] 设备{}", device.getDeviceId()); logger.info("[添加移动位置订阅] 设备{}", device.getDeviceId());
// 添加目录订阅 // 添加目录订阅
MobilePositionSubscribeTask mobilePositionSubscribeTask = new MobilePositionSubscribeTask(device, sipCommander); MobilePositionSubscribeTask mobilePositionSubscribeTask = new MobilePositionSubscribeTask(device, sipCommander, dynamicTask);
// 提前开始刷新订阅
// 设置最小值为30 // 设置最小值为30
int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForMobilePosition(),30); int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForMobilePosition(),30);
// 提前开始刷新订阅
dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, subscribeCycleForCatalog -1 ); dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, subscribeCycleForCatalog -1 );
return true; return true;
} }

View File

@ -70,7 +70,9 @@ public class GbStreamServiceImpl implements IGbStreamService {
boolean result = false; boolean result = false;
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
ParentPlatform parentPlatform = platformMapper.getParentPlatByServerGBId(platformId); ParentPlatform parentPlatform = platformMapper.getParentPlatByServerGBId(platformId);
if (catalogId == null) catalogId = parentPlatform.getCatalogId(); if (catalogId == null) {
catalogId = parentPlatform.getCatalogId();
}
try { try {
List<DeviceChannel> deviceChannelList = new ArrayList<>(); List<DeviceChannel> deviceChannelList = new ArrayList<>();
for (GbStream gbStream : gbStreams) { for (GbStream gbStream : gbStreams) {

View File

@ -54,7 +54,9 @@ public class MediaServiceImpl implements IMediaService {
if (mediaList != null) { if (mediaList != null) {
if (mediaList.getInteger("code") == 0) { if (mediaList.getInteger("code") == 0) {
JSONArray data = mediaList.getJSONArray("data"); JSONArray data = mediaList.getJSONArray("data");
if (data == null) return null; if (data == null) {
return null;
}
JSONObject mediaJSON = JSON.parseObject(JSON.toJSONString(data.get(0)), JSONObject.class); JSONObject mediaJSON = JSON.parseObject(JSON.toJSONString(data.get(0)), JSONObject.class);
JSONArray tracks = mediaJSON.getJSONArray("tracks"); JSONArray tracks = mediaJSON.getJSONArray("tracks");
streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks); streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks);

View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
@ -86,6 +87,9 @@ public class PlayServiceImpl implements IPlayService {
@Autowired @Autowired
private UserSetting userSetting; private UserSetting userSetting;
@Autowired
private DynamicTask dynamicTask;
@ -100,7 +104,7 @@ public class PlayServiceImpl implements IPlayService {
String uuid = UUID.randomUUID().toString(); String uuid = UUID.randomUUID().toString();
msg.setId(uuid); msg.setId(uuid);
playResult.setUuid(uuid); playResult.setUuid(uuid);
DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(userSetting.getPlayTimeout()); DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
playResult.setResult(result); playResult.setResult(result);
// 录像查询以channelId作为deviceId查询 // 录像查询以channelId作为deviceId查询
resultHolder.put(key, uuid, result); resultHolder.put(key, uuid, result);
@ -237,11 +241,9 @@ public class PlayServiceImpl implements IPlayService {
} }
// 超时处理 // 超时处理
Timer timer = new Timer(); String timeOutTaskKey = UUID.randomUUID().toString();
SSRCInfo finalSsrcInfo = ssrcInfo; SSRCInfo finalSsrcInfo = ssrcInfo;
timer.schedule(new TimerTask() { dynamicTask.startDelay( timeOutTaskKey,()->{
@Override
public void run() {
logger.warn(String.format("设备点播超时deviceId%s channelId%s", device.getDeviceId(), channelId)); logger.warn(String.format("设备点播超时deviceId%s channelId%s", device.getDeviceId(), channelId));
SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
@ -255,12 +257,11 @@ public class PlayServiceImpl implements IPlayService {
mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
} }
} }, userSetting.getPlayTimeout()*1000);
}, userSetting.getPlayTimeout());
final String ssrc = ssrcInfo.getSsrc(); final String ssrc = ssrcInfo.getSsrc();
cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
logger.info("收到订阅消息: " + response.toJSONString()); logger.info("收到订阅消息: " + response.toJSONString());
timer.cancel(); dynamicTask.stop(timeOutTaskKey);
// hook响应 // hook响应
onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid); onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid);
hookEvent.response(mediaServerItemInuse, response); hookEvent.response(mediaServerItemInuse, response);
@ -292,7 +293,7 @@ public class PlayServiceImpl implements IPlayService {
} }
} }
}, (event) -> { }, (event) -> {
timer.cancel(); dynamicTask.stop(timeOutTaskKey);
mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
// 释放ssrc // 释放ssrc
mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
@ -334,7 +335,9 @@ public class PlayServiceImpl implements IPlayService {
@Override @Override
public MediaServerItem getNewMediaServerItem(Device device) { public MediaServerItem getNewMediaServerItem(Device device) {
if (device == null) return null; if (device == null) {
return null;
}
String mediaServerId = device.getMediaServerId(); String mediaServerId = device.getMediaServerId();
MediaServerItem mediaServerItem; MediaServerItem mediaServerItem;
if (mediaServerId == null) { if (mediaServerId == null) {
@ -353,7 +356,9 @@ public class PlayServiceImpl implements IPlayService {
String endTime,InviteStreamCallback inviteStreamCallback, String endTime,InviteStreamCallback inviteStreamCallback,
PlayBackCallback callback) { PlayBackCallback callback) {
Device device = storager.queryVideoDevice(deviceId); Device device = storager.queryVideoDevice(deviceId);
if (device == null) return null; if (device == null) {
return null;
}
MediaServerItem newMediaServerItem = getNewMediaServerItem(device); MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true);
@ -365,7 +370,9 @@ public class PlayServiceImpl implements IPlayService {
String deviceId, String channelId, String startTime, String deviceId, String channelId, String startTime,
String endTime, InviteStreamCallback infoCallBack, String endTime, InviteStreamCallback infoCallBack,
PlayBackCallback playBackCallback) { PlayBackCallback playBackCallback) {
if (mediaServerItem == null || ssrcInfo == null) return null; if (mediaServerItem == null || ssrcInfo == null) {
return null;
}
String uuid = UUID.randomUUID().toString(); String uuid = UUID.randomUUID().toString();
String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId; String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId;
DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L); DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L);
@ -380,11 +387,8 @@ public class PlayServiceImpl implements IPlayService {
msg.setId(uuid); msg.setId(uuid);
msg.setKey(key); msg.setKey(key);
PlayBackResult<RequestMessage> playBackResult = new PlayBackResult<>(); PlayBackResult<RequestMessage> playBackResult = new PlayBackResult<>();
String playBackTimeOutTaskKey = UUID.randomUUID().toString();
Timer timer = new Timer(); dynamicTask.startDelay(playBackTimeOutTaskKey, ()->{
timer.schedule(new TimerTask() {
@Override
public void run() {
logger.warn(String.format("设备回放超时deviceId%s channelId%s", deviceId, channelId)); logger.warn(String.format("设备回放超时deviceId%s channelId%s", deviceId, channelId));
playBackResult.setCode(-1); playBackResult.setCode(-1);
playBackResult.setData(msg); playBackResult.setData(msg);
@ -402,12 +406,12 @@ public class PlayServiceImpl implements IPlayService {
cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
// 回复之前所有的点播请求 // 回复之前所有的点播请求
playBackCallback.call(playBackResult); playBackCallback.call(playBackResult);
} }, userSetting.getPlayTimeout()*1000);
}, userSetting.getPlayTimeout());
cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack, cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack,
(InviteStreamInfo inviteStreamInfo) -> { (InviteStreamInfo inviteStreamInfo) -> {
logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString()); logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString());
timer.cancel(); dynamicTask.stop(playBackTimeOutTaskKey);
StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
if (streamInfo == null) { if (streamInfo == null) {
logger.warn("设备回放API调用失败"); logger.warn("设备回放API调用失败");
@ -425,7 +429,7 @@ public class PlayServiceImpl implements IPlayService {
playBackResult.setResponse(inviteStreamInfo.getResponse()); playBackResult.setResponse(inviteStreamInfo.getResponse());
playBackCallback.call(playBackResult); playBackCallback.call(playBackResult);
}, event -> { }, event -> {
timer.cancel(); dynamicTask.stop(playBackTimeOutTaskKey);
msg.setData(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg)); msg.setData(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg));
playBackResult.setCode(-1); playBackResult.setCode(-1);
playBackResult.setData(msg); playBackResult.setData(msg);
@ -439,7 +443,9 @@ public class PlayServiceImpl implements IPlayService {
@Override @Override
public DeferredResult<ResponseEntity<String>> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { public DeferredResult<ResponseEntity<String>> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
Device device = storager.queryVideoDevice(deviceId); Device device = storager.queryVideoDevice(deviceId);
if (device == null) return null; if (device == null) {
return null;
}
MediaServerItem newMediaServerItem = getNewMediaServerItem(device); MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true);
@ -448,7 +454,9 @@ public class PlayServiceImpl implements IPlayService {
@Override @Override
public DeferredResult<ResponseEntity<String>> download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { public DeferredResult<ResponseEntity<String>> download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
if (mediaServerItem == null || ssrcInfo == null) return null; if (mediaServerItem == null || ssrcInfo == null) {
return null;
}
String uuid = UUID.randomUUID().toString(); String uuid = UUID.randomUUID().toString();
String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId; String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId;
DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L); DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L);
@ -467,10 +475,8 @@ public class PlayServiceImpl implements IPlayService {
PlayBackResult<RequestMessage> downloadResult = new PlayBackResult<>(); PlayBackResult<RequestMessage> downloadResult = new PlayBackResult<>();
downloadResult.setData(msg); downloadResult.setData(msg);
Timer timer = new Timer(); String downLoadTimeOutTaskKey = UUID.randomUUID().toString();
timer.schedule(new TimerTask() { dynamicTask.startDelay(downLoadTimeOutTaskKey, ()->{
@Override
public void run() {
logger.warn(String.format("录像下载请求超时deviceId%s channelId%s", deviceId, channelId)); logger.warn(String.format("录像下载请求超时deviceId%s channelId%s", deviceId, channelId));
wvpResult.setCode(-1); wvpResult.setCode(-1);
wvpResult.setMsg("录像下载请求超时"); wvpResult.setMsg("录像下载请求超时");
@ -489,12 +495,11 @@ public class PlayServiceImpl implements IPlayService {
cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
// 回复之前所有的点播请求 // 回复之前所有的点播请求
hookCallBack.call(downloadResult); hookCallBack.call(downloadResult);
} }, userSetting.getPlayTimeout()*1000);
}, userSetting.getPlayTimeout());
cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack, cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack,
inviteStreamInfo -> { inviteStreamInfo -> {
logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString()); logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString());
timer.cancel(); dynamicTask.stop(downLoadTimeOutTaskKey);
StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
streamInfo.setStartTime(startTime); streamInfo.setStartTime(startTime);
streamInfo.setEndTime(endTime); streamInfo.setEndTime(endTime);
@ -515,7 +520,7 @@ public class PlayServiceImpl implements IPlayService {
downloadResult.setResponse(inviteStreamInfo.getResponse()); downloadResult.setResponse(inviteStreamInfo.getResponse());
hookCallBack.call(downloadResult); hookCallBack.call(downloadResult);
}, event -> { }, event -> {
timer.cancel(); dynamicTask.stop(downLoadTimeOutTaskKey);
downloadResult.setCode(-1); downloadResult.setCode(-1);
wvpResult.setCode(-1); wvpResult.setCode(-1);
wvpResult.setMsg(String.format("录像下载失败, 错误码: %s, %s", event.statusCode, event.msg)); wvpResult.setMsg(String.format("录像下载失败, 错误码: %s, %s", event.statusCode, event.msg));

View File

@ -194,7 +194,9 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
@Override @Override
public JSONObject removeStreamProxyFromZlm(StreamProxyItem param) { public JSONObject removeStreamProxyFromZlm(StreamProxyItem param) {
if (param ==null) return null; if (param ==null) {
return null;
}
MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
JSONObject result = zlmresTfulUtils.closeStreams(mediaServerItem, param.getApp(), param.getStream()); JSONObject result = zlmresTfulUtils.closeStreams(mediaServerItem, param.getApp(), param.getStream());
return result; return result;
@ -230,7 +232,9 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
StreamProxyItem streamProxy = videoManagerStorager.queryStreamProxy(app, stream); StreamProxyItem streamProxy = videoManagerStorager.queryStreamProxy(app, stream);
if (!streamProxy.isEnable() && streamProxy != null) { if (!streamProxy.isEnable() && streamProxy != null) {
JSONObject jsonObject = addStreamProxyToZlm(streamProxy); JSONObject jsonObject = addStreamProxyToZlm(streamProxy);
if (jsonObject == null) return false; if (jsonObject == null) {
return false;
}
if (jsonObject.getInteger("code") == 0) { if (jsonObject.getInteger("code") == 0) {
result = true; result = true;
streamProxy.setEnable(true); streamProxy.setEnable(true);

View File

@ -66,7 +66,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
@Override @Override
public List<StreamPushItem> handleJSON(String jsonData, MediaServerItem mediaServerItem) { public List<StreamPushItem> handleJSON(String jsonData, MediaServerItem mediaServerItem) {
if (jsonData == null) return null; if (jsonData == null) {
return null;
}
Map<String, StreamPushItem> result = new HashMap<>(); Map<String, StreamPushItem> result = new HashMap<>();
@ -219,7 +221,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
} }
} }
zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{ zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{
if (mediaList == null) return; if (mediaList == null) {
return;
}
String dataStr = mediaList.getString("data"); String dataStr = mediaList.getString("data");
Integer code = mediaList.getInteger("code"); Integer code = mediaList.getInteger("code");

View File

@ -34,7 +34,9 @@ public class UserServiceImpl implements IUserService {
@Override @Override
public int addUser(User user) { public int addUser(User user) {
User userByUsername = userMapper.getUserByUsername(user.getUsername()); User userByUsername = userMapper.getUserByUsername(user.getUsername());
if (userByUsername != null) return 0; if (userByUsername != null) {
return 0;
}
return userMapper.add(user); return userMapper.add(user);
} }
@Override @Override

View File

@ -223,4 +223,11 @@ public interface IRedisCatchStorage {
void sendStreamPushRequestedMsg(MessageForPushChannel messageForPushChannel); void sendStreamPushRequestedMsg(MessageForPushChannel messageForPushChannel);
/**
* 判断设备状态
* @param deviceId 设备ID
* @return
*/
public boolean deviceIsOnline(String deviceId);
} }

View File

@ -103,7 +103,9 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
*/ */
@Override @Override
public boolean stopPlay(StreamInfo streamInfo) { public boolean stopPlay(StreamInfo streamInfo) {
if (streamInfo == null) return false; if (streamInfo == null) {
return false;
}
return redis.del(String.format("%S_%s_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, return redis.del(String.format("%S_%s_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
userSetting.getServerId(), userSetting.getServerId(),
streamInfo.getStream(), streamInfo.getStream(),
@ -127,7 +129,9 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
@Override @Override
public StreamInfo queryPlayByStreamId(String streamId) { public StreamInfo queryPlayByStreamId(String streamId) {
List<Object> playLeys = redis.scan(String.format("%S_%s_%s_*", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(), streamId)); List<Object> playLeys = redis.scan(String.format("%S_%s_%s_*", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(), streamId));
if (playLeys == null || playLeys.size() == 0) return null; if (playLeys == null || playLeys.size() == 0) {
return null;
}
return (StreamInfo)redis.get(playLeys.get(0).toString()); return (StreamInfo)redis.get(playLeys.get(0).toString());
} }
@ -137,7 +141,9 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
userSetting.getServerId(), userSetting.getServerId(),
deviceId, deviceId,
channelId)); channelId));
if (playLeys == null || playLeys.size() == 0) return null; if (playLeys == null || playLeys.size() == 0) {
return null;
}
return (StreamInfo)redis.get(playLeys.get(0).toString()); return (StreamInfo)redis.get(playLeys.get(0).toString());
} }
@ -146,7 +152,9 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
Map<String, StreamInfo> streamInfos = new HashMap<>(); Map<String, StreamInfo> streamInfos = new HashMap<>();
// List<Object> playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId)); // List<Object> playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
List<Object> players = redis.scan(String.format("%S_%s_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(),deviceId)); List<Object> players = redis.scan(String.format("%S_%s_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(),deviceId));
if (players.size() == 0) return streamInfos; if (players.size() == 0) {
return streamInfos;
}
for (Object player : players) { for (Object player : players) {
String key = (String) player; String key = (String) player;
StreamInfo streamInfo = (StreamInfo) redis.get(key); StreamInfo streamInfo = (StreamInfo) redis.get(key);
@ -182,10 +190,18 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
deviceChannel.setDeviceId(deviceId); deviceChannel.setDeviceId(deviceId);
deviceChannelMapper.update(deviceChannel); deviceChannelMapper.update(deviceChannel);
} }
if (deviceId == null) deviceId = "*"; if (deviceId == null) {
if (channelId == null) channelId = "*"; deviceId = "*";
if (stream == null) stream = "*"; }
if (callId == null) callId = "*"; if (channelId == null) {
channelId = "*";
}
if (stream == null) {
stream = "*";
}
if (callId == null) {
callId = "*";
}
String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX,
userSetting.getServerId(), userSetting.getServerId(),
deviceId, deviceId,
@ -210,10 +226,18 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
deviceChannel.setDeviceId(deviceId); deviceChannel.setDeviceId(deviceId);
deviceChannelMapper.update(deviceChannel); deviceChannelMapper.update(deviceChannel);
} }
if (deviceId == null) deviceId = "*"; if (deviceId == null) {
if (channelId == null) channelId = "*"; deviceId = "*";
if (stream == null) stream = "*"; }
if (callId == null) callId = "*"; if (channelId == null) {
channelId = "*";
}
if (stream == null) {
stream = "*";
}
if (callId == null) {
callId = "*";
}
String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
userSetting.getServerId(), userSetting.getServerId(),
deviceId, deviceId,
@ -235,10 +259,18 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
if (stream == null && callId == null) { if (stream == null && callId == null) {
return null; return null;
} }
if (deviceId == null) deviceId = "*"; if (deviceId == null) {
if (channelId == null) channelId = "*"; deviceId = "*";
if (stream == null) stream = "*"; }
if (callId == null) callId = "*"; if (channelId == null) {
channelId = "*";
}
if (stream == null) {
stream = "*";
}
if (callId == null) {
callId = "*";
}
String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
userSetting.getServerId(), userSetting.getServerId(),
deviceId, deviceId,
@ -328,10 +360,18 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
@Override @Override
public SendRtpItem querySendRTPServer(String platformGbId, String channelId, String streamId, String callId) { public SendRtpItem querySendRTPServer(String platformGbId, String channelId, String streamId, String callId) {
if (platformGbId == null) platformGbId = "*"; if (platformGbId == null) {
if (channelId == null) channelId = "*"; platformGbId = "*";
if (streamId == null) streamId = "*"; }
if (callId == null) callId = "*"; if (channelId == null) {
channelId = "*";
}
if (streamId == null) {
streamId = "*";
}
if (callId == null) {
callId = "*";
}
String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId
+ "_" + channelId + "_" + streamId + "_" + callId; + "_" + channelId + "_" + streamId + "_" + callId;
List<Object> scan = redis.scan(key); List<Object> scan = redis.scan(key);
@ -344,7 +384,9 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
@Override @Override
public List<SendRtpItem> querySendRTPServer(String platformGbId) { public List<SendRtpItem> querySendRTPServer(String platformGbId) {
if (platformGbId == null) platformGbId = "*"; if (platformGbId == null) {
platformGbId = "*";
}
String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId + "_*" + "_*" + "_*"; String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId + "_*" + "_*" + "_*";
List<Object> queryResult = redis.scan(key); List<Object> queryResult = redis.scan(key);
List<SendRtpItem> result= new ArrayList<>(); List<SendRtpItem> result= new ArrayList<>();
@ -364,8 +406,12 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
*/ */
@Override @Override
public void deleteSendRTPServer(String platformGbId, String channelId, String callId, String streamId) { public void deleteSendRTPServer(String platformGbId, String channelId, String callId, String streamId) {
if (streamId == null) streamId = "*"; if (streamId == null) {
if (callId == null) callId = "*"; streamId = "*";
}
if (callId == null) {
callId = "*";
}
String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId
+ "_" + channelId + "_" + streamId + "_" + callId; + "_" + channelId + "_" + streamId + "_" + callId;
List<Object> scan = redis.scan(key); List<Object> scan = redis.scan(key);
@ -473,10 +519,18 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
if (stream == null && callId == null) { if (stream == null && callId == null) {
return null; return null;
} }
if (deviceId == null) deviceId = "*"; if (deviceId == null) {
if (channelId == null) channelId = "*"; deviceId = "*";
if (stream == null) stream = "*"; }
if (callId == null) callId = "*"; if (channelId == null) {
channelId = "*";
}
if (stream == null) {
stream = "*";
}
if (callId == null) {
callId = "*";
}
String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX,
userSetting.getServerId(), userSetting.getServerId(),
deviceId, deviceId,
@ -645,4 +699,10 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
logger.info("[redis 报警通知] {}: {}", key, JSON.toJSON(msg)); logger.info("[redis 报警通知] {}: {}", key, JSON.toJSON(msg));
redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg));
} }
@Override
public boolean deviceIsOnline(String deviceId) {
String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + deviceId;
return redis.hasKey(key);
}
} }

View File

@ -460,7 +460,9 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
public synchronized boolean outline(String deviceId) { public synchronized boolean outline(String deviceId) {
logger.info("更新设备离线: " + deviceId); logger.info("更新设备离线: " + deviceId);
Device device = deviceMapper.getDeviceByDeviceId(deviceId); Device device = deviceMapper.getDeviceByDeviceId(deviceId);
if (device == null) return false; if (device == null) {
return false;
}
device.setOnline(0); device.setOnline(0);
redisCatchStorage.updateDevice(device); redisCatchStorage.updateDevice(device);
return deviceMapper.update(device) > 0; return deviceMapper.update(device) > 0;
@ -714,6 +716,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
* 删除指定设备的所有移动位置 * 删除指定设备的所有移动位置
* @param deviceId * @param deviceId
*/ */
@Override
public int clearMobilePositionsByDeviceId(String deviceId) { public int clearMobilePositionsByDeviceId(String deviceId) {
return deviceMobilePositionMapper.clearMobilePositionsByDeviceId(deviceId); return deviceMobilePositionMapper.clearMobilePositionsByDeviceId(deviceId);
} }
@ -859,7 +862,9 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
@Override @Override
public void updateMediaList(List<StreamPushItem> streamPushItems) { public void updateMediaList(List<StreamPushItem> streamPushItems) {
if (streamPushItems == null || streamPushItems.size() == 0) return; if (streamPushItems == null || streamPushItems.size() == 0) {
return;
}
logger.info("updateMediaList: " + streamPushItems.size()); logger.info("updateMediaList: " + streamPushItems.size());
streamPushMapper.addAll(streamPushItems); streamPushMapper.addAll(streamPushItems);
// TODO 待优化 // TODO 待优化

View File

@ -34,7 +34,9 @@ public class SpringBeanFactory implements ApplicationContextAware {
* 获取对象 这里重写了bean方法起主要作用 * 获取对象 这里重写了bean方法起主要作用
*/ */
public static Object getBean(String beanId) throws BeansException { public static Object getBean(String beanId) throws BeansException {
if (applicationContext == null) return null; if (applicationContext == null) {
return null;
}
return applicationContext.getBean(beanId); return applicationContext.getBean(beanId);
} }

View File

@ -85,16 +85,30 @@ public class AlarmController {
@RequestParam(required = false) String startTime, @RequestParam(required = false) String startTime,
@RequestParam(required = false) String endTime @RequestParam(required = false) String endTime
) { ) {
if (StringUtils.isEmpty(alarmPriority)) alarmPriority = null; if (StringUtils.isEmpty(alarmPriority)) {
if (StringUtils.isEmpty(alarmMethod)) alarmMethod = null; alarmPriority = null;
if (StringUtils.isEmpty(alarmType)) alarmType = null; }
if (StringUtils.isEmpty(startTime)) startTime = null; if (StringUtils.isEmpty(alarmMethod)) {
if (StringUtils.isEmpty(endTime)) endTime = null; alarmMethod = null;
}
if (StringUtils.isEmpty(alarmType)) {
alarmType = null;
}
if (StringUtils.isEmpty(startTime)) {
startTime = null;
}
if (StringUtils.isEmpty(endTime)) {
endTime = null;
}
try { try {
if (startTime != null) format.parse(startTime); if (startTime != null) {
if (endTime != null) format.parse(endTime); format.parse(startTime);
}
if (endTime != null) {
format.parse(endTime);
}
} catch (ParseException e) { } catch (ParseException e) {
return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
} }
@ -125,9 +139,15 @@ public class AlarmController {
@RequestParam(required = false) String deviceIds, @RequestParam(required = false) String deviceIds,
@RequestParam(required = false) String time @RequestParam(required = false) String time
) { ) {
if (StringUtils.isEmpty(id)) id = null; if (StringUtils.isEmpty(id)) {
if (StringUtils.isEmpty(deviceIds)) deviceIds = null; id = null;
if (StringUtils.isEmpty(time)) time = null; }
if (StringUtils.isEmpty(deviceIds)) {
deviceIds = null;
}
if (StringUtils.isEmpty(time)) {
time = null;
}
try { try {
if (time != null) { if (time != null) {
format.parse(time); format.parse(time);

View File

@ -6,7 +6,6 @@ import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder;
import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask;
import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask;
@ -55,9 +54,6 @@ public class DeviceQuery {
@Autowired @Autowired
private DeferredResultHolder resultHolder; private DeferredResultHolder resultHolder;
@Autowired
private DeviceOffLineDetector offLineDetector;
@Autowired @Autowired
private IDeviceService deviceService; private IDeviceService deviceService;
@ -310,9 +306,15 @@ public class DeviceQuery {
if (device != null && device.getDeviceId() != null) { if (device != null && device.getDeviceId() != null) {
Device deviceInStore = storager.queryVideoDevice(device.getDeviceId()); Device deviceInStore = storager.queryVideoDevice(device.getDeviceId());
if (!StringUtils.isEmpty(device.getName())) deviceInStore.setName(device.getName()); if (!StringUtils.isEmpty(device.getName())) {
if (!StringUtils.isEmpty(device.getCharset())) deviceInStore.setCharset(device.getCharset()); deviceInStore.setName(device.getName());
if (!StringUtils.isEmpty(device.getMediaServerId())) deviceInStore.setMediaServerId(device.getMediaServerId()); }
if (!StringUtils.isEmpty(device.getCharset())) {
deviceInStore.setCharset(device.getCharset());
}
if (!StringUtils.isEmpty(device.getMediaServerId())) {
deviceInStore.setMediaServerId(device.getMediaServerId());
}
// 目录订阅相关的信息 // 目录订阅相关的信息
if (device.getSubscribeCycleForCatalog() > 0) { if (device.getSubscribeCycleForCatalog() > 0) {

View File

@ -286,7 +286,9 @@ public class PlatformController {
return new ResponseEntity<>("missing parameters", HttpStatus.BAD_REQUEST); return new ResponseEntity<>("missing parameters", HttpStatus.BAD_REQUEST);
} }
ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(serverGBId); ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(serverGBId);
if (parentPlatform == null) return new ResponseEntity<>("fail", HttpStatus.OK); if (parentPlatform == null) {
return new ResponseEntity<>("fail", HttpStatus.OK);
}
// 发送离线消息,无论是否成功都删除缓存 // 发送离线消息,无论是否成功都删除缓存
commanderForPlatform.unregister(parentPlatform, (event -> { commanderForPlatform.unregister(parentPlatform, (event -> {
// 清空redis缓存 // 清空redis缓存

View File

@ -65,16 +65,26 @@ public class LogController {
@RequestParam(required = false) String startTime, @RequestParam(required = false) String startTime,
@RequestParam(required = false) String endTime @RequestParam(required = false) String endTime
) { ) {
if (StringUtils.isEmpty(query)) query = null; if (StringUtils.isEmpty(query)) {
if (StringUtils.isEmpty(startTime)) startTime = null; query = null;
if (StringUtils.isEmpty(endTime)) endTime = null; }
if (StringUtils.isEmpty(startTime)) {
startTime = null;
}
if (StringUtils.isEmpty(endTime)) {
endTime = null;
}
if (!userSetting.getLogInDatebase()) { if (!userSetting.getLogInDatebase()) {
logger.warn("自动记录日志功能已关闭,查询结果可能不完整。"); logger.warn("自动记录日志功能已关闭,查询结果可能不完整。");
} }
try { try {
if (startTime != null) format.parse(startTime); if (startTime != null) {
if (endTime != null) format.parse(endTime); format.parse(startTime);
}
if (endTime != null) {
format.parse(endTime);
}
} catch (ParseException e) { } catch (ParseException e) {
return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
} }

View File

@ -69,9 +69,15 @@ public class StreamProxyController {
@ResponseBody @ResponseBody
public WVPResult save(@RequestBody StreamProxyItem param){ public WVPResult save(@RequestBody StreamProxyItem param){
logger.info("添加代理: " + JSONObject.toJSONString(param)); logger.info("添加代理: " + JSONObject.toJSONString(param));
if (StringUtils.isEmpty(param.getMediaServerId())) param.setMediaServerId("auto"); if (StringUtils.isEmpty(param.getMediaServerId())) {
if (StringUtils.isEmpty(param.getType())) param.setType("default"); param.setMediaServerId("auto");
if (StringUtils.isEmpty(param.getGbId())) param.setGbId(null); }
if (StringUtils.isEmpty(param.getType())) {
param.setType("default");
}
if (StringUtils.isEmpty(param.getGbId())) {
param.setGbId(null);
}
WVPResult<StreamInfo> result = streamProxyService.save(param); WVPResult<StreamInfo> result = streamProxyService.save(param);
return result; return result;
} }

View File

@ -68,7 +68,7 @@ public class ApiStreamController {
@RequestParam(required = false)String timeout @RequestParam(required = false)String timeout
){ ){
DeferredResult<JSONObject> resultDeferredResult = new DeferredResult<>(userSetting.getPlayTimeout() + 10); DeferredResult<JSONObject> resultDeferredResult = new DeferredResult<>(userSetting.getPlayTimeout().longValue() + 10);
Device device = storager.queryVideoDevice(serial); Device device = storager.queryVideoDevice(serial);
if (device == null ) { if (device == null ) {
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();

View File

@ -12,26 +12,7 @@
<script type="text/javascript" src="./static/js/jessibuca/jessibuca.js"></script> <script type="text/javascript" src="./static/js/jessibuca/jessibuca.js"></script>
<script type="text/javascript" src="./static/js/EasyWasmPlayer.js"></script> <script type="text/javascript" src="./static/js/EasyWasmPlayer.js"></script>
<script type="text/javascript" src="./static/js/ZLMRTCClient.js"></script> <script type="text/javascript" src="./static/js/ZLMRTCClient.js"></script>
<script type="text/javascript" src="./static/js/mapConfig.js"></script>
<div id="app"></div> <div id="app"></div>
<!-- built files will be auto injected -->
<script>
// map组件全局参数, 注释此内容可以关闭地图功能
window.mapParam = {
// 坐标系 GCJ-02 WGS-84,
coordinateSystem: "GCJ-02",
// 地图瓦片地址
tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8",
// 瓦片大小
tileSize: 256,
// 默认层级
zoom:10,
// 默认地图中心点
center:[116.41020, 39.915119],
// 地图最大层级
maxZoom:18,
// 地图最小层级
minZoom: 3
}
</script>
</body> </body>
</html> </html>

View File

@ -1,5 +1,5 @@
<template> <template>
<div ref="container" @dblclick="fullscreenSwich" style="width:100%;height:100%;background-color: #eee;margin:0 auto;"> <div ref="container" @dblclick="fullscreenSwich" style="width:100%;height:100%;background-color: #000000;margin:0 auto;">
<div class="buttons-box" id="buttonsBox"> <div class="buttons-box" id="buttonsBox">
<div class="buttons-box-left"> <div class="buttons-box-left">
<i v-if="!playing" class="iconfont icon-play jessibuca-btn" @click="playBtnClick"></i> <i v-if="!playing" class="iconfont icon-play jessibuca-btn" @click="playBtnClick"></i>

View File

@ -59,7 +59,7 @@ export default {
}, },
data() { data() {
return { return {
onOff: typeof window.mapParam !== "undefined", onOff: typeof window.mapParam !== "undefined" && window.mapParam.enable,
deviceService: new DeviceService(), deviceService: new DeviceService(),
layer: null, layer: null,
lineLayer: null, lineLayer: null,

View File

@ -0,0 +1,19 @@
// map组件全局参数, 注释此内容可以关闭地图功能
window.mapParam = {
// 开启/关闭地图功能
enable: true,
// 坐标系 GCJ-02 WGS-84,
coordinateSystem: "GCJ-02",
// 地图瓦片地址
tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8",
// 瓦片大小
tileSize: 256,
// 默认层级
zoom:10,
// 默认地图中心点
center:[116.41020, 39.915119],
// 地图最大层级
maxZoom:18,
// 地图最小层级
minZoom: 3
}