diff --git a/iot-dao/iot-data-service/src/main/java/cc/iotkit/data/manager/IDeviceInfoData.java b/iot-dao/iot-data-service/src/main/java/cc/iotkit/data/manager/IDeviceInfoData.java index 88b952e0..d2ea78f1 100644 --- a/iot-dao/iot-data-service/src/main/java/cc/iotkit/data/manager/IDeviceInfoData.java +++ b/iot-dao/iot-data-service/src/main/java/cc/iotkit/data/manager/IDeviceInfoData.java @@ -56,6 +56,21 @@ public interface IDeviceInfoData extends IOwnedData { */ 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取设备信息 * diff --git a/iot-dao/iot-data-serviceImpl-cache/src/main/java/cc/iotkit/data/service/DeviceInfoDataCache.java b/iot-dao/iot-data-serviceImpl-cache/src/main/java/cc/iotkit/data/service/DeviceInfoDataCache.java index 50e5fb78..11dfbd7d 100644 --- a/iot-dao/iot-data-serviceImpl-cache/src/main/java/cc/iotkit/data/service/DeviceInfoDataCache.java +++ b/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 properties) { Map 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) { diff --git a/iot-dao/iot-data-serviceImpl-cache/src/main/java/cc/iotkit/data/service/DeviceInfoPropertyDataCache.java b/iot-dao/iot-data-serviceImpl-cache/src/main/java/cc/iotkit/data/service/DeviceInfoPropertyDataCache.java index 1ea6d380..abf4c12f 100644 --- a/iot-dao/iot-data-serviceImpl-cache/src/main/java/cc/iotkit/data/service/DeviceInfoPropertyDataCache.java +++ b/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); diff --git a/iot-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/DeviceInfoDataImpl.java b/iot-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/DeviceInfoDataImpl.java index 18fdc6da..4966a822 100644 --- a/iot-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/DeviceInfoDataImpl.java +++ b/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 keepAliveTime * 1000 * 1.1) { + if (System.currentTimeMillis() - lastTime > keepAliveTime * 1000 * 1.1) { DeviceInfo realTimeDevice = deviceInfoData.findByDeviceId(deviceId); if (!realTimeDevice.isOnline()) { continue; diff --git a/iot-module/iot-plugin/iot-plugin-main/src/main/java/cc/iotkit/plugin/main/ThingServiceImpl.java b/iot-module/iot-plugin/iot-plugin-main/src/main/java/cc/iotkit/plugin/main/ThingServiceImpl.java index 2f80c399..3482b45e 100644 --- a/iot-module/iot-plugin/iot-plugin-main/src/main/java/cc/iotkit/plugin/main/ThingServiceImpl.java +++ b/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 { diff --git a/iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/handler/DeviceMessageHandler.java b/iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/handler/DeviceMessageHandler.java index 85bf22e1..b87f95f2 100644 --- a/iot-module/iot-rule-engine/src/main/java/cc/iotkit/ruleengine/handler/DeviceMessageHandler.java +++ b/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);