新增 deviceControl/recordCmd

This commit is contained in:
shikong 2024-01-09 11:31:02 +08:00
parent 440b316c4c
commit e36befe7ef
4 changed files with 171 additions and 0 deletions

View File

@ -5,6 +5,7 @@ import cn.skcks.docking.gb28181.annotation.web.methods.GetJson;
import cn.skcks.docking.gb28181.common.json.JsonResponse;
import cn.skcks.docking.gb28181.wvp.config.SwaggerConfig;
import cn.skcks.docking.gb28181.wvp.service.catalog.CatalogService;
import cn.skcks.docking.gb28181.wvp.service.device.control.DeviceControlService;
import cn.skcks.docking.gb28181.wvp.sip.message.message.catalog.dto.CatalogItemDTO;
import cn.skcks.docking.gb28181.wvp.sip.message.message.catalog.dto.CatalogResponseDTO;
import lombok.RequiredArgsConstructor;
@ -23,6 +24,7 @@ import java.util.concurrent.CompletableFuture;
@JsonMapping("/gb28181")
public class Gb28181Controller {
private final CatalogService catalogService;
private final DeviceControlService deviceControlService;
@Bean
public GroupedOpenApi gb28181Api() {
return SwaggerConfig.api("Gb28181Api", "/gb28181");
@ -40,4 +42,11 @@ public class Gb28181Controller {
});
return result;
}
@SneakyThrows
@GetJson("/deviceControl/recordCmd")
public JsonResponse<Void> recordCmd(@RequestParam String deviceCode,@RequestParam String cmd){
deviceControlService.sendRecordControl(deviceCode, cmd);
return JsonResponse.success(null);
}
}

View File

@ -0,0 +1,66 @@
package cn.skcks.docking.gb28181.wvp.service.device.control;
import cn.skcks.docking.gb28181.common.json.JsonException;
import cn.skcks.docking.gb28181.common.xml.XmlUtils;
import cn.skcks.docking.gb28181.core.sip.utils.SipUtil;
import cn.skcks.docking.gb28181.wvp.orm.mybatis.dynamic.model.WvpProxyDevice;
import cn.skcks.docking.gb28181.wvp.orm.mybatis.dynamic.model.WvpProxyDocking;
import cn.skcks.docking.gb28181.wvp.service.device.DeviceService;
import cn.skcks.docking.gb28181.wvp.service.docking.DockingService;
import cn.skcks.docking.gb28181.wvp.sip.message.message.device.control.DeviceControlDTO;
import cn.skcks.docking.gb28181.wvp.sip.request.SipRequestBuilder;
import cn.skcks.docking.gb28181.wvp.sip.sender.SipSender;
import cn.skcks.docking.gb28181.wvp.sip.subscribe.SipSubscribe;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.text.MessageFormat;
import java.util.Optional;
@Slf4j
@Service
@RequiredArgsConstructor
public class DeviceControlService {
private final SipSender sipSender;
private final SipSubscribe sipSubscribe;
private final DockingService dockingService;
private final DeviceService deviceService;
@SneakyThrows
public void sendRecordControl(String deviceCode, String recordCmd){
Optional<WvpProxyDevice> deviceByDeviceCode = deviceService.getDeviceByDeviceCode(deviceCode);
if (deviceByDeviceCode.isEmpty()) {
String reason = MessageFormat.format("未能找到 设备编码 为 {0} 的设备", deviceCode);
log.error("{}",reason);
throw new JsonException(reason);
} else {
WvpProxyDevice device = deviceByDeviceCode.get();
sendRecordControl(device.getGbDeviceId(), device.getGbDeviceChannelId(), recordCmd);
}
}
public void sendRecordControl(String gbDeviceId, String channel, String recordCmd){
Optional<WvpProxyDocking> deviceByGbDeviceId = dockingService.getDeviceByGbDeviceId(gbDeviceId);
if(deviceByGbDeviceId.isEmpty()){
log.info("未能找到 国标编码 {} 的注册信息", gbDeviceId);
return;
}
Optional<WvpProxyDevice> deviceByGbDeviceIdAndChannel = deviceService.getDeviceByGbDeviceIdAndChannel(gbDeviceId, channel);
if (deviceByGbDeviceIdAndChannel.isEmpty()) {
log.info("未能找到 编码 {}, 通道 {} 的设备", gbDeviceId, channel);
return;
}
WvpProxyDocking device = deviceByGbDeviceId.get();
String sn = String.valueOf((int) (Math.random() * 9 + 1) * 100000);
DeviceControlDTO deviceControlDTO = DeviceControlDTO.builder()
.sn(sn)
.deviceId(channel)
.recordCmd(recordCmd)
.build();
sipSender.sendRequest((provider, ip, port)-> SipRequestBuilder.createMessageRequest(device,ip,port,SipRequestBuilder.getCSeq(), XmlUtils.toXml(deviceControlDTO), SipUtil.generateViaTag(),
SipUtil.generateFromTag(), provider.getNewCallId()));
}
}

View File

@ -0,0 +1,77 @@
package cn.skcks.docking.gb28181.wvp.sip.message.message.device.control;
import cn.skcks.docking.gb28181.core.sip.gb28181.constant.CmdType;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@JacksonXmlRootElement(localName = "Control")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class DeviceControlDTO {
@Builder.Default
private String cmdType = CmdType.DEVICE_CONTROL;
@JacksonXmlProperty(localName = "SN")
private String sn;
/**
* 目标设备的设备编码(必选)
*/
@JacksonXmlProperty(localName = "DeviceID")
private String deviceId;
/**
* 录像控制命令
*/
private String recordCmd;
/**
* 云台控制命令
*/
@JacksonXmlProperty(localName = "PTZCmd")
private String ptzCmd;
/**
* 远程启动
*/
private String teleBoot;
/**
* 布防撤防
*/
private String guardCmd;
/**
* 告警控制
*/
private String alarmCmd;
/**
* 强制关键帧
*/
@JacksonXmlProperty(localName = "IFameCmd")
private String iFameCmd;
/**
* 拉框放大
*/
private String dragZoomIn;
/**
* 拉框缩小
*/
private String dragZoomOut;
/**
* 看守位
*/
private String homePosition;
}

View File

@ -0,0 +1,19 @@
package cn.skcks.docking.gb28181.wvp.test;
import cn.skcks.docking.gb28181.common.xml.XmlUtils;
import cn.skcks.docking.gb28181.wvp.sip.message.message.device.control.DeviceControlDTO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
@Slf4j
public class XmlTest {
@Test
public void test(){
DeviceControlDTO deviceControlDTO = DeviceControlDTO.builder()
.sn("100")
.deviceId("123456")
.recordCmd("PreRecord")
.build();
log.info("\n{}", XmlUtils.toXml(deviceControlDTO));
}
}