From df46dbd653a61878f3e9023875b327dd2f60ffbc Mon Sep 17 00:00:00 2001 From: zxb <919411476@qq.com> Date: Tue, 8 Aug 2023 11:26:51 +0800 Subject: [PATCH] =?UTF-8?q?wvp=5Fdevice=5Fchannel=20stream=5Fid=20?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E8=BF=87=E7=9F=AD=E5=AF=BC=E8=87=B4=E5=9B=BD?= =?UTF-8?q?=E6=A0=87=E7=BA=A7=E8=81=94=E4=B8=8A=E7=BA=A7=E7=82=B9=E6=92=AD?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E5=BD=95=E5=83=8F=E5=87=BA=E9=94=99=20?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E5=A5=87=E5=A5=87=E6=80=AA=E6=80=AA=E7=9A=84?= =?UTF-8?q?bug=20=E8=B0=83=E8=AF=95/=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 +++-- sql/2.6.8升级2.6.9.sql | 2 +- .../event/record/RecordEndEventListener.java | 4 +- .../cmd/impl/SIPCommanderFroPlatform.java | 56 +++++++++---------- .../cmd/RecordInfoResponseMessageHandler.java | 5 +- .../iot/vmp/gb28181/utils/XmlUtil.java | 19 +++++++ .../com/genersoft/iot/vmp/utils/DateUtil.java | 3 + 7 files changed, 64 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index 8d24ee8c..49115e23 100644 --- a/pom.xml +++ b/pom.xml @@ -300,11 +300,11 @@ test - - - org.springframework.boot - spring-boot-devtools - + + + + + @@ -328,7 +328,8 @@ - ${project.artifactId}-${project.version}-${maven.build.timestamp} + + ${project.artifactId}-${project.version} org.springframework.boot diff --git a/sql/2.6.8升级2.6.9.sql b/sql/2.6.8升级2.6.9.sql index 7b16c357..0b4fa389 100644 --- a/sql/2.6.8升级2.6.9.sql +++ b/sql/2.6.8升级2.6.9.sql @@ -120,7 +120,7 @@ alter table device_channel change status status bool default false; alter table device_channel - change streamId stream_id varchar(50) null; + change streamId stream_id varchar(80) null; alter table device_channel change deviceId device_id varchar(50) not null; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java index 8df42062..495722a0 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java @@ -35,10 +35,12 @@ public class RecordEndEventListener implements ApplicationListener {}", handlerMap.size()); if (handlerMap.size() > 0) { + logger.debug("handlerMap.keys => {}", handlerMap.keySet()); RecordEndEventHandler handler = handlerMap.get(deviceId + channelId); logger.debug("handler => {}", handler); if (handler != null){ diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java index 09c8ab4b..d3593790 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java @@ -19,8 +19,7 @@ import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.utils.GitUtil; import gov.nist.javax.sip.message.MessageFactoryImpl; import gov.nist.javax.sip.message.SIPRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.DependsOn; import org.springframework.lang.Nullable; @@ -37,12 +36,10 @@ import java.text.ParseException; import java.util.ArrayList; import java.util.List; +@Slf4j @Component @DependsOn("sipLayer") public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { - - private final Logger logger = LoggerFactory.getLogger(SIPCommanderFroPlatform.class); - @Autowired private SIPRequestHeaderPlarformProvider headerProviderPlatformProvider; @@ -113,13 +110,13 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { // 将 callid 写入缓存, 等注册成功可以更新状态 String callIdFromHeader = callIdHeader.getCallId(); PlatformRegisterInfo instance = PlatformRegisterInfo.getInstance(parentPlatform.getServerGBId(), isRegister); - logger.info("callIdFromHeader {}",callIdFromHeader); - logger.info("PlatformRegisterInfo {}",instance); + log.info("callIdFromHeader {}",callIdFromHeader); + log.info("PlatformRegisterInfo {}",instance); redisCatchStorage.updatePlatformRegisterInfo(callIdFromHeader, instance); sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (event)->{ if (event != null) { - logger.info("向上级平台 [ {} ] 注册发生错误: {} ", + log.info("向上级平台 [ {} ] 注册发生错误: {} ", parentPlatform.getServerGBId(), event.msg); } @@ -218,7 +215,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { }else { if (channel.getChannelId().length() != 20) { catalogXml.append("\r\n"); - logger.warn("[编号长度异常] {} 长度错误,请使用20位长度的国标编号,当前长度:{}", channel.getChannelId(), channel.getChannelId().length()); + log.warn("[编号长度异常] {} 长度错误,请使用20位长度的国标编号,当前长度:{}", channel.getChannelId(), channel.getChannelId().length()); catalogXml.append("\r\n"); continue; } @@ -386,9 +383,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { String callId = request.getCallIdHeader().getCallId(); - logger.info("[命令发送] 国标级联{} 目录查询回复: 共{}条,已发送{}条", parentPlatform.getServerGBId(), + log.info("[命令发送] 国标级联{} 目录查询回复: 共{}条,已发送{}条", parentPlatform.getServerGBId(), channels.size(), Math.min(index + parentPlatform.getCatalogGroup(), channels.size())); - logger.debug(catalogXml); + log.debug(catalogXml); if (sendAfterResponse) { // 默认按照收到200回复后发送下一条, 如果超时收不到回复,就以30毫秒的间隔直接发送。 dynamicTask.startDelay(timeoutTaskKey, ()->{ @@ -397,11 +394,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { try { sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext, false); } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage()); + log.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage()); } }, 3000); sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, eventResult -> { - logger.error("[目录推送失败] 国标级联 platform : {}, code: {}, msg: {}, 停止发送", parentPlatform.getServerGBId(), eventResult.statusCode, eventResult.msg); + log.error("[目录推送失败] 国标级联 platform : {}, code: {}, msg: {}, 停止发送", parentPlatform.getServerGBId(), eventResult.statusCode, eventResult.msg); dynamicTask.stop(timeoutTaskKey); }, eventResult -> { dynamicTask.stop(timeoutTaskKey); @@ -409,12 +406,12 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { try { sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext, true); } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage()); + log.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage()); } }); }else { sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, eventResult -> { - logger.error("[目录推送失败] 国标级联 platform : {}, code: {}, msg: {}, 停止发送", parentPlatform.getServerGBId(), eventResult.statusCode, eventResult.msg); + log.error("[目录推送失败] 国标级联 platform : {}, code: {}, msg: {}, 停止发送", parentPlatform.getServerGBId(), eventResult.statusCode, eventResult.msg); dynamicTask.stop(timeoutTaskKey); }, null); dynamicTask.startDelay(timeoutTaskKey, ()->{ @@ -422,7 +419,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { try { sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext, false); } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage()); + log.error("[命令发送失败] 国标级联 目录查询回复: {}", e.getMessage()); } }, 30); } @@ -501,8 +498,8 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { if (parentPlatform == null) { return; } - if (logger.isDebugEnabled()) { - logger.debug("[发送 移动位置订阅] {}/{}->{},{}", parentPlatform.getServerGBId(), gpsMsgInfo.getId(), gpsMsgInfo.getLng(), gpsMsgInfo.getLat()); + if (log.isDebugEnabled()) { + log.debug("[发送 移动位置订阅] {}/{}->{},{}", parentPlatform.getServerGBId(), gpsMsgInfo.getId(), gpsMsgInfo.getLng(), gpsMsgInfo.getLat()); } String characterSet = parentPlatform.getCharacterSet(); @@ -521,7 +518,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { .append("\r\n"); sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> { - logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); + log.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); }, null); } @@ -531,7 +528,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { if (parentPlatform == null) { return; } - logger.info("[发送报警通知]平台: {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), + log.info("[发送报警通知]平台: {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSON.toJSONString(deviceAlarm)); String characterSet = parentPlatform.getCharacterSet(); StringBuffer deviceStatusXml = new StringBuffer(600); @@ -579,14 +576,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channels, deviceChannels.size(), type, subscribeInfo); sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> { - logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); + log.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); }, (eventResult -> { try { sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + parentPlatform.getCatalogGroup()); } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException | IllegalAccessException e) { - logger.error("[命令发送失败] 国标级联 NOTIFY通知: {}", e.getMessage()); + log.error("[命令发送失败] 国标级联 NOTIFY通知: {}", e.getMessage()); } })); } @@ -666,7 +663,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) { - logger.warn("[缺少必要参数]"); + log.warn("[缺少必要参数]"); return; } @@ -685,14 +682,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { Integer finalIndex = index; String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, channels, type); sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> { - logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); + log.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); }, eventResult -> { try { sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + parentPlatform.getCatalogGroup()); } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException | IllegalAccessException e) { - logger.error("[命令发送失败] 国标级联 NOTIFY通知: {}", e.getMessage()); + log.error("[命令发送失败] 国标级联 NOTIFY通知: {}", e.getMessage()); } }); } @@ -725,6 +722,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { } @Override public void recordInfo(DeviceChannel deviceChannel, ParentPlatform parentPlatform, String fromTag, RecordInfo recordInfo) throws SipException, InvalidArgumentException, ParseException { + log.debug("deviceChannel => {}, parentPlatform => {}, fromTag => {}, recordInfo => {}", deviceChannel, parentPlatform, fromTag, recordInfo); if ( parentPlatform ==null) { return ; } @@ -811,14 +809,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @Override public void streamByeCmd(ParentPlatform parentPlatform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException { if (sendRtpItem == null ) { - logger.info("[向上级发送BYE], sendRtpItem 为NULL"); + log.info("[向上级发送BYE], sendRtpItem 为NULL"); return; } if (parentPlatform == null) { - logger.info("[向上级发送BYE], platform 为NULL"); + log.info("[向上级发送BYE], platform 为NULL"); return; } - logger.info("[向上级发送BYE], {}/{}", parentPlatform.getServerGBId(), sendRtpItem.getChannelId()); + log.info("[向上级发送BYE], {}/{}", parentPlatform.getServerGBId(), sendRtpItem.getChannelId()); String mediaServerId = sendRtpItem.getMediaServerId(); MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); if (mediaServerItem != null) { @@ -827,7 +825,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { } SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(parentPlatform, sendRtpItem); if (byeRequest == null) { - logger.warn("[向上级发送bye]:无法创建 byeRequest"); + log.warn("[向上级发送bye]:无法创建 byeRequest"); } sipSender.transmitRequest(parentPlatform.getDeviceIp(),byeRequest); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java index 36e5df29..4f2ba593 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java @@ -8,9 +8,12 @@ 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.impl.message.IMessageHandler; 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.utils.DateUtil; import com.genersoft.iot.vmp.utils.UJson; import gov.nist.javax.sip.message.SIPRequest; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,7 +81,7 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent } taskExecutor.execute(()->{ try { - + logger.debug("rootElement => {}",XmlUtil.getElementMap(rootElement)); String sn = getText(rootElement, "SN"); String channelId = getText(rootElement, "DeviceID"); RecordInfo recordInfo = new RecordInfo(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java index 8c96a8e8..0963b9e2 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java @@ -644,4 +644,23 @@ public class XmlUtil { } return val; } + + + public static Map getElementMap(Element element) { + List elements = element.elements(); + //没有子元素 + Map map = new HashMap<>(16); + if (elements.size() == 0) { + String name = element.getName(); + String value = element.getText(); + map.put(name, value); + } else { + //有子元素 + for (Element el : elements) { + String name = el.getName(); + map.put(name,getElementMap(el)); + } + } + return map; + } } \ No newline at end of file diff --git a/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java index 23cb9dac..72d1e8ae 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java @@ -109,6 +109,9 @@ public class DateUtil { } public static long getDifferenceForNow(String keepaliveTime) { + if(keepaliveTime == null){ + return 0; + } Instant beforeInstant = Instant.from(formatter.parse(keepaliveTime)); return ChronoUnit.MILLIS.between(beforeInstant, Instant.now()); }