Compare commits

...

5 Commits

Author SHA1 Message Date
阿斌
d029c157ac
Pre Merge pull request !43 from 阿斌/N/A 2026-06-18 06:27:22 +00:00
lin
bc1b5797e8 修复缺少的消息回复 2026-06-18 14:27:00 +08:00
lin
ef69a355fd 去除心跳消息多余回复的 2026-06-18 13:07:05 +08:00
lin
03d36a9ac7 message回调事件支持单sn多回复 2026-06-18 10:32:43 +08:00
阿斌
42a85fbb07
修复生产厂商的gbManufacture少一个r导致设备厂商无法显示
Signed-off-by: 阿斌 <38912748@qq.com>
2025-12-03 10:50:05 +00:00
13 changed files with 69 additions and 17 deletions

View File

@ -22,6 +22,8 @@ public class MessageEvent<T> implements Delayed {
private String result; private String result;
private boolean keepAlive = false;
private T t; private T t;
private ErrorCallback<T> callback; private ErrorCallback<T> callback;

View File

@ -3,15 +3,22 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import gov.nist.javax.sip.message.SIPRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.sip.InvalidArgumentException;
import javax.sip.RequestEvent; import javax.sip.RequestEvent;
import javax.sip.SipException;
import javax.sip.message.Response;
import java.text.ParseException;
/** /**
* SIP命令类型 CANCEL请求 * SIP命令类型 CANCEL请求
*/ */
@Slf4j
@Component @Component
public class CancelRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { public class CancelRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor {
@ -34,7 +41,11 @@ public class CancelRequestProcessor extends SIPRequestProcessorParent implements
@Override @Override
public void process(RequestEvent evt) { public void process(RequestEvent evt) {
// TODO 优先级99 Cancel Request消息实现此消息一般为级联消息上级给下级发送请求取消指令 // TODO 优先级99 Cancel Request消息实现此消息一般为级联消息上级给下级发送请求取消指令
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
} }

View File

@ -593,7 +593,12 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
playService.stopAudioBroadcast(device, deviceChannel); playService.stopAudioBroadcast(device, deviceChannel);
} }
} catch (SdpException e) { } catch (SdpException e) {
log.error("[SDP解析异常]", e); log.error("[语音通话] SDP解析异常", e);
try {
responseAck(request, Response.BAD_REQUEST);
} catch (SipException | InvalidArgumentException | ParseException exception) {
log.error("[命令发送失败] 来自设备的Invite请求非语音广播 FORBIDDEN: {}", exception.getMessage());
}
playService.stopAudioBroadcast(device, deviceChannel); playService.stopAudioBroadcast(device, deviceChannel);
} }
} }

View File

@ -63,6 +63,11 @@ public abstract class MessageHandlerAbstract extends SIPRequestProcessorParent i
messageHandler.handForDevice(evt, device, element); messageHandler.handForDevice(evt, device, element);
}else { }else {
handMessageEvent(element, null); handMessageEvent(element, null);
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
} }
@ -72,6 +77,12 @@ public abstract class MessageHandlerAbstract extends SIPRequestProcessorParent i
IMessageHandler messageHandler = messageHandlerMap.get(cmd); IMessageHandler messageHandler = messageHandlerMap.get(cmd);
if (messageHandler != null) { if (messageHandler != null) {
messageHandler.handForPlatform(evt, parentPlatform, element); messageHandler.handForPlatform(evt, parentPlatform, element);
}else {
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
} }
@ -87,7 +98,9 @@ public abstract class MessageHandlerAbstract extends SIPRequestProcessorParent i
}else { }else {
subscribe.getCallback().run(ErrorCode.ERROR100.getCode(), ErrorCode.ERROR100.getMsg(), result); subscribe.getCallback().run(ErrorCode.ERROR100.getCode(), ErrorCode.ERROR100.getMsg(), result);
} }
if (!subscribe.isKeepAlive()) {
messageSubscribe.removeSubscribe(cmd + sn); messageSubscribe.removeSubscribe(cmd + sn);
} }
} }
}
} }

View File

