add 设备最后通讯时间

fix DeviceStateCheckTask,取设备最后通讯时间
V0.5.x
jay 2024-05-29 13:59:01 +08:00
parent 83d9974fe8
commit 951ff55d25
7 changed files with 68 additions and 4 deletions

View File

@ -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
*

View File

@ -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) {

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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 {

View File

@ -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);