Browse Source

'优化调整data-tsdb服务中查询设备实时数据和历史数据(对内)三个接口逻辑'

james 7 months ago
parent
commit
24e9427bd8
39 changed files with 1821 additions and 42 deletions
  1. 9 8
      data-gateway/data-gateway-eg-kat/src/main/resources/application.yml
  2. 117 0
      data-gateway/data-gateway-vd-hik/pom.xml
  3. 44 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/DataGatewayVdHikApplicationRun.java
  4. 191 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/controller/api/HkVideoApi.java
  5. 101 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/controller/web/DeviceAlarmController.java
  6. 51 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/controller/web/HikThrowController.java
  7. 26 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/domain/HikThrow.java
  8. 21 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/mapper/HikThrowMapper.java
  9. 50 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/config/mqtt/MqttBaseConfig.java
  10. 53 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/config/mqtt/MqttInConfig.java
  11. 84 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/config/mqtt/MqttOutConfig.java
  12. 19 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/config/udp/UdpBaseConfig.java
  13. 59 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/listener/MqttListener.java
  14. 22 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/mqtt/MqttStrategy.java
  15. 28 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/mqtt/SimpleContext.java
  16. 80 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/mqtt/driverRecordControl/driverRecordControl.java
  17. 84 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/mqtt/streamControl/streamControl.java
  18. 22 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/utils/ByteUtil.java
  19. 137 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/utils/HttpClientUtils.java
  20. 54 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/utils/UdpUtil.java
  21. 21 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/vo/MqttBaseVO.java
  22. 34 0
      data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/vo/ProductMapVO.java
  23. 53 0
      data-gateway/data-gateway-vd-hik/src/main/resources/application.yml
  24. BIN
      data-gateway/data-gateway-vd-hik/src/main/resources/db/yt_hik.db
  25. 108 0
      data-gateway/data-gateway-vd-hik/src/main/resources/doc/index.adoc
  26. 74 0
      data-gateway/data-gateway-vd-hik/src/main/resources/logback.xml
  27. 15 0
      data-gateway/data-gateway-vd-hik/src/main/resources/smart-doc.json
  28. 1 0
      data-gateway/pom.xml
  29. 1 1
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/RemoteTransferService.java
  30. 23 3
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/QueryInfluxdbDataServiceImpl.java
  31. 33 0
      data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/HistoryInnerRequestVO.java
  32. 34 0
      data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/HistorysInnerRequestVO.java
  33. 21 0
      data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/HistorysInnerResultVO.java
  34. 22 0
      data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/LastInnerQueryVO.java
  35. 21 0
      data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/LastInnerResultVO.java
  36. 17 0
      data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/MetricItemVO.java
  37. 13 30
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/QueryInfluxdbDataController.java
  38. 8 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/QueryInfluxdbDataService.java
  39. 70 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/impl/QueryInfluxdbDataServiceImpl.java

+ 9 - 8
data-gateway/data-gateway-eg-kat/src/main/resources/application.yml

@@ -1,6 +1,7 @@
 # Tomcat
 server:
-  port: 21000
+#  port: 21000
+  port: 21001
   servlet:
     context-path: /data-gateway
 spring:
@@ -37,14 +38,14 @@ mqtt:
   completionTimeout: 5000
   enabled: true
   keep-alive-interval: 60
-  password: public
-  sub-topics: /502_KAT/+/control
-  url: tcp://192.168.123.165:1883
-  username: admin
-#  password: usky
+#  password: public
 #  sub-topics: /502_KAT/+/control
-#  url: tcp://47.98.201.73:1883
-#  username: usky
+#  url: tcp://192.168.123.165:1883
+#  username: admin
+  password: usky
+  sub-topics: /502_KAT/+/control
+  url: tcp://47.98.201.73:1883
+  username: usky
 # 和嵌入式udp通信的发送端口和监听端口地址
 udp:
   deviceIp: 192.168.123.44

+ 117 - 0
data-gateway/data-gateway-vd-hik/pom.xml

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>data-gateway</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>data-gateway-vd-hik</artifactId>
+    <dependencies>
+        <!--MQTT依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-integration</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+            <optional>true</optional>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.usky</groupId>-->
+<!--            <artifactId>common-cloud-starter</artifactId>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-openfeign-core</artifactId>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.usky</groupId>-->
+<!--            <artifactId>usky-common-core</artifactId>-->
+<!--        </dependency>-->
+
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-swagger</artifactId>
+        </dependency>
+
+        <!--udp-->
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-ip</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-test</artifactId>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
+        <!-- Pagehelper -->
+<!--        <dependency>-->
+<!--            <groupId>com.github.pagehelper</groupId>-->
+<!--            <artifactId>pagehelper-spring-boot-starter</artifactId>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>com.hikvision.ga</groupId>
+            <artifactId>artemis-http-client</artifactId>
+            <version>1.1.3</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-classic</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- sqlite3驱动包 -->
+        <dependency>
+            <groupId>org.xerial</groupId>
+            <artifactId>sqlite-jdbc</artifactId>
+            <version>3.42.0.1</version>
+        </dependency>
+        <!--mybatis-plus插件-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.5</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.2.6.RELEASE</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 44 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/DataGatewayVdHikApplicationRun.java

@@ -0,0 +1,44 @@
+package com.usky.hik;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 应用启动模块
+ * 
+ */
+
+@EnableCustomSwagger2
+@EnableFeignClients(basePackages = "com.usky")
+@ComponentScan("com.usky")
+@SpringBootApplication
+public class DataGatewayVdHikApplicationRun
+{
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DataGatewayVdHikApplicationRun.class);
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(DataGatewayVdHikApplicationRun.class, args);
+        Environment env = application.getEnvironment();
+        String ip = InetAddress.getLocalHost().getHostAddress();
+        String port = env.getProperty("server.port");
+        String path = env.getProperty("server.servlet.context-path");
+        LOGGER.info("\n----------------------------------------------------------\n\t" +
+                "Application is running! Access URLs:\n\t" +
+                "Local: \t\thttp://localhost:" + port + (null==path?"":path) + "/\n\t" +
+                "External: \thttp://" + ip + ":" + port + (null==path?"":path) + "/\n\t" +
+                "Api: \t\thttp://" + ip + ":" + port + (null==path?"":path) + "/swagger-ui/index.html\n\t" +
+                "----------------------------------------------------------");
+    }
+}

+ 191 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/controller/api/HkVideoApi.java

