TRX před 1 rokem
rodič
revize
1246df690b

+ 15 - 0
OneCardIotServer/src/main/java/com/zhongshu/iot/server/core/dao/mqtt/DeviceOnLineInfoDao.java

@@ -0,0 +1,15 @@
+package com.zhongshu.iot.server.core.dao.mqtt;
+
+import com.zhongshu.iot.server.core.domain.iot.mqtt.DeviceOnLineInfo;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+/**
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface DeviceOnLineInfoDao extends MongoRepository<DeviceOnLineInfo, String> {
+
+    DeviceOnLineInfo findTopById(String id);
+
+    DeviceOnLineInfo findTopByDeviceId(String deviceId);
+}

+ 38 - 0
OneCardIotServer/src/main/java/com/zhongshu/iot/server/core/domain/iot/mqtt/DeviceOnLineInfo.java

@@ -0,0 +1,38 @@
+package com.zhongshu.iot.server.core.domain.iot.mqtt;
+
+import com.github.microservice.models.type.OnLineDeviceType;
+import com.zhongshu.iot.server.core.domain.base.SuperEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.Date;
+
+/**
+ * @author TRX
+ * @date 2024/12/23
+ */
+@Data
+@Document
+@NoArgsConstructor
+@AllArgsConstructor
+public class DeviceOnLineInfo extends SuperEntity {
+
+    @Schema(description = "设备、网关ID")
+    private String deviceId;
+
+    @Schema(description = "设备名称、网关名称")
+    private String deviceName;
+
+    @Schema(description = "")
+    private OnLineDeviceType onLineDeviceType;
+
+    @Schema(description = "最后在线时间")
+    private String timeStr;
+
+    @Indexed(expireAfterSeconds = 0)
+    private Date TTL;
+}

+ 46 - 0
OneCardIotServer/src/main/java/com/zhongshu/iot/server/core/listener/MongodbAutoEvent.java

