From 3845c03250d07b12df08d69d4264a6afdd25bcfc Mon Sep 17 00:00:00 2001 From: xiaoQQya <46475319+xiaoQQya@users.noreply.github.com> Date: Thu, 29 May 2025 14:37:22 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20sql=20=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java index b999fecd1..5962dbf0e 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java @@ -144,7 +144,7 @@ public interface DeviceMapper { ", subscribe_cycle_for_alarm=#{subscribeCycleForAlarm}" + ", expires=#{expires}" + ", server_id=#{serverId}" + - "WHERE device_id=#{deviceId}"+ + " WHERE device_id=#{deviceId}"+ " "}) int update(Device device); From ec9a0bcc764ba5a9e8fca12ed7fbde59204fe3eb Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Thu, 29 May 2025 17:02:37 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtalk=E6=A8=A1=E5=BC=8FBye?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/gb28181/service/impl/PlayServiceImpl.java | 4 ++-- .../vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java index f959bfc5c..46a4fb32d 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java @@ -510,6 +510,7 @@ public class PlayServiceImpl implements IPlayService { try { sendRtpInfo = sendRtpServerService.createSendRtpInfo(mediaServerItem, null, null, playSsrc, device.getDeviceId(), "talk", stream, channel.getId(), true, false); + sendRtpInfo.setPlayType(InviteStreamType.TALK); }catch (PlayException e) { log.info("[语音对讲]开始 获取发流端口失败 deviceId: {}, channelId: {},", device.getDeviceId(), channel.getDeviceId()); return; @@ -582,7 +583,7 @@ public class PlayServiceImpl implements IPlayService { sendRtpInfo.setCallId(response.getCallIdHeader().getCallId()); sendRtpServerService.update(sendRtpInfo); - SsrcTransaction ssrcTransaction = SsrcTransaction.buildForDevice(device.getDeviceId(), sendRtpInfo.getChannelId(), "talk", sendRtpInfo.getApp(), + SsrcTransaction ssrcTransaction = SsrcTransaction.buildForDevice(device.getDeviceId(), sendRtpInfo.getChannelId(), response.getCallIdHeader().getCallId(), sendRtpInfo.getApp(), sendRtpInfo.getStream(), sendRtpInfo.getSsrc(), sendRtpInfo.getMediaServerId(), response, InviteSessionType.TALK); @@ -724,7 +725,6 @@ public class PlayServiceImpl implements IPlayService { inviteInfo.setStreamInfo(streamInfo); inviteStreamService.updateInviteInfo(inviteInfo); } - } return streamInfo; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java index 3c084f7ce..4320c212f 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java @@ -164,7 +164,8 @@ public class SIPRequestHeaderProvider { // SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); // via ArrayList viaHeaders = new ArrayList(); - ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), transactionInfo.getViaBranch()); +// ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), transactionInfo.getViaBranch()); + ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag()); // viaHeader.setRPort(); viaHeaders.add(viaHeader); //from From 79be053db73397915ccf5eb88edac337a9adc56f Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Thu, 29 May 2025 17:52:40 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e2348b26..c23a1b1b7 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,7 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git - [X] 支持ONVIF协议,设备检索,支持点播,云台控制,国标级联点播,自动点播等。 - [X] 支持部标1078+808协议,支持点播,云台控制,录像回放,位置上报,自动点播等。 - [X] 支持国标28181-2022协议,支持巡航轨迹查询,PTZ精准控制,存储卡格式化,设备软件升级,OSD配置,h265+aac,支持辅码流,录像倒放等。 -- [X] 支持国网B接口协议。支持注册,获取资源,预览等 +- [X] 支持国网B接口协议。支持注册,获取资源,预览, 云台控制,预置位控制等,可免费定制支持语音对讲、录像回放和抓拍图像。 # 授权协议 From dccd27e9c213b704c3690f13c718a7f1dbecde07 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Thu, 29 May 2025 21:36:02 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DeviceServiceImpl.java | 18 ++++++++++-------- .../cmd/KeepaliveNotifyMessageHandler.java | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java index b04ad9230..6e47e0b9f 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java @@ -382,12 +382,14 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner { return; } - // 主动查询设备状态 - Boolean deviceStatus = getDeviceStatus(device); - if (deviceStatus != null && deviceStatus) { - log.info("[设备离线] 主动探测发现设备在线,暂不处理 device:{}", deviceId); - online(device, null); - return; + // 主动查询设备状态, 没有HostAddress无法发送请求,可能是手动添加的设备 + if (device.getHostAddress() != null) { + Boolean deviceStatus = getDeviceStatus(device); + if (deviceStatus != null && deviceStatus) { + log.info("[设备离线] 主动探测发现设备在线,暂不处理 device:{}", deviceId); + online(device, null); + return; + } } log.info("[设备离线] {}, device:{}, 心跳间隔: {},心跳超时次数: {}, 上次心跳时间:{}, 上次注册时间: {}", reason, deviceId, device.getHeartBeatInterval(), device.getHeartBeatCount(), device.getKeepaliveTime(), device.getRegisterTime()); @@ -406,7 +408,7 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner { return; } for (Device device : deviceList) { - if (device == null || !device.isOnLine() || !device.getServerId().equals(userSetting.getServerId())) { + if (device == null || !device.isOnLine() || !userSetting.getServerId().equals(device.getServerId())) { continue; } if (device.getSubscribeCycleForCatalog() > 0 && !subscribeTaskRunner.containsKey(SubscribeTaskForCatalog.getKey(device))) { @@ -862,7 +864,7 @@ public class DeviceServiceImpl implements IDeviceService, CommandLineRunner { @Override public WVPResult devicesSync(Device device) { - if (!userSetting.getServerId().equals(device.getServerId())) { + if (device.getServerId() != null && !userSetting.getServerId().equals(device.getServerId())) { return redisRpcService.devicesSync(device.getServerId(), device.getDeviceId()); } // 已存在则返回进度 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java index dee3b821f..7b273debd 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java @@ -102,7 +102,7 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp SIPRequest request = (SIPRequest) evt.getRequest(); RemoteAddressInfo remoteAddressInfo = SipUtils.getRemoteAddressFromRequest(request, userSetting.getSipUseSourceIpAsRemoteAddress()); - if (!device.getIp().equalsIgnoreCase(remoteAddressInfo.getIp()) || device.getPort() != remoteAddressInfo.getPort()) { + 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()))); From f9300d01ec37321abf11673a3fe70f04278927c5 Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Fri, 30 May 2025 14:23:24 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=A2=84=E7=BD=AE=E4=BD=8D=E7=9A=84=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/views/dialog/devicePlayer.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/views/dialog/devicePlayer.vue b/web/src/views/dialog/devicePlayer.vue index 95bef3077..3d38da44a 100755 --- a/web/src/views/dialog/devicePlayer.vue +++ b/web/src/views/dialog/devicePlayer.vue @@ -298,7 +298,7 @@ -
+
Date: Tue, 3 Jun 2025 10:36:29 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=9A=E9=81=93?= =?UTF-8?q?=E5=85=B1=E4=BA=AB=E7=8A=B6=E6=80=81=E8=BF=87=E6=BB=A4=EF=BC=8C?= =?UTF-8?q?=20=E4=BC=98=E5=8C=96=E5=8F=91=E6=B5=81=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=EF=BC=8C=20=E9=81=BF=E5=85=8D=E9=80=92?= =?UTF-8?q?=E5=BD=92=E8=BF=87=E5=A4=9A=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gb28181/dao/PlatformChannelMapper.java | 4 +-- .../impl/SendRtpServerServiceImpl.java | 34 ++++++++----------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/PlatformChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/PlatformChannelMapper.java index c437eee0f..8d44f8df3 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/PlatformChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/PlatformChannelMapper.java @@ -147,8 +147,8 @@ public interface PlatformChannelMapper { " " + " AND (coalesce(wdc.gb_device_id, wdc.device_id) LIKE concat('%',#{query},'%') OR wpgc.custom_device_id LIKE concat('%',#{query},'%') " + " OR coalesce(wdc.gb_name, wdc.name) LIKE concat('%',#{query},'%') OR wpgc.custom_name LIKE concat('%',#{query},'%')) " + - " AND coalesce(wpgc.status, wdc.gb_status, wdc.status) = 'ON' " + - " AND coalesce(wpgc.status, wdc.gb_status, wdc.status) = 'OFF' " + + " AND coalesce(wpgc.custom_status, wdc.gb_status, wdc.status) = 'ON' " + + " AND coalesce(wpgc.custom_status, wdc.gb_status, wdc.status) = 'OFF' " + " AND wpgc.platform_id = #{platformId} " + " AND wpgc.platform_id is null " + " AND wdc.data_type = #{dataType} " + diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/SendRtpServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/SendRtpServerServiceImpl.java index 88f1df2e1..053ff9e69 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/SendRtpServerServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/SendRtpServerServiceImpl.java @@ -28,7 +28,7 @@ public class SendRtpServerServiceImpl implements ISendRtpServerService { @Autowired private RedisTemplate redisTemplate; - + @Override public SendRtpInfo createSendRtpInfo(MediaServer mediaServer, String ip, Integer port, String ssrc, String requesterId, @@ -230,31 +230,27 @@ public class SendRtpServerServiceImpl implements ISendRtpServerService { log.warn("{}获取redis连接信息失败", mediaServer.getId()); return -1; } - return getSendPort(startPort, endPort, sendIndexKey, sendRtpSet); - } - - private synchronized int getSendPort(int startPort, int endPort, String sendIndexKey, Set sendRtpPortSet){ - // TODO 这里改为只取偶数端口 RedisAtomicInteger redisAtomicInteger = new RedisAtomicInteger(sendIndexKey , redisTemplate.getConnectionFactory()); if (redisAtomicInteger.get() < startPort) { redisAtomicInteger.set(startPort); return startPort; }else { - int port = redisAtomicInteger.getAndIncrement(); - if (port > endPort) { - redisAtomicInteger.set(startPort); - if (sendRtpPortSet.contains(startPort)) { - return getSendPort(startPort, endPort, sendIndexKey, sendRtpPortSet); - }else { - return startPort; + for (int i = 0; i < endPort - startPort; i++) { + int port = redisAtomicInteger.getAndIncrement(); + if (port > endPort) { + redisAtomicInteger.set(startPort); + if (sendRtpSet.contains(startPort)) { + continue; + }else { + return startPort; + } + } + if (!sendRtpSet.contains(port)) { + return port; } } - if (sendRtpPortSet.contains(port)) { - return getSendPort(startPort, endPort, sendIndexKey, sendRtpPortSet); - }else { - return port; - } } + log.warn("{}获取发送端口失败, 无可用端口", mediaServer.getId()); + return -1; } - }