Compare commits

...

13 Commits

Author SHA1 Message Date
阿斌
f14d56959f
Pre Merge pull request !36 from 阿斌/N/A 2025-07-30 02:23:04 +00:00
lin
24417203f0 修复前端布防撤防调用失败 2025-07-30 10:22:51 +08:00
648540858
d51de48923
Merge pull request #1933 from elpx/master
修改ip与port的拼接方式,以支持ipv6
2025-07-29 16:46:30 +08:00
elpx
3cec9d2bd1 修改ip与port的拼接方式,以支持ipv6 2025-07-28 23:57:16 +08:00
648540858
ed2f104529
Merge pull request #1931 from linwumingshi/fix/download-url
fix: 🐛 修复云录像下载链接中的格式化问题
2025-07-28 22:15:29 +08:00
linwumingshi
1693d904c4 fix: 🐛 修复云录像下载链接中的格式化问题
- 更新了 CloudRecordUtils 类,使其使用 UtilityClass 注解
- 优化了 getDownloadFilePath 方法,将文件路径作为独立参数传入
- 修复了原始实现中可能导致路径格式错误的问题
- 增加了方法注释,说明其功能和参数
2025-07-28 17:38:54 +08:00
648540858
c2d42d67c0
Merge pull request #1929 from XiaoQiTong/wvp-28181-2.0
修复一些实际使用中的bug
2025-07-28 14:58:15 +08:00
韩浩然XiaoQiTong
65553e966e
Update SIPCommander.java 2025-07-28 10:29:47 +08:00
XiaoQiTong
e9c227a3cf 修复查询缓存少流媒体字段,导致指定流媒体收流失效问题 2025-07-27 16:29:00 +08:00
XiaoQiTong
3b1a6b4903 修复部分子码流指定问题,修复修改单个通道码流会全部修改的bug 2025-07-27 16:26:56 +08:00
XiaoQiTong
f9f9d03502 修复预置位查询指令海康平台响应不了的问题 2025-07-27 16:22:50 +08:00
XiaoQiTong
47571962e6 解决获取所有预置位返回错误的bug 2025-07-27 16:19:57 +08:00
阿斌
da98101aac
update src/main/resources/civilCode.csv.
行政规划错误。江苏南通海门市,修改为海门区,浙江杭州删除下城区、江干区,新增钱塘区,临平区

Signed-off-by: 阿斌 <38912748@qq.com>
2024-12-15 08:58:42 +00:00
16 changed files with 173 additions and 43 deletions

View File