@@ -0,0 +1,191 @@
+package com.usky.hik.controller.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.hikvision.artemis.sdk.ArtemisHttpUtil;
+import com.hikvision.artemis.sdk.Client;
+import com.hikvision.artemis.sdk.Request;
+import com.hikvision.artemis.sdk.Response;
+import com.hikvision.artemis.sdk.config.ArtemisConfig;
+import com.hikvision.artemis.sdk.constant.Constants;
+import com.hikvision.artemis.sdk.enums.Method;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 海康视频api
+ * @author han
+ * @date 2023/10/29 13:21
+ */
+
+public class HkVideoApi {
+    private static final Logger logger = LoggerFactory.getLogger(ArtemisHttpUtil.class);
+
+    static {
+        /**
+         * 添加连接配置
+         */
+        ArtemisConfig.host = "192.168.10.101:443";
+        /**
+         * 密钥appkey
+         */
+        ArtemisConfig.appKey = "27427790";
+        /**
+         * 密钥appSecret
+         */
+        ArtemisConfig.appSecret = "lqIzdXZElwxNYS0a1YqZ";
+    }
+
+    /**
+     * 实时视频
+     * @param cameraIndexCode
+     * @param streamType
+     * @param protocol
+     * @param transmode
+     * @param expand
+     * @param streamform
+     * @return
+     */
+    public static String getVideoUrl(String cameraIndexCode, Integer streamType,String protocol,Integer transmode,String expand,
+                                     String streamform){
+        /**
+         * 获取视频资源
+         */
+        /**
+         * STEP2:设置OpenAPI接口的上下文
+         */
+        final String ARTEMIS_PATH = "/artemis";
+        final String url = ARTEMIS_PATH+"/api/video/v1/cameras/previewURLs";
+        Map<String, String> path = new HashMap<String, String>(2) {
+            {
+                put("https://", url);//根据现场环境部署确认是http还是https
+            }
+        };
+        /**
+         * 添加请求参数
+         */
+        JSONObject jsonBody = new JSONObject();
+        if (StringUtils.isNotBlank(cameraIndexCode)){
+            jsonBody.put("cameraIndexCode", cameraIndexCode);
+        }
+        if (null != streamType){
+            jsonBody.put("streamType", streamType);
+        }
+        if (StringUtils.isNotBlank(protocol)){
+            jsonBody.put("protocol", protocol);
+        }
+        if (null != transmode){
+            jsonBody.put("transmode", transmode);
+        }
+        if (StringUtils.isNotBlank(expand)){
+            jsonBody.put("expand", expand);
+        }
+        if (StringUtils.isNotBlank(streamform)){
+            jsonBody.put("streamform", streamform);
+        }
+        String body = jsonBody.toJSONString();
+        /**
+         * STEP4:设置参数提交方式
+         */
+        String contentType = "application/json";
+        return ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType , null);
+    }
+
+    /**
+     * 使用签名请求海康数据服务接口
+     * @param path
+     * @param body
+     * @param signature
+     * @return
+     */
+    public static String doPostSignatureStringArtemis(Map<String, String> path, String body, String signature) {
+        String httpSchema = (String)path.keySet().toArray()[0];
+        if (httpSchema != null && !StringUtils.isEmpty(httpSchema)) {
+            String responseStr = null;
+
+            try {
+                Map<String, String> headers = new HashMap();
+                headers.put("Accept", "*/*");
+                headers.put("Content-Type", "application/text;charset=UTF-8");
+                headers.put("x-ca-key","27427790");
+                headers.put("x-ca-signature-headers","x-ca-key");
+                headers.put("x-ca-signature",signature);
+
+                Request request = new Request(Method.POST_STRING, httpSchema + ArtemisConfig.host, (String)path.get(httpSchema), ArtemisConfig.appKey, ArtemisConfig.appSecret, Constants.DEFAULT_TIMEOUT);
+                request.setHeaders(headers);
+                request.setStringBody(body);
+                Response response = Client.execute(request);
+                responseStr = getResponseResult(response);
+            } catch (Exception var11) {
+                logger.error("the Artemis PostString Request is failed[doPostStringArtemis]", var11);
+            }
+
+            return responseStr;
+        } else {
+            throw new RuntimeException("http和https参数错误httpSchema: " + httpSchema);
+        }
+    }
+
+    private static String getResponseResult(Response response) {
+        String responseStr = null;
+        int statusCode = response.getStatusCode();
+        if (!String.valueOf(statusCode).startsWith("2") && !String.valueOf(statusCode).startsWith("3")) {
+            String msg = response.getErrorMessage();
+            responseStr = response.getBody();
+            logger.error("the Artemis Request is Failed,statusCode:" + statusCode + " errorMsg:" + msg);
+        } else {
+            responseStr = response.getBody();
+            logger.info("the Artemis Request is Success,statusCode:" + statusCode + " SuccessMsg:" + response.getBody());
+        }
+
+        return responseStr;
+    }
+
+    /**
+     * 行车记录
+     * @param startTime
+     * @param endTime
+     * @param pageNo
+     * @param pageSize
+     * @return
+     */
+    public static String driverRecord(String startTime, String endTime,Integer pageNo,Integer pageSize){
+
+        /**
+         * STEP2:设置OpenAPI接口的上下文
+         */
+        final String ARTEMIS_PATH = "/artemis";
+        final String url = ARTEMIS_PATH+"/api/pms/v1/crossRecords/page";
+        Map<String, String> path = new HashMap<String, String>(2) {
+            {
+                put("https://", url);//根据现场环境部署确认是http还是https
+            }
+        };
+        /**
+         * 添加请求参数
+         */
+        JSONObject jsonBody = new JSONObject();
+        if (StringUtils.isNotBlank(startTime)){
+            jsonBody.put("startTime", startTime);
+        }
+        if (StringUtils.isNotBlank(endTime)){
+            jsonBody.put("endTime", endTime);
+        }
+        if (null != pageNo){
+            jsonBody.put("pageNo", pageNo);
+        }
+        if (null != pageSize){
+            jsonBody.put("pageSize", pageSize);
+        }
+        String body = jsonBody.toJSONString();
+        /**
+         * STEP4:设置参数提交方式
+         */
+        String contentType = "application/json";
+
+        return ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType , null);
+    }
+}

+ 101 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/controller/web/DeviceAlarmController.java

