diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/VideoParamOpt.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/VideoParamOpt.java index af13a9630..1285bf7f5 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/VideoParamOpt.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/VideoParamOpt.java @@ -9,6 +9,9 @@ import org.dom4j.Element; @Schema(description = "视频参数范围") public class VideoParamOpt implements DeviceConfigAware { + @Schema(description = "设备ID") + private String deviceId; + @Schema(description = "下载倍速范围,各可选参数以 '/' 分隔") private String downloadSpeed; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java index 22592ad2a..e37afd312 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java @@ -48,6 +48,30 @@ public class DeviceConfig { return deferredResult; } + @GetMapping("/set/videoParamOpt") + @Operation(summary = "设置视频参数", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "videoParamOpt", description = "视频参数", required = true) + public DeferredResult> setVideoParamOpt(VideoParamOpt videoParamOpt) { + if (log.isDebugEnabled()) { + log.debug("视频参数设置命令API调用"); + } + Assert.notNull(videoParamOpt.getDeviceId(), "设备ID必须存在"); + + Device device = deviceService.getDeviceByDeviceId(videoParamOpt.getDeviceId()); + Assert.notNull(device, "设备不存在"); + + DeferredResult> deferredResult = new DeferredResult<>(); + deviceService.deviceVideoParamConfig(device, videoParamOpt, (code, msg, data) -> { + deferredResult.setResult(new WVPResult<>(code, msg, data)); + }); + + deferredResult.onTimeout(() -> { + log.warn("[设备配置] 超时, {}", device.getDeviceId()); + deferredResult.setResult(WVPResult.fail(ErrorCode.ERROR100.getCode(), "超时")); + }); + return deferredResult; + } + @Operation(summary = "查询基本参数配置", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "deviceId", description = "设备国标编号", required = true) @Parameter(name = "channelId", description = "通道国标编号") diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java index c9619fa9d..5ab15f809 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java @@ -171,6 +171,8 @@ public interface IDeviceService { void deviceBasicConfig(Device device, BasicParam basicParam, ErrorCallback callback); + void deviceVideoParamConfig(Device device, VideoParamOpt videoParamOpt, ErrorCallback callback); + void deviceConfigQuery(Device device, String channelId, Class configClass, ErrorCallback callback); void teleboot(Device device); 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 e7b8c4670..7b1a8e694 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 @@ -1160,6 +1160,25 @@ public class DeviceServiceImpl implements IDeviceService { } } + @Override + public void deviceVideoParamConfig(Device device, VideoParamOpt videoParamOpt, ErrorCallback callback) { + if (!userSetting.getServerId().equals(device.getServerId())) { + WVPResult result = redisRpcService.deviceVideoParamConfig(device.getServerId(), device, videoParamOpt); + if (result.getCode() == ErrorCode.SUCCESS.getCode()) { + callback.run(result.getCode(), result.getMsg(), result.getData()); + } + return; + } + + try { + sipCommander.deviceVideoParamConfigCmd(device, videoParamOpt, callback); + } catch (InvalidArgumentException | SipException | ParseException e) { + log.error("[命令发送失败] 设备配置: {}", e.getMessage()); + callback.run(ErrorCode.ERROR100.getCode(), "命令发送: " + e.getMessage(), null); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送: " + e.getMessage()); + } + } + @Override public void deviceConfigQuery(Device device, String channelId, Class configClass, ErrorCallback callback) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java index 7cee6b18a..388e866fc 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java @@ -195,6 +195,11 @@ public interface ISIPCommander { */ void deviceBasicConfigCmd(Device device, BasicParam basicParam, ErrorCallback callback) throws InvalidArgumentException, SipException, ParseException; + /** + * 设备配置命令:VideoParamOpt + */ + void deviceVideoParamConfigCmd(Device device, VideoParamOpt videoParamOpt, ErrorCallback callback) throws InvalidArgumentException, SipException, ParseException; + /** * 查询设备状态 * diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index db6715ebd..b0a57785a 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -883,6 +883,38 @@ public class SIPCommander implements ISIPCommander { }); } + @Override + public void deviceVideoParamConfigCmd(Device device, VideoParamOpt videoParamOpt, ErrorCallback callback) throws InvalidArgumentException, SipException, ParseException { + + int sn = (int) ((Math.random() * 9 + 1) * 100000); + String cmdType = "DeviceConfig"; + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("\r\n"); + cmdXml.append("\r\n"); + cmdXml.append("" + cmdType + "\r\n"); + cmdXml.append("" + sn + "\r\n"); + cmdXml.append("" + device.getDeviceId() + "\r\n"); + cmdXml.append("\r\n"); + if (!ObjectUtils.isEmpty(videoParamOpt.getResolution())) { + cmdXml.append("" + videoParamOpt.getResolution() + "\r\n"); + } + if (!ObjectUtils.isEmpty(videoParamOpt.getDownloadSpeed())) { + cmdXml.append("" + videoParamOpt.getDownloadSpeed() + "\r\n"); + } + cmdXml.append("\r\n"); + cmdXml.append("\r\n"); + + MessageEvent messageEvent = MessageEvent.getInstance(cmdType, sn + "", device.getDeviceId(), 2000L, callback); + messageSubscribe.addSubscribe(messageEvent); + + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, 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); + }); + } + /** * 查询设备状态 * diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/IRedisRpcService.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/IRedisRpcService.java index 37499e986..4a5f03fd8 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/IRedisRpcService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/IRedisRpcService.java @@ -55,6 +55,8 @@ public interface IRedisRpcService { WVPResult deviceBasicConfig(String serverId, Device device, BasicParam basicParam); + WVPResult deviceVideoParamConfig(String serverId, Device device, VideoParamOpt videoParamOpt); + WVPResult deviceConfigQuery(String serverId, Device device, String channelId, String configType); void teleboot(String serverId, Device device); diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/control/RedisRpcDeviceController.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/control/RedisRpcDeviceController.java index 706d0fdfc..29f95d23c 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/control/RedisRpcDeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/control/RedisRpcDeviceController.java @@ -116,6 +116,26 @@ public class RedisRpcDeviceController extends RpcController { return null; } + @RedisRpcMapping("deviceVideoParamConfig") + public RedisRpcResponse deviceVideoParamConfig(RedisRpcRequest request) { + VideoParamOpt videoParamOpt = JSONObject.parseObject(request.getParam().toString(), VideoParamOpt.class); + + Device device = deviceService.getDeviceByDeviceId(videoParamOpt.getDeviceId()); + + RedisRpcResponse response = request.getResponse(); + if (device == null || !userSetting.getServerId().equals(device.getServerId())) { + response.setStatusCode(ErrorCode.ERROR400.getCode()); + response.setBody("param error"); + return response; + } + deviceService.deviceVideoParamConfig(device, videoParamOpt, (code, msg, data) -> { + response.setStatusCode(code); + response.setBody(new WVPResult<>(code, msg, data)); + sendResponse(response); + }); + return null; + } + @RedisRpcMapping("deviceConfigQuery") public RedisRpcResponse deviceConfigQuery(RedisRpcRequest request) { diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/service/RedisRpcServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/service/RedisRpcServiceImpl.java index 5d54369c7..37373cdc5 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/service/RedisRpcServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/service/RedisRpcServiceImpl.java @@ -350,6 +350,14 @@ public class RedisRpcServiceImpl implements IRedisRpcService { return JSON.parseObject(response.getBody().toString(), WVPResult.class); } + @Override + public WVPResult deviceVideoParamConfig(String serverId, Device device, VideoParamOpt videoParamOpt) { + RedisRpcRequest request = buildRequest("device/deviceVideoParamConfig", JSONObject.toJSONString(videoParamOpt)); + request.setToId(serverId); + RedisRpcResponse response = redisRpcConfig.request(request, 50, TimeUnit.MILLISECONDS); + return JSON.parseObject(response.getBody().toString(), WVPResult.class); + } + @Override public WVPResult deviceConfigQuery(String serverId, Device device, String channelId, String configType) { JSONObject jsonObject = new JSONObject(); diff --git a/web/src/api/device.js b/web/src/api/device.js index 073322dd6..760fec333 100644 --- a/web/src/api/device.js +++ b/web/src/api/device.js @@ -129,6 +129,14 @@ export function setBasicParam(params) { }) } +export function setVideoParamOpt(params) { + return request({ + method: 'get', + url: '/api/device/config/set/videoParamOpt', + params + }) +} + export function queryChannelOne(params) { const { deviceId, channelDeviceId } = params return request({ diff --git a/web/src/store/modules/device.js b/web/src/store/modules/device.js index 96d0a7408..38783cfb7 100644 --- a/web/src/store/modules/device.js +++ b/web/src/store/modules/device.js @@ -16,6 +16,7 @@ import { resetGuard, setBasicParam, setGuard, + setVideoParamOpt, subscribeCatalog, subscribeForAlarm, subscribeMobilePosition, sync, @@ -145,6 +146,16 @@ const actions = { }) }) }, + setVideoParamOpt({ commit }, params) { + return new Promise((resolve, reject) => { + setVideoParamOpt(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, queryChannelOne({ commit }, params) { return new Promise((resolve, reject) => { queryChannelOne(params).then(response => { diff --git a/web/src/views/device/channel/cameraConfig.vue b/web/src/views/device/channel/cameraConfig.vue index 9575b36b9..93728ea91 100644 --- a/web/src/views/device/channel/cameraConfig.vue +++ b/web/src/views/device/channel/cameraConfig.vue @@ -8,26 +8,10 @@ 基础属性 - - - 图像属性 - - - - 编码设置 - - - - 报警配置 -
- -
OSD配置(开发中)
-
编码设置(开发中)
-
报警配置(开发中)
@@ -35,11 +19,10 @@ - - diff --git a/web/src/views/device/list.vue b/web/src/views/device/list.vue index bdce16e3c..8ec2c5ec1 100755 --- a/web/src/views/device/list.vue +++ b/web/src/views/device/list.vue @@ -168,9 +168,6 @@ 撤防 - - 基础配置同步 - @@ -391,8 +388,6 @@ export default { this.resetGuard(itemData) } else if (command === 'delete') { this.deleteDevice(itemData) - } else if (command === 'syncBasicParam') { - this.syncBasicParam(itemData) } }, setGuard: function(itemData) { @@ -472,20 +467,6 @@ export default { }) }) }, - syncBasicParam: function(data) { - this.$store.dispatch('device/queryBasicParam') - .then((data) => { - this.$message.success({ - showClose: true, - message: `配置已同步,当前心跳间隔: ${data.BasicParam.HeartBeatInterval} 心跳间隔:${res.data.data.BasicParam.HeartBeatCount}` - }) - }).catch((error) => { - this.$message.error({ - showClose: true, - message: error.message - }) - }) - }, getKeepaliveTimeStatistics: function(deviceId) { this.$refs.timeStatistics.openDialog('心跳时间统计', 'device/getKeepaliveTimeStatistics', deviceId, 60) },