@ -1,6 +1,6 @@
/**
* 设备控制命令API接口
*
*
* @author lawrencehj
* @date 2021年2月1日
*/
@ -70,16 +70,16 @@ public class DeviceControl {
@Operation(summary = "布防/撤防", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "deviceId", description = "设备国标编号", required = true)
@Parameter(name = "guardCmdStr", description = "命令, 可选值SetGuard布防ResetGuard撤防", required = true)
@Parameter(name = "guardCmd", description = "命令, 可选值SetGuard布防ResetGuard撤防", required = true)
@GetMapping("/guard")
public DeferredResult<WVPResult<String>> guardApi(String deviceId, String guardCmdStr) {
public DeferredResult<WVPResult<String>> guardApi(String deviceId, String guardCmd) {
if (log.isDebugEnabled()) {
log.debug("布防/撤防API调用");
}
Device device = deviceService.getDeviceByDeviceId(deviceId);
Assert.notNull(device, "设备不存在");
DeferredResult<WVPResult<String>> result = new DeferredResult<>();
deviceService.guard(device, guardCmdStr, (code, msg, data) -> {
deviceService.guard(device, guardCmd, (code, msg, data) -> {
result.setResult(new WVPResult<>(code, msg, data));
});
result.onTimeout(() -> {

View File

@ -252,6 +252,7 @@ public interface DeviceMapper {
"mobile_position_submission_interval,"+
"subscribe_cycle_for_alarm,"+
"ssrc_check,"+
"media_server_id,"+
"as_message_channel,"+
"broadcast_push_after_ack,"+
"geo_coord_sys,"+

View File

@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.utils.GitUtil;
import com.genersoft.iot.vmp.utils.IpPortUtil;
import gov.nist.javax.sip.message.MessageFactoryImpl;
import gov.nist.javax.sip.message.SIPRequest;
import org.springframework.beans.factory.annotation.Autowired;
@ -90,7 +91,7 @@ public class SIPRequestHeaderPlarformProvider {
Request registerRequest = createRegisterRequest(parentPlatform, redisCatchStorage.getCSEQ(), fromTag, toTag, callIdHeader, expires);
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIp() + ":" + parentPlatform.getServerPort());
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), IpPortUtil.concatenateIpAndPort(parentPlatform.getServerIp(), String.valueOf(parentPlatform.getServerPort())));
if (www == null) {
AuthorizationHeader authorizationHeader = SipFactory.getInstance().createHeaderFactory().createAuthorizationHeader("Digest");
String username = parentPlatform.getUsername();
@ -214,7 +215,7 @@ public class SIPRequestHeaderPlarformProvider {
public SIPRequest createNotifyRequest(Platform parentPlatform, String content, SubscribeInfo subscribeInfo) throws PeerUnavailableException, ParseException, InvalidArgumentException {
SIPRequest request = null;
// sipuri
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIp()+ ":" + parentPlatform.getServerPort());
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), IpPortUtil.concatenateIpAndPort(parentPlatform.getServerIp(), String.valueOf(parentPlatform.getServerPort())));
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(), parentPlatform.getDevicePort(),
@ -274,7 +275,7 @@ public class SIPRequestHeaderPlarformProvider {
SIPRequest request = null;
// sipuri
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIp()+ ":" + platform.getServerPort());
SipURI requestURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), IpPortUtil.concatenateIpAndPort(platform.getServerIp(), String.valueOf(platform.getServerPort())));
// via
ArrayList<ViaHeader> viaHeaders = new ArrayList<>();
ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(platform.getDeviceIp(), platform.getDevicePort(),
@ -380,7 +381,7 @@ public class SIPRequestHeaderPlarformProvider {
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(platform.getDeviceIp())+":"+ platform.getDevicePort()));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(sipLayer.getLocalIp(platform.getDeviceIp()), String.valueOf(platform.getDevicePort()))));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));

View File

@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.utils.GitUtil;
import com.genersoft.iot.vmp.utils.IpPortUtil;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse;
import org.springframework.beans.factory.annotation.Autowired;
@ -106,7 +107,7 @@ public class SIPRequestHeaderProvider {
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(sipLayer.getLocalIp(device.getLocalIp()), String.valueOf(sipConfig.getPort()))));
// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
// Subject
@ -142,7 +143,7 @@ public class SIPRequestHeaderProvider {
CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
request = SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(sipLayer.getLocalIp(device.getLocalIp()), String.valueOf(sipConfig.getPort()))));
// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
@ -170,7 +171,7 @@ public class SIPRequestHeaderProvider {
viaHeaders.add(viaHeader);
//from
// SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp()) + ":" + sipConfig.getPort());
SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(sipLayer.getLocalIp(device.getLocalIp()), String.valueOf(sipConfig.getPort())));
Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI);
FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag());
//to
@ -189,7 +190,7 @@ public class SIPRequestHeaderProvider {
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(sipLayer.getLocalIp(device.getLocalIp()), String.valueOf(sipConfig.getPort()))));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
@ -224,7 +225,7 @@ public class SIPRequestHeaderProvider {
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(sipLayer.getLocalIp(device.getLocalIp()), String.valueOf(sipConfig.getPort()))));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
@ -261,7 +262,7 @@ public class SIPRequestHeaderProvider {
toHeader, viaHeaders, maxForwards);
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(sipLayer.getLocalIp(device.getLocalIp()), String.valueOf(sipConfig.getPort()))));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
// Expires
@ -314,7 +315,7 @@ public class SIPRequestHeaderProvider {
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(sipLayer.getLocalIp(device.getLocalIp()), String.valueOf(sipConfig.getPort()))));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
@ -345,7 +346,7 @@ public class SIPRequestHeaderProvider {
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), localIp + ":"+sipConfig.getPort()));
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), IpPortUtil.concatenateIpAndPort(localIp, String.valueOf(sipConfig.getPort()))));
request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(gitUtil));