@@ -0,0 +1,101 @@
+package com.usky.hik.controller.web;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.hikvision.artemis.sdk.ArtemisHttpUtil;
+import com.usky.hik.service.utils.HttpClientUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+
+
+@RestController
+@RequestMapping("/deviceAlarm")
+public class DeviceAlarmController {
+    private static final Logger logger = LoggerFactory.getLogger(DeviceAlarmController.class);
+    @Value("${alarm.url}")
+    private String alarmUrl;
+
+    @Autowired
+    private HikThrowController hikThrowController;
+
+    /**
+     * 海康高空抛物事件回调接口
+     * @param body
+     * @return
+     */
+    @PostMapping("/skyThrow")
+    public String skyThrow(@RequestBody String body) throws ParseException {
+        System.out.println("body: "+body);
+
+        JSONObject rec_body = JSON.parseObject(body);
+        Object obj_params = JSON.toJSONString(rec_body.get("params"));
+        JSONObject json_params = JSONObject.parseObject(obj_params.toString());
+
+        JSONArray array_events = JSONArray.parseArray(json_params.get("events").toString());
+        JSONObject json_events = JSONObject.parseObject(array_events.getJSONObject(0).toJSONString());
+
+        //utc时间格式转换
+        SimpleDateFormat fromDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+        SimpleDateFormat toDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String happenTime = json_events.get("happenTime").toString();
+        Date date = fromDateFormat.parse(happenTime);
+        Long dateTime = date.getTime();
+        String toHappenTime = toDateFormat.format(dateTime);
+
+        Object obj_data = JSON.toJSONString(json_events.get("data"));
+        JSONObject json_data = JSONObject.parseObject(obj_data.toString());
+
+        Object obj_target_attrs = JSON.toJSONString(json_data.get("targetAttrs"));
+        JSONObject json_target_attrs = JSONObject.parseObject(obj_target_attrs.toString());
+        String deviceIndexCode = json_target_attrs.get("deviceIndexCode").toString();
+        JSONArray array_throw = JSONArray.parseArray(json_data.get("ObjectsThrownDetection").toString());
+        JSONObject json_throw = JSONObject.parseObject(array_throw.getJSONObject(0).toJSONString());
+
+        Object obj_image = JSON.toJSONString(json_throw.get("Image"));
+        JSONObject json_image = JSONObject.parseObject(obj_image.toString());
+        String resourcesContent = json_image.get("resourcesContent").toString();
+
+
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("deviceId",deviceIndexCode);
+        jsonObject.put("alarmTime",toHappenTime);
+        jsonObject.put("sitePhoto",resourcesContent);
+
+        jsonObject.put("alarmType","105");
+        jsonObject.put("alarmObject","");
+        jsonObject.put("alarmData","");
+        jsonObject.put("alarmAttribute","高空抛物");
+        jsonObject.put("alarmContent","高空抛物");
+        jsonObject.put("alarmGrade",1);
+        jsonObject.put("alarmAddress","");
+        jsonObject.put("productCode","501_HGHK");
+
+        String resultString = HttpClientUtils.doPostJson(alarmUrl,jsonObject.toJSONString());
+
+        System.out.println("resultString: "+resultString);
+        hikThrowController.insert(body,resultString);
+
+        String responseBody = "HTTP/1.1 200 OK";
+        return responseBody;
+    }
+
+}
+
+
+
+
+
+
+
+

+ 51 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/controller/web/HikThrowController.java

@@ -0,0 +1,51 @@
+package com.usky.hik.controller.web;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.hik.domain.HikThrow;
+import com.usky.hik.mapper.HikThrowMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@RestController
+@RequestMapping("/sqliteDB")
+public class HikThrowController {
+
+    @Autowired
+    private HikThrowMapper throwMapper;
+
+    /** 增添数据 */
+    @PostMapping("/insert")
+    public Object insert(String skyThrowData,String alarmResponse) {
+        HikThrow hikThrow = new HikThrow();
+
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        hikThrow.setDataTime(simpleDateFormat.format(new Date()));
+        hikThrow.setSkyThrowData(skyThrowData);
+        hikThrow.setAlarmResponse(alarmResponse);
+        return throwMapper.insert(hikThrow);
+    }
+    /** 查询数据 */
+    @GetMapping("/show")
+    public Object show() {
+        LambdaQueryWrapper<HikThrow> queryWrapper = Wrappers.lambdaQuery();
+        return throwMapper.selectList(queryWrapper);
+    }
+    /** 删除数据 */
+    @DeleteMapping("/delete")
+    public Object delete(Integer id) {
+        return throwMapper.deleteById(id);
+    }
+    /** 修改数据 */
+    @PutMapping("update")
+    public Object update(Integer id, String skyThrowData) {
+        HikThrow hikThrow = new HikThrow();
+        hikThrow.setId(id);
+        hikThrow.setSkyThrowData(skyThrowData);
+        return throwMapper.updateById(hikThrow);
+    }
+}

+ 26 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/domain/HikThrow.java

@@ -0,0 +1,26 @@
+package com.usky.hik.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class HikThrow {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 数据时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String dataTime;
+
+    private String skyThrowData;
+
+    private String alarmResponse;
+}

+ 21 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/mapper/HikThrowMapper.java

@@ -0,0 +1,21 @@
+package com.usky.hik.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.usky.hik.domain.HikThrow;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户信息表 Mapper 接口
+ * </p>
+ *
+ * @since 2022-04-21
+ */
+@Repository
+@Mapper
+public interface HikThrowMapper extends BaseMapper<HikThrow> {}  // 结合mybatis plus
+

+ 50 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/config/mqtt/MqttBaseConfig.java

@@ -0,0 +1,50 @@
+package com.usky.hik.service.config.mqtt;
+
+import lombok.Data;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
+import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
+import org.springframework.stereotype.Component;
+
+@ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
+@Data
+@Component
+@ConfigurationProperties(prefix = "mqtt")
+public class MqttBaseConfig {
+
+	@Value("${mqtt.username}")
+	private String username;
+
+	@Value("${mqtt.password}")
+	private String password;
+
+	@Value("${mqtt.url}")
+	private String hostUrl;
+
+	@Value("${mqtt.sub-topics}")
+	private String msgTopic;
+
+	@Value("${mqtt.keep-alive-interval}")
+	//心跳间隔
+	private int keepAliveInterval;
+	@Value("${mqtt.completionTimeout}")
+	//心跳间隔
+	private int completionTimeout;
+
+
+	@Bean
+	public MqttPahoClientFactory mqttClientFactory() {
+		DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
+		MqttConnectOptions options = new MqttConnectOptions();
+		options.setServerURIs(new String[]{this.getHostUrl()});
+		options.setUserName(this.getUsername());
+		options.setPassword(this.getPassword().toCharArray());
+		factory.setConnectionOptions(options);
+		return factory;
+	}
+
+}

+ 53 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/config/mqtt/MqttInConfig.java

@@ -0,0 +1,53 @@
+package com.usky.hik.service.config.mqtt;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.core.MessageProducer;
+import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
+import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
+import org.springframework.messaging.MessageChannel;
+
+import java.util.List;
+
+/**
+ * @author yq
+ * @date 2021/11/1 16:37
+ */
+@ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
+@Configuration
+public class MqttInConfig {
+
+    @Autowired
+    private MqttBaseConfig mqttBaseConfig;
+
+    public static final String CHANNEL_NAME_INPUT = "mqttInputChannel";
+
+    @Bean(name = CHANNEL_NAME_INPUT)
+    public MessageChannel mqttInputChannel() {
+        return new DirectChannel();
+    }
+
+
+    /**
+     * 消息订阅绑定-消费者
+     *
+     * @return
+     */
+    @Bean
+    public MessageProducer inbound() {
+        String[] tops = mqttBaseConfig.getMsgTopic().split(",");
+        String clientId = "gateway-vd-hik-mqtt-in-" + System.currentTimeMillis();
+        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(clientId,
+                mqttBaseConfig.mqttClientFactory(), tops);
+        adapter.setCompletionTimeout(mqttBaseConfig.getCompletionTimeout());
+        adapter.setConverter(new DefaultPahoMessageConverter());
+        adapter.setQos(2);
+        adapter.setOutputChannel(mqttInputChannel());
+        return adapter;
+    }
+}

+ 84 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/config/mqtt/MqttOutConfig.java

