From 2e5e7a94ada4509fa286d8438b6b127aaa906570 Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Sat, 29 Nov 2025 16:54:33 +0800
Subject: [PATCH] 2025-11-29 zwy 多路直播,將視頻地址存到列表里;在請求設備列表時調用機場推流。
---
ard-admin/src/main/java/com/ard/web/controller/sample/DeviceController.java | 1
ard-sample/src/main/java/com/ard/sample/manage/service/IDeviceService.java | 12 ++++++
ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java | 10 +++-
ard-sample/src/main/java/com/ard/sample/manage/model/dto/DeviceDTO.java | 2 +
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java | 15 +++++++
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java | 20 ++++++++++
ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java | 5 ++
ard-sample/src/main/java/com/ard/sample/manage/model/entity/DeviceEntity.java | 3 +
8 files changed, 65 insertions(+), 3 deletions(-)
diff --git a/ard-admin/src/main/java/com/ard/web/controller/sample/DeviceController.java b/ard-admin/src/main/java/com/ard/web/controller/sample/DeviceController.java
index 18420ce..2f45d7a 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/sample/DeviceController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/sample/DeviceController.java
@@ -251,6 +251,7 @@
.domain(dto.getDomain())
.firmwareVersion(dto.getFirmwareVersion())
.workType(dto.getWorkType())
+ .webrtcUrl(dto.getWebrtcUrl())
.compatibleStatus(dto.getFirmwareStatus() == null ? null :
DeviceFirmwareStatusEnum.CONSISTENT_UPGRADE != DeviceFirmwareStatusEnum.find(dto.getFirmwareStatus()))
.build();
diff --git a/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java b/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java
index 3456139..2a0014e 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/websocket/handler/LiveStreamHandler.java
@@ -53,6 +53,11 @@
rlive.setType(MessageType.LIVESTREAM.getType());
resultLive = _objectMapper.writeValueAsString(rlive);
RedisOpsUtils.set(RedisConst.WEBSOCKET_VIDEO_ADDRESS_PREFIX + sn, resultLive);
+ LiveDTO live = (LiveDTO) rlive.getData();
+ Boolean isWeb = _deviceService.updateWebrtcUrl(sn,live.getWebrtcUrl());
+ if (isWeb) {
+ log.info("SN: {}-更新webrtc地址成功!", sn);
+ }
}
}
_dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), resultLive);
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/model/dto/DeviceDTO.java b/ard-sample/src/main/java/com/ard/sample/manage/model/dto/DeviceDTO.java
index 2a2c393..7ce55e1 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/model/dto/DeviceDTO.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/model/dto/DeviceDTO.java
@@ -66,4 +66,6 @@
private Integer firmwareProgress;
private Long workType;
+
+ private String webrtcUrl;
}
\ No newline at end of file
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/model/entity/DeviceEntity.java b/ard-sample/src/main/java/com/ard/sample/manage/model/entity/DeviceEntity.java
index f1cd2d2..88efad7 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/model/entity/DeviceEntity.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/model/entity/DeviceEntity.java
@@ -94,4 +94,7 @@
@TableField(value = "work_type")
private Long workType;
+ @TableField(value = "webrtcUrl")
+ private String webrtcUrl;
+
}
\ No newline at end of file
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/IDeviceService.java b/ard-sample/src/main/java/com/ard/sample/manage/service/IDeviceService.java
index 6b88202..d8b0ad6 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/IDeviceService.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/IDeviceService.java
@@ -157,9 +157,21 @@
*/
Boolean updateDevice(DeviceDTO deviceDTO);
+ /**
+ * 修改狀態
+ * @param sn 設備sn
+ * @param workType 狀態碼
+ * */
Boolean updateWorkType(String sn, Long workType);
/**
+ * 修改直播地址
+ * @param sn 設備sn
+ * @param webrtcUrl 直播地址
+ * */
+ Boolean updateWebrtcUrl(String sn, String webrtcUrl);
+
+ /**
* Bind devices to organizations and people.
* @param device
*/
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
index 45bca6f..a0488e9 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
@@ -1,6 +1,7 @@
package com.ard.sample.manage.service.impl;
import com.alibaba.fastjson2.JSONObject;
+import com.ard.sample.component.websocket.handler.LiveStreamHandler;
import com.ard.system.authorize.service.AuthorizeService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -65,6 +66,9 @@
@Slf4j
@Transactional
public class DeviceServiceImpl implements IDeviceService {
+
+ @Autowired
+ private LiveStreamHandler _liveStreamHandler;
@Autowired
private IMessageSenderService messageSender;
@@ -355,6 +359,11 @@
DeviceQueryParam.builder()
.domains(List.of(DeviceDomainEnum.GATEWAY.getVal(), DeviceDomainEnum.DOCK.getVal()))
.build());
+ // 在獲取设备列表时,顺便获取直播地址
+ for(DeviceDTO devices : devicesList){
+ _liveStreamHandler.StartLiveStreaming(devices.getDeviceSn());
+ _liveStreamHandler.StartLiveStreaming(devices.getChildDeviceSn());
+ }
devicesList.stream()
.filter(gateway -> DeviceDomainEnum.DOCK.getVal() == gateway.getDomain() ||
@@ -753,6 +762,7 @@
.firmwareVersion(entity.getFirmwareVersion())
.deptId(entity.getDeptId())
.workType(entity.getWorkType())
+ .webrtcUrl(entity.getWebrtcUrl())
.workspaceName(entity.getDeptId() != null
? Optional.ofNullable(sysDeptService.selectDeptById(entity.getDeptId()))
.map(SysDept::getDeptName)
@@ -800,6 +810,15 @@
// 只更新workType字段
.set(DeviceEntity::getWorkType, workType);
// 执行更新(第一个参数传null,因为更新字段已通过wrapper的set指定)
+ int update = mapper.update(null, lambdaUpdateWrapper);
+ return update > 0;
+ }
+
+ @Override
+ public Boolean updateWebrtcUrl(String sn, String webrtcUrl){
+ LambdaUpdateWrapper<DeviceEntity> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.eq(DeviceEntity::getDeviceSn, sn)
+ .set(DeviceEntity::getWebrtcUrl, webrtcUrl);
int update = mapper.update(null, lambdaUpdateWrapper);
return update > 0;
}
@@ -1193,6 +1212,7 @@
.domain(dto.getDomain())
.firmwareVersion(dto.getFirmwareVersion())
.workType(dto.getWorkType())
+ .webrtcUrl(dto.getWebrtcUrl())
.compatibleStatus(dto.getFirmwareStatus() == null ? null :
DeviceFirmwareStatusEnum.CONSISTENT_UPGRADE != DeviceFirmwareStatusEnum.find(dto.getFirmwareStatus()))
.build();
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java
index bab84be..2417fe1 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOnlineServiceImpl.java
@@ -3,20 +3,25 @@
import com.alibaba.fastjson2.JSON;
import com.ard.common.core.redis.RedisConst;
import com.ard.common.core.redis.RedisOpsUtils;
+import com.ard.ossdock.service.impl.OssDockServiceContext;
import com.ard.sample.component.websocket.enums.MessageType;
import com.ard.sample.component.websocket.handler.DockWebSocketHandler;
import com.ard.sample.manage.model.dto.DeviceDTO;
import com.ard.sample.manage.service.IDeviceService;
import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
+import javax.annotation.Resource;
+import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+@Slf4j
@Component
public class DockOnlineServiceImpl {
@@ -28,6 +33,9 @@
@Autowired
protected ObjectMapper _objectMapper;
+
+ @Resource
+ private OssDockServiceContext _ossService;
/**
* 定时任务,每5秒取一次机场设备的在线状态,如已离线更新状态
@@ -42,6 +50,10 @@
if(!_deviceService.checkDeviceOnline(device.getDeviceSn())){
_deviceService.updateWorkType(device.getDeviceSn(), 3L);
RedisOpsUtils.setWithExpire(RedisConst.OSD_STATUS_PREFIX + device.getDeviceSn(), 3, RedisConst.DEVICE_ALIVE_SECOND);
+ RedisOpsUtils.del(RedisConst.WEBSOCKET_VIDEO_ADDRESS_PREFIX + device.getDeviceSn());
+ }
+ if(!_deviceService.checkDeviceOnline(device.getChildDeviceSn())){
+ RedisOpsUtils.del(RedisConst.WEBSOCKET_VIDEO_ADDRESS_PREFIX + device.getChildDeviceSn());
}
}
}
@@ -51,6 +63,9 @@
* */
@Scheduled(cron = "0/5 * * * * ?")
public void sendDeviceStatus(){
+ // 测试 机场oss读取文件
+// URL url = _ossService.getObjectUrl("kmz","/2025/11/25/新建航点航线(1)_20251125161322A001.kmz");
+// log.info("机场任务航线文件url地址:{}", url.toString());
// 发送设备状态到websocket客户端
List<DeviceDTO> devicesList = _deviceService.getDevicesTopoForWeb();
for (DeviceDTO device : devicesList) {
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java
index 5f6e426..4a7438c 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java
@@ -158,9 +158,13 @@
}
}
else{
- live.setRtmpUrl(rtmpUrl);
- live.setRtspUrl(rtspUrl);
- live.setWebrtcUrl(webrtcUrl);
+ i = ardVtduService.updateArdVtdu(vtdu);
+ log.info("机场视频更新后 i:{}",i);
+ if (i > 0) {
+ live.setRtmpUrl(rtmpUrl);
+ live.setRtspUrl(rtspUrl);
+ live.setWebrtcUrl(webrtcUrl);
+ }
}
//int i = ardVtduService.insertArdVtdu(vtdu); // 保存到媒体表
// if (i > 0) {
--
Gitblit v1.9.3