View File

@ -1139,7 +1139,7 @@ public class SIPCommander implements ISIPCommander {
MessageEvent<Object> messageEvent = MessageEvent.getInstance(cmdType, sn + "", channelId, 4000L, callback);
messageSubscribe.addSubscribe(messageEvent);
log.info("[预置位查询] 设备编号: {} 通道编号: {} SN {}", device.getDeviceId(), channelId, sn);
Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, eventResult -> {
messageSubscribe.removeSubscribe(messageEvent.getKey());
callback.run(ErrorCode.ERROR100.getCode(), "失败," + eventResult.msg, null);

View File

@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request;
import com.genersoft.iot.vmp.gb28181.bean.Platform;
import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.utils.IpPortUtil;
import com.google.common.primitives.Bytes;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse;
@ -95,7 +96,7 @@ public abstract class SIPRequestProcessorParent {
if (responseAckExtraParam.sipURI != null && sipRequest.getMethod().equals(Request.INVITE)) {
log.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort());
Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(
SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort()
SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), IpPortUtil.concatenateIpAndPort(responseAckExtraParam.sipURI.getHost(), String.valueOf(responseAckExtraParam.sipURI.getPort()))
));
response.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
}
@ -135,7 +136,7 @@ public abstract class SIPRequestProcessorParent {
// 兼容国标中的使用编码@域名作为RequestURI的情况
SipURI sipURI = (SipURI)request.getRequestURI();
if (sipURI.getPort() == -1) {
sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIp()+":"+platform.getServerPort());
sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), IpPortUtil.concatenateIpAndPort(platform.getServerIp(), String.valueOf(platform.getServerPort())));
}
ResponseAckExtraParam responseAckExtraParam = new ResponseAckExtraParam();
responseAckExtraParam.contentTypeHeader = contentTypeHeader;
@ -156,7 +157,7 @@ public abstract class SIPRequestProcessorParent {
SipURI sipURI = (SipURI)request.getRequestURI();
if (sipURI.getPort() == -1) {
sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIp()+":"+platform.getServerPort());
sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), IpPortUtil.concatenateIpAndPort(platform.getServerIp(), String.valueOf(platform.getServerPort())));
}
ResponseAckExtraParam responseAckExtraParam = new ResponseAckExtraParam();
responseAckExtraParam.contentTypeHeader = contentTypeHeader;

View File

