diff --git a/gb28181-wvp-proxy-api/src/main/java/cn/skcks/docking/gb28181/wvp/api/gb28181/Gb28181Controller.java b/gb28181-wvp-proxy-api/src/main/java/cn/skcks/docking/gb28181/wvp/api/gb28181/Gb28181Controller.java index 11a6657..16cd2e2 100644 --- a/gb28181-wvp-proxy-api/src/main/java/cn/skcks/docking/gb28181/wvp/api/gb28181/Gb28181Controller.java +++ b/gb28181-wvp-proxy-api/src/main/java/cn/skcks/docking/gb28181/wvp/api/gb28181/Gb28181Controller.java @@ -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 recordCmd(@RequestParam String deviceCode,@RequestParam String cmd){ + deviceControlService.sendRecordControl(deviceCode, cmd); + return JsonResponse.success(null); + } } diff --git a/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/device/control/DeviceControlService.java b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/device/control/DeviceControlService.java new file mode 100644 index 0000000..68d2a76 --- /dev/null +++ b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/device/control/DeviceControlService.java @@ -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 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 deviceByGbDeviceId = dockingService.getDeviceByGbDeviceId(gbDeviceId); + if(deviceByGbDeviceId.isEmpty()){ + log.info("未能找到 国标编码 {} 的注册信息", gbDeviceId); + return; + } + Optional 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())); + } +} diff --git a/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/sip/message/message/device/control/DeviceControlDTO.java b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/sip/message/message/device/control/DeviceControlDTO.java new file mode 100644 index 0000000..ede4b6b --- /dev/null +++ b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/sip/message/message/device/control/DeviceControlDTO.java @@ -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; +} diff --git a/gb28181-wvp-proxy-service/src/test/java/cn/skcks/docking/gb28181/wvp/test/XmlTest.java b/gb28181-wvp-proxy-service/src/test/java/cn/skcks/docking/gb28181/wvp/test/XmlTest.java new file mode 100644 index 0000000..bf5b6ed --- /dev/null +++ b/gb28181-wvp-proxy-service/src/test/java/cn/skcks/docking/gb28181/wvp/test/XmlTest.java @@ -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)); + } +}