@@ -0,0 +1,46 @@
+package com.zhongshu.iot.server.core.listener;
+
+import com.zhongshu.iot.server.core.service.mqtt.DevicePingInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.Document;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
+import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent;
+import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent;
+import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MongodbAutoEvent extends AbstractMongoEventListener<Object> {
+
+    @Autowired
+    private DevicePingInfoService devicePingInfoService;
+
+    @Override
+    public void onBeforeConvert(BeforeConvertEvent<Object> event) {
+        Object source = event.getSource();
+        if (null != source) {
+        }
+        super.onBeforeConvert(event);
+    }
+
+    @Override
+    public void onAfterSave(AfterSaveEvent<Object> event) {
+        log.info("onAfterSave");
+    }
+
+    @Override
+    public void onAfterDelete(AfterDeleteEvent<Object> event) {
+        log.info("onAfterDelete--- ");
+        Object source = event.getSource();
+        try {
+            log.info("onAfterDelete 删除了数据...");
+            Document document = event.getDocument();
+            if (document != null) {
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 3 - 4
OneCardIotServer/src/main/java/com/zhongshu/iot/server/core/service/artemis/OperationMessageService.java

@@ -3,14 +3,16 @@ package com.zhongshu.iot.server.core.service.artemis;
 import cn.hutool.core.date.StopWatch;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.github.microservice.http.APIResponseModel;
 import com.github.microservice.models.hxz.base.IotBaseResult;
+import com.github.microservice.net.ResultContent;
+import com.github.microservice.types.FunctionType;
 import com.google.gson.JsonObject;
 import com.zhongshu.iot.client.model.artemis.OperationMessageModel;
 import com.zhongshu.iot.client.model.artemis.OperationMessageResultModel;
 import com.zhongshu.iot.client.model.artemis.OperationMessageResultSearch;
 import com.zhongshu.iot.client.model.artemis.OperationMessageSearchParam;
 import com.zhongshu.iot.client.model.mqtt.SendMessageModel;
-import com.github.microservice.types.FunctionType;
 import com.zhongshu.iot.client.type.OperationType;
 import com.zhongshu.iot.server.core.dao.iot.IotMainDao;
 import com.zhongshu.iot.server.core.dao.mqtt.DeviceInfoDao;
@@ -23,7 +25,6 @@ import com.zhongshu.iot.server.core.domain.iot.mqtt.OperationMessage;
 import com.zhongshu.iot.server.core.domain.iot.mqtt.OperationMessageResult;
 import com.zhongshu.iot.server.core.domain.other.ExecuteMethodInfo;
 import com.zhongshu.iot.server.core.httpRequest.ApiRequestService;
-import com.github.microservice.http.APIResponseModel;
 import com.zhongshu.iot.server.core.service.base.SuperService;
 import com.zhongshu.iot.server.core.service.iot.IotDataVerifyService;
 import com.zhongshu.iot.server.core.service.mqtt.DeviceInfoService;
@@ -35,7 +36,6 @@ import com.zhongshu.iot.server.core.util.bean.BeanUtils;
 import com.zhongshu.iot.server.core.util.mqtt.MqttTopicUtils;
 import com.zhongshu.iot.server.core.util.mqtt.mqttConfig.client.MQClient;
 import com.zhongshu.iot.server.core.util.page.PageEntityUtil;
-import com.github.microservice.net.ResultContent;
 import jakarta.jms.Message;
 import jakarta.jms.TextMessage;
 import lombok.extern.slf4j.Slf4j;
@@ -53,7 +53,6 @@ import org.springframework.stereotype.Service;
 import java.lang.reflect.Method;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**

+ 58 - 11
OneCardIotServer/src/main/java/com/zhongshu/iot/server/core/service/mqtt/DevicePingInfoService.java

@@ -5,21 +5,20 @@ import com.github.microservice.models.hxz.DevicePingInfoParam;
 import com.github.microservice.models.hxz.GateWayPingInfoParam;
 import com.github.microservice.models.hxz.PingResult;
 import com.github.microservice.models.type.DeviceType;
+import com.github.microservice.models.type.OnLineDeviceType;
 import com.github.microservice.models.type.OnLineState;
+import com.github.microservice.net.ResultContent;
 import com.zhongshu.iot.server.core.dao.mqtt.DeviceInfoDao;
+import com.zhongshu.iot.server.core.dao.mqtt.DeviceOnLineInfoDao;
 import com.zhongshu.iot.server.core.dao.mqtt.DevicePingInfoDao;
 import com.zhongshu.iot.server.core.dao.mqtt.GateWayInfoDao;
 import com.zhongshu.iot.server.core.domain.ExecuteAnnotationService;
 import com.zhongshu.iot.server.core.domain.ExecuteAnnotationServiceMethod;
-import com.zhongshu.iot.server.core.domain.iot.mqtt.DeviceInfo;
-import com.zhongshu.iot.server.core.domain.iot.mqtt.DevicePingInfo;
-import com.zhongshu.iot.server.core.domain.iot.mqtt.GateWay2Device;
-import com.zhongshu.iot.server.core.domain.iot.mqtt.GateWayInfo;
+import com.zhongshu.iot.server.core.domain.iot.mqtt.*;
 import com.zhongshu.iot.server.core.service.base.CommonService;
 import com.zhongshu.iot.server.core.service.base.SuperService;
 import com.zhongshu.iot.server.core.service.sync.DeviceSyncFullCardService;
 import com.zhongshu.iot.server.core.util.DateUtils;
-import com.github.microservice.net.ResultContent;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -41,21 +40,24 @@ import java.util.Map;
 public class DevicePingInfoService extends SuperService {
 
     @Autowired
-    DevicePingInfoDao devicePingInfoDao;
+    private DevicePingInfoDao devicePingInfoDao;
+
+    @Autowired
+    private DeviceInfoDao deviceInfoDao;
 
     @Autowired
-    DeviceInfoDao deviceInfoDao;
+    private CommonService commonService;
 
     @Autowired
-    CommonService commonService;
+    private DeviceSyncFullCardService deviceSyncFullCardService;
 
     @Autowired
-    DeviceSyncFullCardService deviceSyncFullCardService;
+    private GateWayInfoDao gateWayInfoDao;
 
     @Autowired
-    GateWayInfoDao gateWayInfoDao;
+    private DeviceOnLineInfoDao deviceOnLineInfoDao;
 
-    // ping记录保存时间
+    // ping记录保存时间 1天
     private Long pingTTl = 1 * 24L * 60 * 60 * 1000L;
 
     //最大的心跳时间间隔 5分钟
@@ -95,6 +97,9 @@ public class DevicePingInfoService extends SuperService {
 
             // 通知设备
             deviceSyncFullCardService.noticeSyncDeviceOnlineTimeChange(deviceId);
+
+            // 设备在线状态
+            updateDeviceOnLine(deviceInfo.getDeviceId(), deviceInfo.getDeviceName(), OnLineDeviceType.Device);
         } else {
             log.info("心跳设备未找到: {}", deviceId);
         }
@@ -131,6 +136,9 @@ public class DevicePingInfoService extends SuperService {
                 devicePingInfo.setTTL(new Date(System.currentTimeMillis() + pingTTl));
                 devicePingInfo.setTimeStr(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.FORMAT_LONG));
                 devicePingInfoDao.save(devicePingInfo);
+
+                // 网关在线状态
+                updateDeviceOnLine(gateWayInfo.getGateWayId(), gateWayInfo.getGateWayName(), OnLineDeviceType.GateWay);
             }
         }
         pingResult.setSuccess();
@@ -138,6 +146,45 @@ public class DevicePingInfoService extends SuperService {
         return ResultContent.buildSuccess(pingResult);
     }
 
+    private void updateDeviceOnLine(String deviceId, String deviceName, OnLineDeviceType onLineDeviceType) {
+        DeviceOnLineInfo entity = deviceOnLineInfoDao.findTopByDeviceId(deviceId);
+        if (ObjectUtils.isEmpty(entity)) {
+            entity = new DeviceOnLineInfo();
+        }
+        entity.setDeviceId(deviceId);
+        entity.setDeviceName(deviceName);
+        entity.setTTL(new Date(System.currentTimeMillis() + 5000));
+        entity.setTimeStr(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.FORMAT_LONG));
+        entity.setOnLineDeviceType(onLineDeviceType);
+        deviceOnLineInfoDao.save(entity);
+    }
+
+    /**
+     * TTL 到期,设备下线
+     *
+     * @param dataId
+     */
+    public void deviceTTLUnLine(String dataId) {
+        DeviceOnLineInfo entity = deviceOnLineInfoDao.findTopById(dataId);
+        if (ObjectUtils.isNotEmpty(entity)) {
+            if (entity.getOnLineDeviceType() == OnLineDeviceType.GateWay) {
+                GateWayInfo gateWayInfo = gateWayInfoDao.findTopByGateWayId(entity.getDeviceId());
+                OnLineState onLineState = OnLineState.OffLine;
+                Map<String, Object> standardData = new HashMap<String, Object>();
+                standardData.put("id", gateWayInfo.getId());
+                standardData.put("onLineState", onLineState);
+                commonService.updateData(standardData, GateWayInfo.class.getSimpleName());
+            } else if (entity.getOnLineDeviceType() == OnLineDeviceType.Device) {
+                DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(entity.getDeviceId());
+                OnLineState onLineState = OnLineState.OffLine;
+                Map<String, Object> standardData = new HashMap<String, Object>();
+                standardData.put("id", deviceInfo.getId());
+                standardData.put("onLineState", onLineState);
+                commonService.updateData(standardData, DeviceInfo.class.getSimpleName());
+                deviceSyncFullCardService.noticeSyncDeviceOnlineStateChange(deviceInfo.getDeviceId());
+            }
+        }
+    }
 
     /**
      * 检查设备的状态