@ -14,6 +14,7 @@ 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.utils.SipUtils;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.utils.IpPortUtil;
import gov.nist.javax.sip.address.AddressImpl;
import gov.nist.javax.sip.address.SipUri;
import gov.nist.javax.sip.header.SIPDateHeader;
@ -103,7 +104,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
device.setExpires(request.getExpires().getExpires());
device.setIp(remoteAddressInfo.getIp());
device.setPort(remoteAddressInfo.getPort());
device.setHostAddress(remoteAddressInfo.getIp().concat(":").concat(String.valueOf(remoteAddressInfo.getPort())));
device.setHostAddress(IpPortUtil.concatenateIpAndPort(remoteAddressInfo.getIp(), String.valueOf(remoteAddressInfo.getPort())));
device.setLocalIp(request.getLocalAddress().getHostAddress());
Response registerOkResponse = getRegisterOkResponse(request);
@ -186,7 +187,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
device.setServerId(userSetting.getServerId());
device.setIp(remoteAddressInfo.getIp());
device.setPort(remoteAddressInfo.getPort());
device.setHostAddress(remoteAddressInfo.getIp().concat(":").concat(String.valueOf(remoteAddressInfo.getPort())));
device.setHostAddress(IpPortUtil.concatenateIpAndPort(remoteAddressInfo.getIp(), String.valueOf(remoteAddressInfo.getPort())));
device.setLocalIp(request.getLocalAddress().getHostAddress());
if (request.getExpires().getExpires() == 0) {
// 注销成功

View File

@ -13,6 +13,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessag
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.utils.IpPortUtil;
import gov.nist.javax.sip.message.SIPRequest;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Element;
@ -106,7 +107,7 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp
if (device.getIp() == null || !device.getIp().equalsIgnoreCase(remoteAddressInfo.getIp()) || device.getPort() != remoteAddressInfo.getPort()) {
log.info("[收到心跳] 地址变化, {}({}), {}:{}->{}", device.getName(), device.getDeviceId(), remoteAddressInfo.getIp(), remoteAddressInfo.getPort(), request.getLocalAddress().getHostAddress());
device.setPort(remoteAddressInfo.getPort());
device.setHostAddress(remoteAddressInfo.getIp().concat(":").concat(String.valueOf(remoteAddressInfo.getPort())));
device.setHostAddress(IpPortUtil.concatenateIpAndPort(remoteAddressInfo.getIp(), String.valueOf(remoteAddressInfo.getPort())));
device.setIp(remoteAddressInfo.getIp());
device.setLocalIp(request.getLocalAddress().getHostAddress());
}

View File

@ -136,7 +136,7 @@ public class PresetQueryResponseMessageHandler extends SIPRequestProcessorParent
List<Preset> data = messageResponseTask.getData();
data.addAll(presetQuerySipReqList);
if (data.size() == sumNum) {
responseMessageHandler.handMessageEvent(rootElement, presetQuerySipReqList);
responseMessageHandler.handMessageEvent(rootElement, data);
mesageMap.remove(key);
boolean remove = delayQueue.remove(messageResponseTask);
if (!remove) {

View File

@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.utils.IpPortUtil;
import gov.nist.javax.sip.ResponseEventExt;
import gov.nist.javax.sip.message.SIPResponse;
import lombok.extern.slf4j.Slf4j;
@ -75,7 +76,7 @@ public class InviteResponseProcessor extends SIPResponseProcessorAbstract {
String contentString = new String(response.getRawContent());
Gb28181Sdp gb28181Sdp = SipUtils.parseSDP(contentString);
SessionDescription sdp = gb28181Sdp.getBaseSdb();
SipURI requestUri = SipFactory.getInstance().createAddressFactory().createSipURI(sdp.getOrigin().getUsername(), event.getRemoteIpAddress() + ":" + event.getRemotePort());
SipURI requestUri = SipFactory.getInstance().createAddressFactory().createSipURI(sdp.getOrigin().getUsername(), IpPortUtil.concatenateIpAndPort(event.getRemoteIpAddress(), String.valueOf(event.getRemotePort())));
Request reqAck = headerProvider.createAckRequest(response.getLocalAddress().getHostAddress(), requestUri, response);
log.info("[回复ack] {}-> {}:{} ", sdp.getOrigin().getUsername(), event.getRemoteIpAddress(), event.getRemotePort());

View File

@ -2,21 +2,45 @@ package com.genersoft.iot.vmp.utils;
import com.genersoft.iot.vmp.media.bean.MediaServer;
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
import lombok.experimental.UtilityClass;
/**
* 云录像工具类
*
* @author 648540858
*/
@UtilityClass
public class CloudRecordUtils {
/**
* 修复原始工具类中的格式化问题
*
* @param mediaServerItem 媒体服务器配置
* @param filePath 文件路径可能包含%等特殊字符
* @return 修复后的下载信息
*/
public static DownloadFileInfo getDownloadFilePath(MediaServer mediaServerItem, String filePath) {
DownloadFileInfo downloadFileInfo = new DownloadFileInfo();
// 将filePath作为独立参数传入避免%符号解析问题
String pathTemplate = "%s://%s:%s/index/api/downloadFile?file_path=%s";
String pathTemplate = "%s://%s:%s/index/api/downloadFile?file_path=" + filePath;
DownloadFileInfo info = new DownloadFileInfo();
downloadFileInfo.setHttpPath(String.format(pathTemplate, "http", mediaServerItem.getStreamIp(),
mediaServerItem.getHttpPort()));
// filePath作为第4个参数
info.setHttpPath(String.format(pathTemplate,
"http",
mediaServerItem.getStreamIp(),
mediaServerItem.getHttpPort(),
filePath));
// 同样作为第4个参数
if (mediaServerItem.getHttpSSlPort() > 0) {
downloadFileInfo.setHttpsPath(String.format(pathTemplate, "https", mediaServerItem.getStreamIp(),
mediaServerItem.getHttpSSlPort()));
info.setHttpsPath(String.format(pathTemplate,
"https",
mediaServerItem.getStreamIp(),
mediaServerItem.getHttpSSlPort(),
filePath));
}
return downloadFileInfo;
return info;
}
}

View File

@ -0,0 +1,90 @@
package com.genersoft.iot.vmp.utils;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IpPortUtil {
/**
* 拼接IP和端口
* @param ip IP地址字符串
* @param port 端口号字符串
* @return 拼接后的字符串
* @throws IllegalArgumentException 如果IP地址无效或端口无效
*/
public static String concatenateIpAndPort(String ip, String port) {
if (port == null || port.isEmpty()) {
throw new IllegalArgumentException("端口号不能为空");
}
// 验证端口是否为有效数字
try {
int portNum = Integer.parseInt(port);
if (portNum < 0 || portNum > 65535) {
throw new IllegalArgumentException("端口号必须在0-65535范围内");
}
} catch (NumberFormatException e) {
throw new IllegalArgumentException("端口号必须是有效数字", e);
}
try {
InetAddress inetAddress = InetAddress.getByName(ip);
if (inetAddress instanceof Inet6Address) {
// IPv6地址需要加上方括号
return "[" + ip + "]:" + port;
} else {
// IPv4地址直接拼接
return ip + ":" + port;
}
} catch (UnknownHostException e) {
throw new IllegalArgumentException("无效的IP地址: " + ip, e);
}
}
// 测试用例
public static void main(String[] args) {
// IPv4测试
String ipv4 = "192.168.1.1";
String port1 = "8080";
System.out.println(concatenateIpAndPort(ipv4, port1)); // 输出: 192.168.1.1:8080
// IPv6测试
String ipv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
String port2 = "80";
System.out.println(concatenateIpAndPort(ipv6, port2)); // 输出: [2001:0db8:85a3:0000:0000:8a2e:0370:7334]:80
// 压缩格式IPv6测试
String ipv6Compressed = "2001:db8::1";
System.out.println(concatenateIpAndPort(ipv6Compressed, port2)); // 输出: [2001:db8::1]:80
// 无效IP测试
try {
System.out.println(concatenateIpAndPort("invalid.ip", "1234"));
} catch (IllegalArgumentException e) {
System.out.println("捕获到预期异常: " + e.getMessage());
}
// 无效端口测试 - 非数字
try {
System.out.println(concatenateIpAndPort(ipv4, "abc"));
} catch (IllegalArgumentException e) {
System.out.println("捕获到预期异常: " + e.getMessage());
}
// 无效端口测试 - 超出范围
try {
System.out.println(concatenateIpAndPort(ipv4, "70000"));
} catch (IllegalArgumentException e) {
System.out.println("捕获到预期异常: " + e.getMessage());
}
// 空端口测试
try {
System.out.println(concatenateIpAndPort(ipv4, ""));
} catch (IllegalArgumentException e) {
System.out.println("捕获到预期异常: " + e.getMessage());
}
}
}

View File

@ -861,7 +861,7 @@
320623,如东县,3206
320681,启东市,3206
320682,如皋市,3206
320684,海门,3206
320684,海门,3206
320685,海安市,3206
3207,连云港市,32
320703,连云区,3207
@ -918,8 +918,6 @@
33,浙江省,
3301,杭州市,33
330102,上城区,3301
330103,下城区,3301
330104,江干区,3301
330105,拱墅区,3301
330106,西湖区,3301
330108,滨江区,3301
@ -927,6 +925,8 @@
330110,余杭区,3301
330111,富阳区,3301
330112,临安区,3301
330113,临平区,3301
330114,钱塘区,3301
330122,桐庐县,3301
330127,淳安县,3301
330182,建德市,3301

1 编号 名称 上级
861 320623 如东县 3206
862 320681 启东市 3206
863 320682 如皋市 3206
864 320684 海门市 海门区 3206
865 320685 海安市 3206
866 3207 连云港市 32
867 320703 连云区 3207
918 33 浙江省
919 3301 杭州市 33
920 330102 上城区 3301
330103 下城区 3301
330104 江干区 3301
921 330105 拱墅区 3301
922 330106 西湖区 3301
923 330108 滨江区 3301
925 330110 余杭区 3301
926 330111 富阳区 3301
927 330112 临安区 3301
928 330113 临平区 3301
929 330114 钱塘区 3301
930 330122 桐庐县 3301
931 330127 淳安县 3301
932 330182 建德市 3301

View File

@ -47,14 +47,22 @@ export function updateDeviceTransport(deviceId, streamMode) {
export function setGuard(deviceId) {
return request({
method: 'get',
url: `/api/device/control/guard/${deviceId}/SetGuard`
url: `/api/device/control/guard`,
params: {
deviceId: deviceId,
guardCmd: 'SetGuard'
}
})
}
export function resetGuard(deviceId) {
return request({
method: 'get',
url: `/api/device/control/guard/${deviceId}/ResetGuard`
url: `/api/device/control/guard`,
params: {
deviceId: deviceId,
guardCmd: 'ResetGuard'
}
})
}
@ -185,12 +193,13 @@ export function changeChannelAudio(params) {
}
export function updateChannelStreamIdentification(params) {
const { deviceDbId, streamIdentification } = params
const { deviceDbId, streamIdentification, id } = params
return request({
method: 'post',
url: `/api/device/query/channel/stream/identification/update/`,
params: {
deviceDbId: deviceDbId,
id: id,
streamIdentification: streamIdentification
}
})

View File

@ -55,8 +55,8 @@
<el-option label="streamnumber:1(子码流-2022)" value="streamnumber:1" />
<el-option label="streamprofile:0(主码流-大华)" value="streamprofile:0" />
<el-option label="streamprofile:1(子码流-大华)" value="streamprofile:1" />
<el-option label="streamMode:main(主码流-水星+TP-LINK)" value="streamMode:main" />
<el-option label="streamMode:sub(子码流-水星+TP-LINK)" value="streamMode:sub" />
<el-option label="streamMode:MAIN(主码流-水星+TP-LINK)" value="streamMode:MAIN" />
<el-option label="streamMode:SUB(子码流-水星+TP-LINK)" value="streamMode:SUB" />
</el-select>
</el-form-item>
<el-form-item style="float: right;">
@ -123,8 +123,8 @@
<el-option label="streamnumber:1(子码流-2022)" value="streamnumber:1" />
<el-option label="streamprofile:0(主码流-大华)" value="streamprofile:0" />
<el-option label="streamprofile:1(子码流-大华)" value="streamprofile:1" />
<el-option label="streamMode:main(主码流-水星+TP-LINK)" value="streamMode:main" />
<el-option label="streamMode:sub(子码流-水星+TP-LINK)" value="streamMode:sub" />
<el-option label="streamMode:MAIN(主码流-水星+TP-LINK)" value="streamMode:MAIN" />
<el-option label="streamMode:SUB(子码流-水星+TP-LINK)" value="streamMode:SUB" />
</el-select>
</template>
</el-table-column>

View File

@ -362,7 +362,7 @@ export default {
})
},
resetGuard: function(itemData) {
this.$store.dispatch('device/ResetGuard', itemData.deviceId)
this.$store.dispatch('device/resetGuard', itemData.deviceId)
.then((data) => {
this.$message.success({
showClose: true,