张延森 3 年之前
父節點
當前提交
3bab066584

+ 20
- 0
src/main/java/com/njyunzhi/nanyang/controller/MainController.java 查看文件

@@ -7,17 +7,37 @@ import com.hikvision.ae.hatc.sdk.response.Result;
7 7
 import com.hikvision.ae.hatc.sdk.service.SDKService;
8 8
 import com.njyunzhi.nanyang.common.HatcUtil;
9 9
 import com.njyunzhi.nanyang.common.ResponseBean;
10
+import com.njyunzhi.nanyang.service.ITdHatcDeviceService;
10 11
 import org.springframework.beans.factory.annotation.Autowired;
11 12
 import org.springframework.web.bind.annotation.GetMapping;
13
+import org.springframework.web.bind.annotation.PostMapping;
12 14
 import org.springframework.web.bind.annotation.RequestParam;
13 15
 import org.springframework.web.bind.annotation.RestController;
14 16
 
15 17
 @RestController
16 18
 public class MainController {
17 19
 
20
+    @Autowired
21
+    ITdHatcDeviceService iTdHatcDeviceService;
22
+
18 23
     @Autowired
19 24
     HatcUtil hatcUtil;
20 25
 
26
+    /**
27
+     * 同步设备信息
28
+     * @return
29
+     */
30
+    @PostMapping("/syncDevice")
31
+    public ResponseBean syncDevice() {
32
+        try {
33
+            iTdHatcDeviceService.syncDevice();
34
+            return ResponseBean.success(null);
35
+        } catch (Exception e) {
36
+            e.printStackTrace();
37
+            return ResponseBean.error(e.getMessage());
38
+        }
39
+    }
40
+
21 41
 
22 42
     /**
23 43
      * 获取预览地址

+ 51
- 0
src/main/java/com/njyunzhi/nanyang/entity/TaMachineryGps.java 查看文件

@@ -0,0 +1,51 @@
1
+package com.njyunzhi.nanyang.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableId;
5
+import lombok.Data;
6
+import lombok.EqualsAndHashCode;
7
+import lombok.experimental.Accessors;
8
+
9
+import java.io.Serializable;
10
+import java.time.LocalDateTime;
11
+
12
+/**
13
+ * <p>
14
+ * 农机定位信息
15
+ * </p>
16
+ *
17
+ * @author yansen
18
+ * @since 2022-03-08
19
+ */
20
+@Data
21
+@EqualsAndHashCode(callSuper = false)
22
+@Accessors(chain = true)
23
+//@ApiModel(value="TaMachineryGps对象", description="农机定位信息")
24
+public class TaMachineryGps implements Serializable {
25
+
26
+    private static final long serialVersionUID = 1L;
27
+
28
+//    @ApiModelProperty(value = "序号")
29
+    @TableId(value = "serial_no", type = IdType.AUTO)
30
+    private Integer serialNo;
31
+
32
+//    @ApiModelProperty(value = "设备ID,海康设备表")
33
+    private String deviceId;
34
+
35
+//    @ApiModelProperty(value = "农机ID")
36
+    private String machineryId;
37
+
38
+//    @ApiModelProperty(value = "经度")
39
+    private String lng;
40
+
41
+//    @ApiModelProperty(value = "维度")
42
+    private String lat;
43
+
44
+//    @ApiModelProperty(value = "全部GPS数据")
45
+    private String gpsData;
46
+
47
+//    @ApiModelProperty(value = "创建时间")
48
+    private LocalDateTime createDate;
49
+
50
+
51
+}

+ 18
- 0
src/main/java/com/njyunzhi/nanyang/mapper/TaMachineryGpsMapper.java 查看文件

@@ -0,0 +1,18 @@
1
+package com.njyunzhi.nanyang.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.njyunzhi.nanyang.entity.TaMachineryGps;
5
+import org.apache.ibatis.annotations.Mapper;
6
+
7
+/**
8
+ * <p>
9
+ * 农机定位信息 Mapper 接口
10
+ * </p>
11
+ *
12
+ * @author yansen
13
+ * @since 2022-03-08
14
+ */
15
+@Mapper
16
+public interface TaMachineryGpsMapper extends BaseMapper<TaMachineryGps> {
17
+
18
+}

+ 2
- 0
src/main/java/com/njyunzhi/nanyang/mapper/TdHatcDeviceMapper.java 查看文件

@@ -3,6 +3,7 @@ package com.njyunzhi.nanyang.mapper;
3 3
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 4
 import com.njyunzhi.nanyang.entity.TdHatcDevice;
5 5
 import org.apache.ibatis.annotations.Mapper;
6
+import org.apache.ibatis.annotations.Param;
6 7
 
7 8
 /**
8 9
  * <p>
@@ -15,4 +16,5 @@ import org.apache.ibatis.annotations.Mapper;
15 16
 @Mapper
16 17
 public interface TdHatcDeviceMapper extends BaseMapper<TdHatcDevice> {
17 18
 
19
+    int updateOnlineStatus(@Param("terminalID") String terminalID, @Param("status") Integer status);
18 20
 }

+ 16
- 0
src/main/java/com/njyunzhi/nanyang/service/ITaMachineryGpsService.java 查看文件

@@ -0,0 +1,16 @@
1
+package com.njyunzhi.nanyang.service;
2
+
3
+import com.baomidou.mybatisplus.extension.service.IService;
4
+import com.njyunzhi.nanyang.entity.TaMachineryGps;
5
+
6
+/**
7
+ * <p>
8
+ * 农机定位信息 服务类
9
+ * </p>
10
+ *
11
+ * @author yansen
12
+ * @since 2022-03-08
13
+ */
14
+public interface ITaMachineryGpsService extends IService<TaMachineryGps> {
15
+
16
+}

+ 2
- 0
src/main/java/com/njyunzhi/nanyang/service/ITdHatcDeviceService.java 查看文件

@@ -15,4 +15,6 @@ import com.njyunzhi.nanyang.entity.TdHatcDevice;
15 15
 public interface ITdHatcDeviceService extends IService<TdHatcDevice> {
16 16
 
17 17
     void syncDevice() throws Exception;
18
+
19
+    void subscribeDevice() throws Exception;
18 20
 }

+ 20
- 0
src/main/java/com/njyunzhi/nanyang/service/impl/TaMachineryGpsServiceImpl.java 查看文件

@@ -0,0 +1,20 @@
1
+package com.njyunzhi.nanyang.service.impl;
2
+
3
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
4
+import com.njyunzhi.nanyang.entity.TaMachineryGps;
5
+import com.njyunzhi.nanyang.mapper.TaMachineryGpsMapper;
6
+import com.njyunzhi.nanyang.service.ITaMachineryGpsService;
7
+import org.springframework.stereotype.Service;
8
+
9
+/**
10
+ * <p>
11
+ * 农机定位信息 服务实现类
12
+ * </p>
13
+ *
14
+ * @author yansen
15
+ * @since 2022-03-08
16
+ */
17
+@Service
18
+public class TaMachineryGpsServiceImpl extends ServiceImpl<TaMachineryGpsMapper, TaMachineryGps> implements ITaMachineryGpsService {
19
+
20
+}

+ 74
- 2
src/main/java/com/njyunzhi/nanyang/service/impl/TdHatcDeviceServiceImpl.java 查看文件

@@ -1,24 +1,31 @@
1 1
 package com.njyunzhi.nanyang.service.impl;
2 2
 
3
+import com.alibaba.fastjson.JSON;
3 4
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4 5
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
6
+import com.hikvision.ae.hatc.enums.SubscribableMessageTypeEnum;
5 7
 import com.hikvision.ae.hatc.message.cms2sdk.DeviceChannel;
6 8
 import com.hikvision.ae.hatc.message.cms2sdk.DeviceInfo;
7 9
 import com.hikvision.ae.hatc.message.cms2sdk.DeviceModelInfo;
10
+import com.hikvision.ae.hatc.message.device2dsg.gpsdata.GpsData;
11
+import com.hikvision.ae.hatc.sdk.callback.Callback;
8 12
 import com.hikvision.ae.hatc.sdk.response.Result;
9 13
 import com.hikvision.ae.hatc.sdk.service.SDKService;
10 14
 import com.njyunzhi.nanyang.common.HatcUtil;
15
+import com.njyunzhi.nanyang.entity.TaMachineryGps;
11 16
 import com.njyunzhi.nanyang.entity.TdHatcDevice;
17
+import com.njyunzhi.nanyang.mapper.TaMachineryGpsMapper;
12 18
 import com.njyunzhi.nanyang.mapper.TdHatcDeviceMapper;
13 19
 import com.njyunzhi.nanyang.service.ITdHatcDeviceService;
14
-import io.netty.util.internal.StringUtil;
15 20
 import lombok.extern.slf4j.Slf4j;
16 21
 import org.springframework.beans.factory.annotation.Autowired;
17 22
 import org.springframework.scheduling.annotation.Async;
18 23
 import org.springframework.stereotype.Service;
19 24
 
25
+import java.time.LocalDateTime;
20 26
 import java.util.ArrayList;
21 27
 import java.util.List;
28
+import java.util.Map;
22 29
 
23 30
 /**
24 31
  * <p>
@@ -35,6 +42,9 @@ public class TdHatcDeviceServiceImpl extends ServiceImpl<TdHatcDeviceMapper, TdH
35 42
     @Autowired
36 43
     HatcUtil hatcUtil;
37 44
 
45
+    @Autowired
46
+    TaMachineryGpsMapper taMachineryGpsMapper;
47
+
38 48
     @Async
39 49
     @Override
40 50
     public void syncDevice() throws Exception {
@@ -98,6 +108,68 @@ public class TdHatcDeviceServiceImpl extends ServiceImpl<TdHatcDeviceMapper, TdH
98 108
         }
99 109
     }
100 110
 
111
+    @Override
112
+    public void subscribeDevice() throws Exception {
113
+        SDKService sdkService = hatcUtil.getSdkService();
114
+        if (sdkService == null) {
115
+            throw new Exception("海康 SDK 未成功初始化");
116
+        }
117
+
118
+        // 先查询自己账号范围内的设备型号
119
+        Result<List<DeviceModelInfo>> getModelResult = sdkService.getDeviceModelList();
120
+
121
+        if(getModelResult.isSucceed() && getModelResult.getData() != null){
122
+            // 把需要订阅的设备型号的productKey装入列表
123
+            List<String> productKeyList = new ArrayList<>();
124
+            for(DeviceModelInfo model:getModelResult.getData()){
125
+                productKeyList.add(model.getProductKey());
126
+            }
127
+
128
+            // 订阅设备上下线消息
129
+            Result<Map<String, String>> subscribeOnlineStatusResult = sdkService.subscribeByProductKeys(productKeyList,
130
+                    SubscribableMessageTypeEnum.DEVICE_STATUS,
131
+                    new Callback<Integer>() {
132
+                        @Override
133
+                        public void callback(String terminalID, Integer status) {
134
+                            // 设备上下线消息回调函数
135
+                            log.info("设备 " + terminalID + " 在线状态:" + ((status == 1) ? "在线" : "离线"));
136
+
137
+                            // 更新设备状态
138
+                            baseMapper.updateOnlineStatus(terminalID, status);
139
+                        }
140
+            });
141
+            System.out.println("根据ProductKey订阅设备上下线消息结果:" + JSON.toJSONString(subscribeOnlineStatusResult));
142
+
143
+            // 订阅位置信息
144
+            Result<Map<String, String>> subscribeGPSResult = sdkService.subscribeByProductKeys(productKeyList,
145
+                    SubscribableMessageTypeEnum.GPS_DATA,
146
+                    new Callback<GpsData>() {
147
+                        @Override
148
+                        public void callback(String terminalID, GpsData gpsData) {
149
+                            // 设备GPS消息回调函数
150
+                            String gpsJsonData = JSON.toJSONString(gpsData);
151
+                            System.out.println("收到设备位置信息,终端ID:" + terminalID + ", 位置信息:" + gpsData);
152
+
153
+                            // 查询设备
154
+                            TdHatcDevice device = getDevice(terminalID, null);
155
+                            if (null == device) return;
156
+
157
+                            // 插入GPS信息
158
+                            TaMachineryGps taMachineryGps = new TaMachineryGps();
159
+                            taMachineryGps.setDeviceId(device.getDeviceId());
160
+                            taMachineryGps.setLat(String.valueOf(gpsData.getLatitude()));
161
+                            taMachineryGps.setLng(String.valueOf(gpsData.getLongitude()));
162
+                            taMachineryGps.setGpsData(gpsJsonData);
163
+                            taMachineryGps.setCreateDate(LocalDateTime.now());
164
+                            taMachineryGpsMapper.insert(taMachineryGps);
165
+                        }
166
+            });
167
+            System.out.println("根据ProductKey订阅GPS结果:" + JSON.toJSONString(subscribeGPSResult));
168
+        } else {
169
+            throw new Exception(String.format("[%s] %s", getModelResult.getErrorCode(), getModelResult.getErrorDesc()));
170
+        }
171
+    }
172
+
101 173
     private String getChannelList(List<DeviceChannel> channelList) {
102 174
         if (null == channelList || channelList.size() < 1) return null;
103 175
 
@@ -113,7 +185,7 @@ public class TdHatcDeviceServiceImpl extends ServiceImpl<TdHatcDeviceMapper, TdH
113 185
     public TdHatcDevice getDevice(String terminalID, String productKey) {
114 186
         QueryWrapper<TdHatcDevice> queryWrapper = new QueryWrapper<>();
115 187
         queryWrapper.eq("terminal_id", terminalID);
116
-        queryWrapper.eq("product_key", productKey);
188
+        queryWrapper.eq(null != productKey && !"".equals(productKey), "product_key", productKey);
117 189
 
118 190
         return getOne(queryWrapper);
119 191
     }

+ 41
- 0
src/main/java/com/njyunzhi/nanyang/task/SubscribeDevice.java 查看文件

@@ -0,0 +1,41 @@
1
+package com.njyunzhi.nanyang.task;
2
+
3
+import com.njyunzhi.nanyang.service.ITdHatcDeviceService;
4
+import lombok.extern.slf4j.Slf4j;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.scheduling.annotation.Async;
7
+import org.springframework.stereotype.Component;
8
+
9
+import javax.annotation.PostConstruct;
10
+
11
+/**
12
+ * 订阅设备数据
13
+ */
14
+
15
+@Slf4j
16
+@Component
17
+public class SubscribeDevice {
18
+    @Autowired
19
+    ITdHatcDeviceService iTdHatcDeviceService;
20
+
21
+    @PostConstruct
22
+    @Async
23
+    public void exec() {
24
+        while (true) {
25
+            try {
26
+                log.info("=================开始订阅海康设备数据==");
27
+                iTdHatcDeviceService.subscribeDevice();
28
+                break;
29
+            } catch (Exception e) {
30
+                e.printStackTrace();
31
+
32
+                try {
33
+                    // 如果订阅失败, 每分钟尝试重新订阅一次
34
+                    Thread.sleep(60 * 1000);
35
+                } catch (InterruptedException e1) {
36
+//                    e1.printStackTrace();
37
+                }
38
+            }
39
+        }
40
+    }
41
+}

+ 4
- 1
src/main/java/com/njyunzhi/nanyang/task/SyncDevice.java 查看文件

@@ -1,10 +1,12 @@
1 1
 package com.njyunzhi.nanyang.task;
2 2
 
3 3
 import com.njyunzhi.nanyang.service.ITdHatcDeviceService;
4
+import lombok.extern.slf4j.Slf4j;
4 5
 import org.springframework.beans.factory.annotation.Autowired;
5 6
 import org.springframework.scheduling.annotation.Scheduled;
6 7
 import org.springframework.stereotype.Component;
7 8
 
9
+@Slf4j
8 10
 @Component
9 11
 public class SyncDevice {
10 12
 
@@ -14,9 +16,10 @@ public class SyncDevice {
14 16
     /**
15 17
      * 每 5 分钟 同步一次海康设备
16 18
      */
17
-    @Scheduled(cron = "0 0/5 * * * ?")
19
+    @Scheduled(cron = "0 0 1 * * ?")
18 20
     public void execute() {
19 21
         try {
22
+            log.info("=================开始同步海康设备==");
20 23
             iTdHatcDeviceService.syncDevice();
21 24
         } catch (Exception e) {
22 25
             e.printStackTrace();

+ 5
- 0
src/main/resources/mapper/TaMachineryGpsMapper.xml 查看文件

@@ -0,0 +1,5 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3
+<mapper namespace="com.njyunzhi.nanyang.mapper.TaMachineryGpsMapper">
4
+
5
+</mapper>

+ 10
- 0
src/main/resources/mapper/TdHatcDeviceMapper.xml 查看文件

@@ -2,4 +2,14 @@
2 2
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3 3
 <mapper namespace="com.njyunzhi.nanyang.mapper.TdHatcDeviceMapper">
4 4
 
5
+    <update id="updateOnlineStatus">
6
+        UPDATE ta_machinery t
7
+            INNER JOIN td_device s ON t.machinery_id = s.machinery_id
8
+            INNER JOIN td_hatc_device m ON m.terminal_id = s.device_no
9
+            AND m.product_key = s.device_type
10
+            SET t.online_status = #{status},
11
+                m.device_status = #{status}
12
+        WHERE
13
+            m.terminal_id = #{terminalID}
14
+    </update>
5 15
 </mapper>