Explorar o código

add 设备最后通讯时间
fix DeviceStateCheckTask,取设备最后通讯时间

jay hai 1 ano
pai
achega
951ff55d25

+ 15 - 0
iot-dao/iot-data-service/src/main/java/cc/iotkit/data/manager/IDeviceInfoData.java

@@ -56,6 +56,21 @@ public interface IDeviceInfoData extends IOwnedData<DeviceInfo, String> {
      */
     long getPropertyUpdateTime(String deviceId);
 
+    /**
+     * 获取设备最新通讯时间
+     *
+     * @param deviceId 设备id
+     * @return timestamp
+     */
+    long getLastTime(String deviceId);
+    /**
+     * 设置设备最新通讯时间
+     *
+     * @param deviceId 设备id
+     * @return timestamp
+     */
+    void setLastTime(String deviceId, long lastTime);
+
     /**
      * 根据设备ID取设备信息
      *

+ 21 - 1
iot-dao/iot-data-serviceImpl-cache/src/main/java/cc/iotkit/data/service/DeviceInfoDataCache.java

@@ -106,12 +106,18 @@ public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSi
         return String.format(Constants.PROPERTY_CACHE_KEY, deviceId);
     }
 
+    private String getLastTimeCacheKey(String deviceId) {
+        return String.format(Constants.LAST_TIME_CACHE_KEY, deviceId);
+    }
+
+
     @Override
     public void saveProperties(String deviceId, Map<String, DevicePropertyCache> properties) {
         Map<String, DevicePropertyCache> old = getProperties(deviceId);
         old.putAll(properties);
+        long updateTime = System.currentTimeMillis();
         redisTemplate.opsForValue().set(getPropertyCacheKey(deviceId),
-                JsonUtils.toJsonString(new PropertyCacheInfo(System.currentTimeMillis(), old))
+                JsonUtils.toJsonString(new PropertyCacheInfo(updateTime, old))
         );
     }
 
@@ -141,6 +147,20 @@ public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSi
         return getPropertyCacheInfo(deviceId).getUpdateTime();
     }
 
+    @Override
+    public long getLastTime(String deviceId) {
+         String last = redisTemplate.opsForValue().get( getLastTimeCacheKey(deviceId));
+         if(StringUtils.isBlank(last)){
+             return 0L;
+         }
+         return Long.valueOf(last);
+    }
+
+    @Override
+    public void setLastTime(String deviceId, long lastTime) {
+        redisTemplate.opsForValue().set(getLastTimeCacheKey(deviceId), String.valueOf(lastTime));
+    }
+
     @Override
     @Cacheable(value = Constants.CACHE_DEVICE_INFO, key = "#root.method.name+#deviceId", unless = "#result == null")
     public DeviceInfo findByDeviceId(String deviceId) {

+ 10 - 0
iot-dao/iot-data-serviceImpl-cache/src/main/java/cc/iotkit/data/service/DeviceInfoPropertyDataCache.java

@@ -118,6 +118,16 @@ public class DeviceInfoPropertyDataCache implements IDeviceInfoData {
         return deviceInfoData.getPropertyUpdateTime(deviceId);
     }
 
+    @Override
+    public long getLastTime(String deviceId) {
+        return deviceInfoData.getLastTime(deviceId);
+    }
+
+    @Override
+    public void setLastTime(String deviceId, long lastTime) {
+        deviceInfoData.setLastTime(deviceId, lastTime);
+    }
+
     @Override
     public DeviceInfo findByDeviceId(String deviceId) {
         DeviceInfo deviceInfo = deviceInfoData.findByDeviceId(deviceId);

+ 10 - 0
iot-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/DeviceInfoDataImpl.java

@@ -114,6 +114,16 @@ public class DeviceInfoDataImpl implements IDeviceInfoData, IJPACommData<DeviceI
         return 0;
     }
 
+    @Override
+    public long getLastTime(String deviceId) {
+        return 0;
+    }
+
+    @Override
+    public void setLastTime(String deviceId, long lastTime) {
+
+    }
+
     @Override
     public DeviceInfo findByDeviceId(String deviceId) {
         TbDeviceInfo tbDeviceInfo = deviceInfoRepository.findByDeviceId(deviceId);

+ 2 - 2
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/DeviceStateCheckTask.java

@@ -73,9 +73,9 @@ public class DeviceStateCheckTask {
                     continue;
                 }
                 String deviceId = device.getDeviceId();
-                long updateTime = deviceInfoData.getPropertyUpdateTime(deviceId);
+                long lastTime = deviceInfoData.getLastTime(deviceId);
                 //最后更新时间超时保活时长1.1倍认为设备离线了
-                if (System.currentTimeMillis() - updateTime > keepAliveTime * 1000 * 1.1) {
+                if (System.currentTimeMillis() - lastTime > keepAliveTime * 1000 * 1.1) {
                     DeviceInfo realTimeDevice = deviceInfoData.findByDeviceId(deviceId);
                     if (!realTimeDevice.isOnline()) {
                         continue;

+ 9 - 0
iot-module/iot-plugin/iot-plugin-main/src/main/java/cc/iotkit/plugin/main/ThingServiceImpl.java

@@ -85,6 +85,8 @@ public class ThingServiceImpl implements IThingService {
             if (device == null) {
                 log.warn("device:{} is not found.", deviceName);
             }
+            long lastTime = System.currentTimeMillis();
+            deviceUpdateLastTime(device, lastTime);
 
             ActionType type = action.getType();
             switch (type) {
@@ -92,6 +94,9 @@ public class ThingServiceImpl implements IThingService {
                     //设备注册
                     registerDevice(device, (DeviceRegister) action, null);
                     break;
+                case PING:
+                    // 设备心跳
+                    break;
                 case SUB_REGISTER:
                     //子设备注册
                     subRegisterDevice(pluginId, device, (SubDeviceRegister) action);
@@ -153,6 +158,10 @@ public class ThingServiceImpl implements IThingService {
         }
     }
 
+    private void deviceUpdateLastTime(DeviceInfo device, long lastTime) {
+        deviceInfoData.setLastTime(device.getDeviceId(),lastTime);
+    }
+
     @Override
     public ThingProduct getProduct(String pk) {
         try {

+ 1 - 1
iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/handler/DeviceMessageHandler.java

@@ -26,7 +26,7 @@ package cc.iotkit.ruleengine.handler;
 
 import cc.iotkit.common.thing.ThingModelMessage;
 
-public interface DeviceMessageHandler {
+public interface  DeviceMessageHandler {
 
     void handle(ThingModelMessage message);