@@ -0,0 +1,84 @@
+package com.usky.hik.service.config.mqtt;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.annotation.MessagingGateway;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
+import org.springframework.integration.mqtt.support.MqttHeaders;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.MessageHandler;
+import org.springframework.messaging.handler.annotation.Header;
+
+@ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
+@Configuration
+public class MqttOutConfig {
+
+    @Autowired
+    public MqttBaseConfig mqttBaseConfig;
+
+    public static final String CHANNEL_NAME_OUT = "mqttOutboundChannel";
+
+    public static final String MESSAGE_NAME = "messageOut";
+
+    public static final String DEFAULT_TOPIC = "testTopic";
+
+    /**
+     * 连接通道
+     *
+     * @return
+     */
+    @Bean(name = CHANNEL_NAME_OUT)
+    public MessageChannel mqttOutboundChannel() {
+        return new DirectChannel();
+    }
+
+    /**
+     * 发送消息和消费消息Channel可以使用相同MqttPahoClientFactory
+     *
+     * @return
+     */
+    @Bean(name = MESSAGE_NAME)
+    @ServiceActivator(inputChannel = CHANNEL_NAME_OUT)
+    public MessageHandler outbound() {
+        // 在这里进行mqttOutboundChannel的相关设置
+        String clientId = "gateway-vd-hik-mqtt-out-" + System.currentTimeMillis();
+        MqttPahoMessageHandler messageHandler =
+                new MqttPahoMessageHandler(clientId, mqttBaseConfig.mqttClientFactory());
+        //如果设置成true,发送消息时将不会阻塞。
+        messageHandler.setAsync(true);
+        messageHandler.setDefaultTopic(DEFAULT_TOPIC);
+        return messageHandler;
+    }
+
+    @MessagingGateway(defaultRequestChannel = CHANNEL_NAME_OUT)
+    public interface MqttGateway {
+        /**
+         * 发送消息
+         *
+         * @param payload
+         */
+        void sendToMqtt(String payload);
+
+        /**
+         * 指定top发送消息
+         *
+         * @param topic
+         * @param payload
+         */
+        void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);
+
+        /**
+         * 指定队列和qos
+         *
+         * @param topic
+         * @param qos
+         * @param payload
+         */
+        void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
+    }
+}

+ 19 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/config/udp/UdpBaseConfig.java

@@ -0,0 +1,19 @@
+package com.usky.hik.service.config.udp;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@ConditionalOnProperty(prefix = "udp", value = {"enabled"}, havingValue = "true")
+@Data
+@Component
+@ConfigurationProperties(prefix = "udp")
+public class UdpBaseConfig {
+    @Value("${udp.deviceIp}")
+    private String deviceIp;
+
+    @Value("${udp.sendingPort}")
+    private Integer sendingPort;
+}

+ 59 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/listener/MqttListener.java

@@ -0,0 +1,59 @@
+package com.usky.hik.service.listener;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.usky.hik.service.config.mqtt.MqttInConfig;
+import com.usky.hik.service.mqtt.SimpleContext;
+import com.usky.hik.service.vo.MqttBaseVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.messaging.MessageHandler;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author yq
+ * @date 2021/11/3 8:13
+ */
+@ConditionalOnProperty(prefix = "mqtt", value = {"enabled"}, havingValue = "true")
+@Slf4j
+@Component
+public class MqttListener {
+
+    public static final String MESSAGE_NAME = "messageInput";
+
+    @Autowired
+    private SimpleContext simpleContext;
+
+    /**
+     * 处理消息-消费者
+     *
+     * @return
+     */
+    @Bean(MESSAGE_NAME)
+    @ServiceActivator(inputChannel = MqttInConfig.CHANNEL_NAME_INPUT)
+    public MessageHandler handler() {
+        return message -> {
+            String payload = message.getPayload().toString();
+            JSONObject dataObj = JSONObject.parseObject(payload);
+            String method = dataObj.get("method").toString();
+            Object mqttReceivedTopic = message.getHeaders().get("mqtt_receivedTopic");
+            if (null != mqttReceivedTopic) {
+                String topic = mqttReceivedTopic.toString();
+                MqttBaseVO mqttBaseVO = new MqttBaseVO();
+                mqttBaseVO.setTopic(topic);
+                if (method.equals("streamControl")) {
+                    mqttBaseVO.setDescribe("streamControl");
+                    mqttBaseVO.setData(payload);
+                }else if(method.equals("driverRecordControl")){
+                    mqttBaseVO.setDescribe("driverRecordControl");
+                    mqttBaseVO.setData(payload);
+                }
+                //统一处理数据
+                simpleContext.getResource(mqttBaseVO);
+            }
+        };
+    }
+}

+ 22 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/mqtt/MqttStrategy.java

@@ -0,0 +1,22 @@
+package com.usky.hik.service.mqtt;
+
+
+import com.usky.hik.service.vo.MqttBaseVO;
+
+
+/**
+ * 策略类
+ *
+ * @author yq
+ * @date 2021/11/3 8:27
+ */
+public interface MqttStrategy {
+    /**
+     * 处理消息(策略模式由子类实现)
+     *
+     * @param mqttBaseVO
+     * @return
+     */
+    String disposeMessage(MqttBaseVO mqttBaseVO) ;
+
+}

+ 28 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/mqtt/SimpleContext.java

@@ -0,0 +1,28 @@
+package com.usky.hik.service.mqtt;
+
+
+import com.hikvision.artemis.sdk.config.ArtemisConfig;
+import com.usky.hik.service.vo.MqttBaseVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 中间处理消息转发
+ */
+@Service
+public class SimpleContext {
+
+    @Autowired
+    private final Map<String, MqttStrategy> strategyMap = new ConcurrentHashMap<>();
+
+    public SimpleContext(Map<String, MqttStrategy> strategyMap) {
+        strategyMap.forEach(this.strategyMap::put);
+    }
+
+    public String getResource(MqttBaseVO mqttBaseVO) {
+        return strategyMap.get(mqttBaseVO.getDescribe()).disposeMessage(mqttBaseVO);
+    }
+}

+ 80 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/mqtt/driverRecordControl/driverRecordControl.java