@ -119,7 +119,7 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement
}else { // 由于上面已经判断都为null则直接返回所以这里device和parentPlatform必有一个不为null }else { // 由于上面已经判断都为null则直接返回所以这里device和parentPlatform必有一个不为null
messageHandler.handForPlatform(evt, parentPlatform, rootElement); messageHandler.handForPlatform(evt, parentPlatform, rootElement);
} }
responseAck(request, Response.OK); // 存在handler则由handler自行决定回复什么
}else { }else {
// 不支持的message // 不支持的message
// 不存在则回复415 // 不存在则回复415

View File

@ -63,7 +63,11 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
@Override @Override
public void handForDevice(RequestEvent evt, Device device, Element element) { public void handForDevice(RequestEvent evt, Device device, Element element) {
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
@Override @Override

View File

@ -71,7 +71,11 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp
@Override @Override
public void handForDevice(RequestEvent evt, Device device, Element element) { public void handForDevice(RequestEvent evt, Device device, Element element) {
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
@Override @Override

View File

@ -34,7 +34,11 @@ public class AlarmQueryMessageHandler extends SIPRequestProcessorParent implemen
@Override @Override
public void handForDevice(RequestEvent evt, Device device, Element element) { public void handForDevice(RequestEvent evt, Device device, Element element) {
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
@Override @Override

View File

@ -55,7 +55,11 @@ public class DeviceInfoQueryMessageHandler extends SIPRequestProcessorParent imp
@Override @Override
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { public void handForDevice(RequestEvent evt, Device device, Element rootElement) {
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
@Override @Override

View File

@ -46,7 +46,11 @@ public class DeviceStatusQueryMessageHandler extends SIPRequestProcessorParent i
@Override @Override
public void handForDevice(RequestEvent evt, Device device, Element element) { public void handForDevice(RequestEvent evt, Device device, Element element) {
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
@Override @Override

View File

@ -65,7 +65,11 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp
@Override @Override
public void handForDevice(RequestEvent evt, Device device, Element element) { public void handForDevice(RequestEvent evt, Device device, Element element) {
try {
responseAck((SIPRequest) evt.getRequest(), Response.OK);
} catch (SipException | InvalidArgumentException | ParseException e) {
log.error("[命令发送失败] 回复200 OK: {}", e.getMessage());
}
} }
@Override @Override

View File

@ -7,10 +7,7 @@ import com.genersoft.iot.vmp.conf.redis.RedisRpcConfig;
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcMessage; import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcMessage;
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcRequest; import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcRequest;
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcResponse; import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcResponse;
import com.genersoft.iot.vmp.gb28181.bean.BasicParam; import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceConfigAware;
import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
import com.genersoft.iot.vmp.gb28181.service.IDeviceService; import com.genersoft.iot.vmp.gb28181.service.IDeviceService;
import com.genersoft.iot.vmp.service.redisMsg.dto.RedisRpcController; import com.genersoft.iot.vmp.service.redisMsg.dto.RedisRpcController;
import com.genersoft.iot.vmp.service.redisMsg.dto.RedisRpcMapping; import com.genersoft.iot.vmp.service.redisMsg.dto.RedisRpcMapping;

View File

@ -89,7 +89,7 @@
<div class="infobox-content" v-if="channel"> <div class="infobox-content" v-if="channel">
<el-descriptions class="margin-top" :title="channel.gbName" :column="1" :colon="true" size="mini" :labelStyle="labelStyle" > <el-descriptions class="margin-top" :title="channel.gbName" :column="1" :colon="true" size="mini" :labelStyle="labelStyle" >
<el-descriptions-item label="编号" >{{channel.gbDeviceId}}</el-descriptions-item> <el-descriptions-item label="编号" >{{channel.gbDeviceId}}</el-descriptions-item>
<el-descriptions-item label="生产厂商">{{channel.gbManufacture}}</el-descriptions-item> <el-descriptions-item label="生产厂商">{{channel.gbManufacturer}}</el-descriptions-item>
<el-descriptions-item label="安装地址" >{{channel.gbAddress == null?'未知': channel.gbAddress}}</el-descriptions-item> <el-descriptions-item label="安装地址" >{{channel.gbAddress == null?'未知': channel.gbAddress}}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<div style="padding-top: 10px; margin: 0 auto; width: fit-content;"> <div style="padding-top: 10px; margin: 0 auto; width: fit-content;">