添加兼容接口预置位添加调用删除,列表查询

pull/810/head
648540858 2023-03-28 17:56:43 +08:00
parent 91bfbc36f1
commit 3227dcd082
3 changed files with 144 additions and 12 deletions

View File

@ -1137,7 +1137,6 @@ public class SIPCommander implements ISIPCommander {
}
cmdXml.append("</Query>\r\n");
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, errorEvent);

View File

@ -1,6 +1,5 @@
package com.genersoft.iot.vmp.web.gb28181;
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
@ -9,7 +8,9 @@ import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
@ -102,4 +103,53 @@ public class ApiControlController {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
}
}
/**
* -
* @param serial
* @param code , /api/v1/device/channellist ChannelList.ID, channel
* @param channel , : 1
* @param command : set, goto, remove
* @param preset (1~255)
* @param name , command=set
* @return
*/
@RequestMapping(value = "/preset")
private void list(String serial,String command,
@RequestParam(required = false)Integer channel,
@RequestParam(required = false)String code,
@RequestParam(required = false)String name,
@RequestParam(required = false)Integer preset){
if (logger.isDebugEnabled()) {
logger.debug("模拟接口> 预置位控制 API调用deviceId{} channelId{} command{} name{} preset{} ",
serial, code, command, name, preset);
}
if (channel == null) {channel = 0;}
Device device = storager.queryVideoDevice(serial);
if (device == null) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "device[ " + serial + " ]未找到");
}
int cmdCode = 0;
switch (command){
case "set":
cmdCode = 129;
break;
case "goto":
cmdCode = 130;
break;
case "remove":
cmdCode = 131;
break;
default:
break;
}
try {
cmder.frontEndCmd(device, code, cmdCode, 0, preset, 0);
} catch (SipException | InvalidArgumentException | ParseException e) {
logger.error("[命令发送失败] 预置位控制: {}", e.getMessage());
throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
}
}
}

View File

@ -2,21 +2,32 @@ package com.genersoft.iot.vmp.web.gb28181;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.PresetQuerySipReq;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.service.IDeviceService;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.web.gb28181.dto.DeviceChannelExtend;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;
import java.util.Arrays;
import java.util.List;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
import java.text.ParseException;
import java.util.*;
/**
* API
@ -31,17 +42,15 @@ public class ApiDeviceController {
@Autowired
private IVideoManagerStorage storager;
@Autowired
private SIPCommander cmder;
@Autowired
private IDeviceService deviceService;
// @Autowired
// private SIPCommander cmder;
@Autowired
private DeferredResultHolder resultHolder;
// @Autowired
// private DeferredResultHolder resultHolder;
// @Autowired
// private DeviceOffLineDetector offLineDetector;
/**
*
@ -171,4 +180,78 @@ public class ApiDeviceController {
result.put("ChannelList", channleJSONList);
return result;
}
/**
* -
* @param serial
* @param code , /api/v1/device/channellist ChannelList.ID, channel
* @param channel , : 1
* @param fill 255255 : true : true, false
* @param timeout () : 15
* @return
*/
@RequestMapping(value = "/fetchpreset")
private DeferredResult<Object> list(String serial,
@RequestParam(required = false)Integer channel,
@RequestParam(required = false)String code,
@RequestParam(required = false)Boolean fill,
@RequestParam(required = false)Integer timeout){
if (logger.isDebugEnabled()) {
logger.debug("<模拟接口> 获取下级通道预置位 API调用deviceId{} channel{} code{} fill{} timeout{} ",
serial, channel, code, fill, timeout);
}
Device device = storager.queryVideoDevice(serial);
String uuid = UUID.randomUUID().toString();
String key = DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (ObjectUtils.isEmpty(code) ? serial : code);
DeferredResult<Object> result = new DeferredResult<> (timeout * 1000L);
DeferredResultEx<Object> deferredResultEx = new DeferredResultEx<>(result);
result.onTimeout(()->{
logger.warn("<模拟接口> 获取设备预置位超时");
// 释放rtpserver
RequestMessage msg = new RequestMessage();
msg.setId(uuid);
msg.setKey(key);
msg.setData("wait for presetquery timeout["+timeout+"s]");
resultHolder.invokeResult(msg);
});
if (resultHolder.exist(key, null)) {
return result;
}
deferredResultEx.setFilter(filterResult->{
List<PresetQuerySipReq> presetQuerySipReqList = (List<PresetQuerySipReq>)filterResult;
HashMap<String, Object> resultMap = new HashMap<>();
resultMap.put("DeviceID", code);
resultMap.put("Result", "OK");
resultMap.put("SumNum", presetQuerySipReqList.size());
ArrayList<Map<String, Object>> presetItemList = new ArrayList<>(presetQuerySipReqList.size());
for (PresetQuerySipReq presetQuerySipReq : presetQuerySipReqList) {
Map<String, Object> item = new HashMap<>();
item.put("PresetID", presetQuerySipReq.getPresetId());
item.put("PresetName", presetQuerySipReq.getPresetName());
item.put("PresetEnable", true);
presetItemList.add(item);
}
resultMap.put("PresetItemList",presetItemList );
return resultMap;
});
resultHolder.put(key, uuid, deferredResultEx);
try {
cmder.presetQuery(device, code, event -> {
RequestMessage msg = new RequestMessage();
msg.setId(uuid);
msg.setKey(key);
msg.setData(String.format("获取设备预置位失败,错误码: %s, %s", event.statusCode, event.msg));
resultHolder.invokeResult(msg);
});
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[命令发送失败] 获取设备预置位: {}", e.getMessage());
throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
}
return result;
}
}