@@ -0,0 +1,80 @@
+package com.usky.hik.service.mqtt.driverRecordControl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.hikvision.artemis.sdk.ArtemisHttpUtil;
+import com.usky.hik.controller.api.HkVideoApi;
+import com.usky.hik.service.config.mqtt.MqttOutConfig;
+import com.usky.hik.service.mqtt.MqttStrategy;
+import com.usky.hik.service.vo.MqttBaseVO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author zyj
+ * @date 2022/12/6 15:07
+ */
+@Service("driverRecordControl")
+public class driverRecordControl implements MqttStrategy {
+    @Resource
+    private MqttOutConfig.MqttGateway mqttGateway;
+
+    /**
+     * 获取海康系统行车记录数据
+     * @return
+     */
+    public String disposeMessage(MqttBaseVO mqttBaseVO){
+
+        /**
+         * 添加请求参数
+         */
+        JSONObject obj_data = JSONObject.parseObject(mqttBaseVO.getData().toString());
+        Integer commandId = Integer.parseInt(obj_data.get("id").toString());
+        Object params = JSONObject.toJSONString(obj_data.get("params"));
+        JSONObject params_data = JSON.parseObject(params.toString());
+        String startTime = "";
+        if(Objects.nonNull(params_data.get("startTime"))){
+            startTime = params_data.get("startTime").toString();
+        }
+        String endTime = "";
+        if(Objects.nonNull(params_data.get("endTime"))){
+            endTime = params_data.get("endTime").toString();
+        }
+        Integer pageNo = Integer.parseInt(params_data.get("pageNo").toString());
+        Integer pageSize = Integer.parseInt(params_data.get("pageSize").toString());
+
+        String rec_body = HkVideoApi.driverRecord(startTime+"+08:00", endTime+"+08:00", pageNo, pageSize);
+
+        JSONObject rec_data = JSONObject.parseObject(rec_body);
+        String rec_code = rec_data.get("code").toString();
+
+        //推送下发命令响应mqtt
+        JSONObject jsonObject = new JSONObject();
+
+        if(rec_code.equals("0")){
+            jsonObject.put("result","success");
+            jsonObject.put("message",rec_body);
+
+        }else{
+            JSONObject obj1 = new JSONObject();
+            obj1.put("code",-1);
+            obj1.put("message","open failed");
+            jsonObject.put("error",obj1);
+
+        }
+
+        jsonObject.put("timeStamp",System.currentTimeMillis());
+        jsonObject.put("id",commandId);
+
+        String res_topic = mqttBaseVO.getTopic().replace("control","controlResponse");
+        mqttGateway.sendToMqtt(res_topic,jsonObject.toJSONString());
+
+        return null;
+    }
+
+}

+ 84 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/mqtt/streamControl/streamControl.java

@@ -0,0 +1,84 @@
+package com.usky.hik.service.mqtt.streamControl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.hikvision.artemis.sdk.ArtemisHttpUtil;
+import com.hikvision.artemis.sdk.config.ArtemisConfig;
+import com.usky.hik.controller.api.HkVideoApi;
+import com.usky.hik.service.config.mqtt.MqttOutConfig;
+import com.usky.hik.service.mqtt.MqttStrategy;
+import com.usky.hik.service.utils.ByteUtil;
+import com.usky.hik.service.utils.UdpUtil;
+import com.usky.hik.service.vo.MqttBaseVO;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service("streamControl")
+@Configuration
+@Data
+public class streamControl implements MqttStrategy {
+
+    @Resource
+    private MqttOutConfig.MqttGateway mqttGateway;
+
+    /**
+     * 海康监控系统实时视频预览取流
+     * @return
+     */
+    public String disposeMessage(MqttBaseVO mqttBaseVO){
+
+        /**
+         * 添加请求参数
+         */
+        JSONObject obj_data = JSONObject.parseObject(mqttBaseVO.getData().toString());
+        Integer commandId = Integer.parseInt(obj_data.get("id").toString());
+        Object params = JSONObject.toJSONString(obj_data.get("params"));
+        JSONObject params_data = JSON.parseObject(params.toString());
+        String cameraIndexCode = params_data.get("device_id").toString();
+        Integer streamType = Integer.parseInt(params_data.get("streamType").toString());
+        String protocol = params_data.get("protocol").toString();
+        Integer transmode = Integer.parseInt(params_data.get("transmode").toString());
+        String expand = "";
+        String streamform = "";
+
+        String rec_body = HkVideoApi.getVideoUrl(cameraIndexCode,streamType,protocol,transmode,expand,streamform);
+        System.out.println("rec_body: "+rec_body);
+
+        JSONObject rec_data = JSONObject.parseObject(rec_body);
+        String rec_code = rec_data.get("code").toString();
+
+        //推送下发命令响应mqtt
+        JSONObject jsonObject = new JSONObject();
+
+        if(rec_code.equals("0")){
+            jsonObject.put("result","success");
+            jsonObject.put("message",rec_body);
+
+        }else{
+            JSONObject obj1 = new JSONObject();
+            obj1.put("code",-1);
+            obj1.put("message","open failed");
+            jsonObject.put("error",obj1);
+
+        }
+
+        jsonObject.put("timeStamp",System.currentTimeMillis());
+        jsonObject.put("id",commandId);
+
+        String res_topic = mqttBaseVO.getTopic().replace("control","controlResponse");
+        mqttGateway.sendToMqtt(res_topic,jsonObject.toJSONString());
+
+        return null;
+    }
+
+
+}

+ 22 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/utils/ByteUtil.java

@@ -0,0 +1,22 @@
+package com.usky.hik.service.utils;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class ByteUtil {
+    public byte[] toLH(int n) {
+        byte[] b = new byte[4];
+        b[0] = (byte) (n & 0xff);
+        b[1] = (byte) (n >> 8 & 0xff);
+        b[2] = (byte) (n >> 16 & 0xff);
+        b[3] = (byte) (n >> 24 & 0xff);
+        return b;
+    }
+
+    // 打印字节数组的十六进制表示
+    public void printBytes(byte[] bytes) {
+        for (byte b : bytes) {
+            System.out.print(Integer.toHexString(b & 0xFF).toUpperCase() + " ");
+        }
+    }
+}

+ 137 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/utils/HttpClientUtils.java

@@ -0,0 +1,137 @@
+package com.usky.hik.service.utils;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ 1. 跨域请求工具类
+ */
+public class HttpClientUtils {
+
+    public static String doGet(String url, Map<String, String> param) {
+
+        // 创建Httpclient对象
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+
+        String resultString = "";
+        CloseableHttpResponse response = null;
+        try {
+            // 创建uri
+            URIBuilder builder = new URIBuilder(url);
+            if (param != null) {
+                for (String key : param.keySet()) {
+                    builder.addParameter(key, param.get(key));
+                }
+            }
+            URI uri = builder.build();
+
+            // 创建http GET请求
+            HttpGet httpGet = new HttpGet(uri);
+
+            // 执行请求
+            response = httpclient.execute(httpGet);
+            // 判断返回状态是否为200
+            if (response.getStatusLine().getStatusCode() == 200) {
+                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                httpclient.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return resultString;
+    }
+
+    public static String doGet(String url) {
+        return doGet(url, null);
+    }
+
+    public static String doPost(String url, Map<String, Object> param) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Content-Type", "charset=utf-8");
+            // 创建参数列表
+            if (param != null) {
+                List<NameValuePair> paramList = new ArrayList<>();
+                for (String key : param.keySet()) {
+                    paramList.add(new BasicNameValuePair(key, param.get(key).toString()));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+
+    public static String doPost(String url) {
+        return doPost(url, null);
+    }
+
+    public static String doPostJson(String url, String json) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建请求内容
+            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
+            httpPost.setEntity(entity);
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+}

+ 54 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/utils/UdpUtil.java

@@ -0,0 +1,54 @@
+package com.usky.hik.service.utils;
+
+import feign.form.util.CharsetUtil;
+import org.springframework.stereotype.Component;
+
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.nio.charset.Charset;
+
+
+@Component
+public class UdpUtil {
+
+    /**
+     * 发送UDP请求并打印返回结果
+     *
+     * @param requestBytes 要发送的自定义命令
+     */
+    public static String sendUDPRequest(String host, int port, byte[] requestBytes) {
+        try {
+            // 创建DatagramSocket随机端口
+            DatagramSocket socket = new DatagramSocket();
+
+            // 创建InetAddress对象
+            InetAddress address = InetAddress.getByName(host);
+
+            // 创建DatagramPacket,包含发送的数据和目的地
+            DatagramPacket OutPacket = new DatagramPacket(requestBytes, requestBytes.length, address, port);
+
+            // 发送DatagramPacket
+            socket.send(OutPacket);
+
+            // 创建一个DatagramPacket来接收响应,大小与发送的数据包相同
+            DatagramPacket inPacket = new DatagramPacket(requestBytes, requestBytes.length);
+
+            // 接收响应
+            socket.receive(inPacket);
+
+            // 打印接收到的数据
+            String receivedData = new String(inPacket.getData(), 0, inPacket.getLength(), Charset.forName("ISO-8859-1"));
+            System.out.println("接收到的响应: " + receivedData+ ": ");
+
+            // 关闭socket
+            socket.close();
+
+            return receivedData;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+}

+ 21 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/vo/MqttBaseVO.java

@@ -0,0 +1,21 @@
+package com.usky.hik.service.vo;
+
+import lombok.Data;
+
+/**
+ * @author yq
+ * @date 2021/11/3 8:32
+ */
+@Data
+public class MqttBaseVO {
+    /**
+     * 接口描述
+     */
+    private String describe;
+
+    private String topic;
+    /**
+     * 数据内容
+      */
+    private Object data;
+}

+ 34 - 0
data-gateway/data-gateway-vd-hik/src/main/java/com/usky/hik/service/vo/ProductMapVO.java

@@ -0,0 +1,34 @@
+package com.usky.hik.service.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ProductMapVO implements Serializable {
+    /**
+     * 产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 设备类型
+     */
+    private Integer deviceType;
+
+}

+ 53 - 0
data-gateway/data-gateway-vd-hik/src/main/resources/application.yml

@@ -0,0 +1,53 @@
+# Tomcat
+server:
+  port: 21002
+spring:
+  application:
+    # 应用名称
+    name: data-gateway-vd-hik
+  cache:
+    ehcache:
+      config: classpath:ehcache.xml
+      enabled: false
+    redis:
+      enabled: true
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    default-property-inclusion: always
+    deserialization:
+      fail-on-unknown-properties: false
+    parser:
+      allow-single-quotes: true
+      allow-unquoted-control-chars: true
+    serialization:
+      fail-on-empty-beans: false
+    time-zone: GMT+8
+  tenant:
+    enable: false
+  servlet:
+    multipart:
+      max-file-size: 10MB
+      max-request-size: 15MB
+  datasource:
+    name: sqlite3
+    url: jdbc:sqlite:data-gateway/data-gateway-vd-hik/src/main/resources/db/yt_hik.db
+    driver-class-name: org.sqlite.JDBC
+    username:
+    password:
+
+temp:
+  basedir: C:/Users/pc/Desktop/
+mqtt:
+  completionTimeout: 5000
+  enabled: true
+  keep-alive-interval: 60
+  password: public
+  sub-topics: /501_HGHK/+/control
+  url: tcp://192.169.15.51:1883
+  username: admin
+#  password: usky
+#  sub-topics: /501_HGHK/+/control
+#  url: tcp://47.98.201.73:1883
+#  username: usky
+alarm:
+  url: http://192.169.15.51:13200/dev-api/service-iot/baseAlarm/alarmInfo

BIN
data-gateway/data-gateway-vd-hik/src/main/resources/db/yt_hik.db


+ 108 - 0
data-gateway/data-gateway-vd-hik/src/main/resources/doc/index.adoc

@@ -0,0 +1,108 @@
+= 安防项目
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Version |  Update Time  | Status | Author |  Description
+|v2022-04-21 16:57:08|2022-04-21 16:57:08|auto|@yq|Created by smart-doc
+|====================
+
+
+== &lt;p&gt;参数配置表 前端控制器&lt;/p&gt;
+== &lt;p&gt;部门信息&lt;/p&gt;
+=== 查看部门信息
+*URL:* http:10.23.39.1:8082/sysDept/list
+
+*Type:* POST
+
+*Author:* ya
+
+*Content-Type:* application/json; charset=utf-8
+
+
+
+
+*Body-parameters:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Parameter | Type|Description|Required|Since
+|deptId|int64|部门id|false|-
+|parentId|int64|父部门id|false|-
+|ancestors|string|祖级列表|false|-
+|deptName|string|部门名称|false|-
+|orderNum|int32|显示顺序|false|-
+|leader|string|负责人|false|-
+|phone|string|联系电话|false|-
+|email|string|邮箱|false|-
+|status|string|部门状态(0正常 1停用)|false|-
+|delFlag|string|删除标志(0代表存在 2代表删除)|false|-
+|createBy|string|创建者|false|-
+|createTime|string|创建时间|false|-
+|updateBy|string|更新者|false|-
+|updateTime|string|更新时间|false|-
+|bId|int64|建筑id|false|-
+|====================
+
+*Response-fields:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Field | Type|Description|Since
+|status|object|No comments found.|-
+|code|string|No comments found.|-
+|msg|string|No comments found.|-
+|data|object|No comments found.|-
+|└─deptId|int64|部门id|-
+|└─parentId|int64|父部门id|-
+|└─ancestors|string|祖级列表|-
+|└─deptName|string|部门名称|-
+|└─orderNum|int32|显示顺序|-
+|└─leader|string|负责人|-
+|└─phone|string|联系电话|-
+|└─email|string|邮箱|-
+|└─status|string|部门状态(0正常 1停用)|-
+|└─delFlag|string|删除标志(0代表存在 2代表删除)|-
+|└─createBy|string|创建者|-
+|└─createTime|string|创建时间|-
+|└─updateBy|string|更新者|-
+|└─updateTime|string|更新时间|-
+|└─bId|int64|建筑id|-
+|exception|string|No comments found.|-
+|====================
+
+*Response-example:*
+----
+{
+	"status": {
+		
+	},
+	"code": "97564",
+	"msg": "wnr5qt",
+	"data": [
+		{
+			"deptId": 540,
+			"parentId": 858,
+			"ancestors": "o5lg60",
+			"deptName": "文.沈",
+			"orderNum": 260,
+			"leader": "ufz93p",
+			"phone": "17852835049",
+			"email": "智渊.徐@yahoo.com",
+			"status": "nu6cnp",
+			"delFlag": "72oiji",
+			"createBy": "5fxr6j",
+			"createTime": "2022-04-21 16:57:10",
+			"updateBy": "4kcs4e",
+			"updateTime": "2022-04-21 16:57:10",
+			"bId": 977
+		}
+	],
+	"exception": "53u6bg"
+}
+----
+
+== &lt;p&gt;用户信息表 前端控制器&lt;/p&gt;
+

+ 74 - 0
data-gateway/data-gateway-vd-hik/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/var/log/uskycloud/usky-demo" />
+   <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+    <!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+	<logger name="com.usky" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 15 - 0
data-gateway/data-gateway-vd-hik/src/main/resources/smart-doc.json

@@ -0,0 +1,15 @@
+{
+  "outPath":"./src/main/resources/doc",
+  "serverUrl": "http:10.23.39.1:8082/",
+  "isStrict": false,
+  "coverOld": true,
+  "allInOne": true,
+  "packageFilters": "com.usky.demo.controller.web",
+  "requestExample":"false",
+  "responseExample":"true",
+  "projectName": "安防项目",
+  "appKey": "20211216921084883495813120",
+  "appToken":"36bde2426ad546a5a50311bb747e7e61",
+  "secret": "N@Pd,KXAHki*BW3=zK.XPNykf!=CM79J",
+  "openUrl": "http://101.133.214.75:7700/api"
+}

+ 1 - 0
data-gateway/pom.xml

@@ -11,6 +11,7 @@
     <packaging>pom</packaging>
     <modules>
         <module>data-gateway-eg-kat</module><!--科奥特门禁-->
+        <module>data-gateway-vd-hik</module><!--海康监控-->
   </modules>
 
 </project>

+ 1 - 1
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/RemoteTransferService.java

@@ -24,5 +24,5 @@ public interface RemoteTransferService {
      * 下发单个设备控制命令
      */
     @PostMapping("/deviceControl")
-    Map<String,Object> deviceControl(@RequestParam("productCode") String productCode, @RequestParam("deviceId") String deviceId, @RequestParam("commandStr") String commandStr,@RequestParam(value = "tenantId") Integer tenantId);
+    Map<String,Object> deviceControl(@RequestParam("productCode") String productCode, @RequestParam(value = "deviceId",required = false) String deviceId, @RequestParam("commandStr") String commandStr,@RequestParam(value = "tenantId") Integer tenantId);
 }

+ 23 - 3
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/QueryInfluxdbDataServiceImpl.java

@@ -24,6 +24,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.util.*;
 
 /**
@@ -61,7 +62,10 @@ public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInflu
         //存储下发设备控制命令到数据库表中
         DmpDeviceCommand command = new DmpDeviceCommand();
         command.setProductCode(productCode);
-        command.setDeviceId(deviceId);
+        if(StringUtils.isNotBlank(deviceId)){
+            command.setDeviceId(deviceId);
+        }
+
         command.setCommandContent(commandStr);
         command.setCreatedTime(LocalDateTime.now());
 //        if (Objects.nonNull(SecurityUtils.getLoginUser().getSysUser().getDeptId())){
@@ -83,9 +87,25 @@ public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInflu
             mqttGateway.sendToMqtt(topic,dataJson.toJSONString());
         }
 
+        long startTimeStamp = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
+        while (true){
+            LambdaQueryWrapper<DmpDeviceCommand> queryWrapper = Wrappers.lambdaQuery();
+            queryWrapper.eq(DmpDeviceCommand::getId,commandId);
+            DmpDeviceCommand one = dmpDeviceCommandService.getOne(queryWrapper);
+            if(Objects.nonNull(one.getCommandResponse())){
+                rec_map.put("code",200);
+                rec_map.put("message","下发命令成功");
+                rec_map.put("data",one.getCommandResponse());
+                break;
+            }
 
-        rec_map.put("code",200);
-        rec_map.put("message","操作成功");
+            long endTimeStamp = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
+            if((endTimeStamp - startTimeStamp) >= 3){ //请求超时3秒,返回失败
+                rec_map.put("code",-1);
+                rec_map.put("message","下发命令失败");
+                break;
+            }
+        }
 
         return rec_map;
     }

+ 33 - 0
data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/HistoryInnerRequestVO.java

@@ -0,0 +1,33 @@
+package com.usky.demo.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class HistoryInnerRequestVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+
+    /**
+     * 设备UUId
+     */
+    private String  deviceUUId;
+
+    /**
+     * 指标名
+     */
+    private String metric;
+}

+ 34 - 0
data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/HistorysInnerRequestVO.java

@@ -0,0 +1,34 @@
+package com.usky.demo.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class HistorysInnerRequestVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+
+    /**
+     * 设备UUId
+     */
+    private String  deviceUUId;
+
+    /**
+     * 指标名
+     */
+    private List<String> metrics;
+}

+ 21 - 0
data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/HistorysInnerResultVO.java

@@ -0,0 +1,21 @@
+package com.usky.demo.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class HistorysInnerResultVO implements Serializable {
+    private String deviceUUId;
+    private String metric;
+    private List<MetricItemVO> metricItems;
+
+    public HistorysInnerResultVO(String deviceUUId, String metric, List<MetricItemVO> metricItems) {
+        this.deviceUUId = deviceUUId;
+        this.metric = metric;
+        this.metricItems = metricItems;
+    }
+}

+ 22 - 0
data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/LastInnerQueryVO.java

@@ -0,0 +1,22 @@
+package com.usky.demo.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class LastInnerQueryVO implements Serializable  {
+
+    /**
+     * 设备UUId
+     */
+    private String  deviceUUId;
+
+    /**
+     * 指标名
+     */
+    private List<String> metrics;
+}

+ 21 - 0
data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/LastInnerResultVO.java

@@ -0,0 +1,21 @@
+package com.usky.demo.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class LastInnerResultVO implements Serializable {
+    private String metric;
+    private Long timestamp;
+    private Object value;
+
+    public LastInnerResultVO(String metric, Long timestamp, Object value) {
+        this.metric = metric;
+        this.timestamp = timestamp;
+        this.value = value;
+    }
+}

+ 17 - 0
data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/domain/MetricItemVO.java

@@ -0,0 +1,17 @@
+package com.usky.demo.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+public class MetricItemVO implements Serializable {
+    private Long timestamp;
+    private Object value;
+
+    public MetricItemVO(Long timestamp, Object value) {
+        this.timestamp = timestamp;
+        this.value = value;
+    }
+}

+ 13 - 30
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/QueryInfluxdbDataController.java

@@ -2,10 +2,7 @@ package com.usky.demo.controller.web;
 
 
 import com.usky.common.core.bean.ApiResult;
-import com.usky.demo.domain.HistoryRequestVO;
-import com.usky.demo.domain.HistoryResultVO;
-import com.usky.demo.domain.LastRequestVO;
-import com.usky.demo.domain.LastResultVO;
+import com.usky.demo.domain.*;
 import com.usky.demo.service.QueryInfluxdbDataService;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,47 +26,33 @@ public class QueryInfluxdbDataController {
     private QueryInfluxdbDataService queryInfluxdbDataService;
 
     /**
-     * 单个设备实时数据查询
-     * @param deviceUUId
-     * @return
-     */
-    @GetMapping("/last")
-    public ApiResult<LastResultVO> queryLastDeviceData(@RequestParam(value = "deviceUUId") String deviceUUId){
-        return ApiResult.success(queryInfluxdbDataService.queryLastDeviceData(deviceUUId));
-    }
-
-    /**
-     * 批量设备实时数据查询
+     * 获取单个设备多指标实时数据(对内)
      * @param requestVO
      * @return
      */
     @PostMapping("/last")
-    public ApiResult<List<LastResultVO>> queryLastDeviceData(@RequestBody LastRequestVO requestVO){
-        return ApiResult.success(queryInfluxdbDataService.queryLastDeviceData(requestVO));
+    public ApiResult<List<LastInnerResultVO>> last(@RequestBody LastInnerQueryVO requestVO){
+        return ApiResult.success(queryInfluxdbDataService.last(requestVO));
     }
 
     /**
-     * 单个设备历史数据查询
-     * @param deviceUUId
-     * @param startTime
-     * @param endTime
+     * 获取单个设备单属性历史数据(对内)
+     * @param requestVO
      * @return
      */
-    @GetMapping("/history")
-    public ApiResult<HistoryResultVO> queryHistoryDeviceData(@RequestParam(value = "deviceUUId") String deviceUUId,
-                                                             @RequestParam(value = "startTime") String startTime,
-                                                             @RequestParam(value = "endTime") String endTime){
-        return ApiResult.success(queryInfluxdbDataService.queryHistoryDeviceData(deviceUUId,startTime,endTime));
+    @PostMapping("/historyMetric")
+    public ApiResult<HistorysInnerResultVO> historyMetric(@RequestBody HistoryInnerRequestVO requestVO){
+        return ApiResult.success(queryInfluxdbDataService.historyMetric(requestVO));
     }
 
     /**
-     * 批量设备历史数据查询
+     * 获取单个设备多指标实时数据(对内)
      * @param requestVO
      * @return
      */
-    @PostMapping("/history")
-    public ApiResult<List<HistoryResultVO>> queryHistoryDeviceData(@RequestBody HistoryRequestVO requestVO){
-        return ApiResult.success(queryInfluxdbDataService.queryHistoryDeviceData(requestVO));
+    @PostMapping("/historyMetrics")
+    public ApiResult<List<HistorysInnerResultVO>> historyMetrics(@RequestBody HistorysInnerRequestVO requestVO){
+        return ApiResult.success(queryInfluxdbDataService.historyMetrics(requestVO));
     }
 
 }

+ 8 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/QueryInfluxdbDataService.java

@@ -2,6 +2,7 @@ package com.usky.demo.service;
 
 import com.usky.demo.domain.*;
 import com.usky.common.mybatis.core.CrudService;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 import java.util.Map;
@@ -16,6 +17,7 @@ import java.util.Map;
  */
 public interface QueryInfluxdbDataService extends CrudService<QueryInfluxdbData> {
 
+    // 对外api begin
     LastResultVO queryLastDeviceData(String deviceUUId);
 
     List<LastResultVO> queryLastDeviceData(LastRequestVO requestVO);
@@ -23,5 +25,11 @@ public interface QueryInfluxdbDataService extends CrudService<QueryInfluxdbData>
     HistoryResultVO queryHistoryDeviceData(String deviceUUId, String startTime, String endTime);
 
     List<HistoryResultVO> queryHistoryDeviceData(HistoryRequestVO requestVO);
+    // 对外api end
 
+    // 对内接口  begin
+    List<LastInnerResultVO> last(LastInnerQueryVO requestVO);
+    HistorysInnerResultVO historyMetric(HistoryInnerRequestVO requestVO);
+    List<HistorysInnerResultVO> historyMetrics(HistorysInnerRequestVO requestVO);
+    // 对内接口  end
 }

+ 70 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/impl/QueryInfluxdbDataServiceImpl.java

@@ -18,6 +18,7 @@ import com.usky.demo.service.vo.ProductMapVO;
 import org.apache.commons.collections.ResettableListIterator;
 import org.influxdb.dto.QueryResult;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
@@ -44,6 +45,9 @@ public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInflu
     @Autowired
     private DmpDeviceService dmpDeviceService;
 
+    @Value("${spring.influx.database}")
+    private String database;
+
 
     @Cacheable(cacheNames = "productList",sync = true)
     public Map<String, ProductMapVO> getProductMap(){
@@ -237,5 +241,71 @@ public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInflu
         return list;
     }
 
+    @Override
+    public List<LastInnerResultVO> last(LastInnerQueryVO requestVO){
+        List<LastInnerResultVO> list = new ArrayList<>();
+        List<String> metrics = requestVO.getMetrics();
+        String tableName = requestVO.getDeviceUUId();
+        for (int i = 0; i < metrics.size(); i++) {
+            String query = "SELECT time,"+metrics.get(i)+" as attributeData FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')";
+            List<Map<String, Object>> list1 = tsdbUtils.fetchRecords(query);
+            if(CollectionUtils.isNotEmpty(list1)){
+                LastInnerResultVO lastInnerResultVO = new LastInnerResultVO(metrics.get(i),Long.valueOf(list1.get(0).get("time").toString()),list1.get(0).get("attributeData"));
+                list.add(lastInnerResultVO);
+            }
+        }
+
+        return list;
+    }
+
+    @Override
+    public HistorysInnerResultVO historyMetric(HistoryInnerRequestVO requestVO){
+        String startTime = requestVO.getStartTime();
+        String endTime = requestVO.getEndTime();
+        String metric = requestVO.getMetric();
+        String tableName = requestVO.getDeviceUUId();
+
+        String query = "SELECT time,"+metric+" as attributeData FROM \""+tableName+"\" where time >='"+startTime+"' and time <= '"+endTime+"' tz('Asia/Shanghai')";
+        List<Map<String, Object>> list1 = tsdbUtils.fetchRecords(query);
+        List<MetricItemVO> metricItemVOList = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(list1)){
+            for (int i = 0; i < list1.size(); i++) {
+                MetricItemVO itemVO = new MetricItemVO(Long.valueOf(list1.get(i).get("time").toString()), list1.get(i).get("attributeData"));
+                metricItemVOList.add(itemVO);
+            }
+
+        }
+        HistorysInnerResultVO resultVO = new HistorysInnerResultVO(tableName,metric,metricItemVOList);
+
+        return resultVO;
+    }
+
+    @Override
+    public List<HistorysInnerResultVO> historyMetrics(HistorysInnerRequestVO requestVO){
+        List<HistorysInnerResultVO> list = new ArrayList<>();
+        String startTime = requestVO.getStartTime();
+        String endTime = requestVO.getEndTime();
+        List<String> metrics = requestVO.getMetrics();
+        String tableName = requestVO.getDeviceUUId();
+
+        for (int i = 0; i < metrics.size(); i++) {
+            String metric = metrics.get(i);
+            String query = "SELECT time,"+metric+" as attributeData FROM \""+tableName+"\" where time >='"+startTime+"' and time <= '"+endTime+"' tz('Asia/Shanghai')";
+            List<Map<String, Object>> list1 = tsdbUtils.fetchRecords(query);
+            List<MetricItemVO> metricItemVOList = new ArrayList<>();
+            if(CollectionUtils.isNotEmpty(list1)){
+                for (int j = 0; j < list1.size(); j++) {
+                    MetricItemVO itemVO = new MetricItemVO(Long.valueOf(list1.get(j).get("time").toString()), list1.get(j).get("attributeData"));
+                    metricItemVOList.add(itemVO);
+                }
+
+            }
+            HistorysInnerResultVO resultVO = new HistorysInnerResultVO(tableName,metric,metricItemVOList);
+            list.add(resultVO);
+        }
+
+        return list;
+    }
+
 
 }