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); 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 * ID
* *

View File

@ -106,12 +106,18 @@ public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSi
return String.format(Constants.PROPERTY_CACHE_KEY, deviceId); return String.format(Constants.PROPERTY_CACHE_KEY, deviceId);
} }
private String getLastTimeCacheKey(String deviceId) {
return String.format(Constants.LAST_TIME_CACHE_KEY, deviceId);
}
@Override @Override
public void saveProperties(String deviceId, Map<String, DevicePropertyCache> properties) { public void saveProperties(String deviceId, Map<String, DevicePropertyCache> properties) {
Map<String, DevicePropertyCache> old = getProperties(deviceId); Map<String, DevicePropertyCache> old = getProperties(deviceId);
old.putAll(properties); old.putAll(properties);
long updateTime = System.currentTimeMillis();
redisTemplate.opsForValue().set(getPropertyCacheKey(deviceId), 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(); 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 @Override
@Cacheable(value = Constants.CACHE_DEVICE_INFO, key = "#root.method.name+#deviceId", unless = "#result == null") @Cacheable(value = Constants.CACHE_DEVICE_INFO, key = "#root.method.name+#deviceId", unless = "#result == null")
public DeviceInfo findByDeviceId(String deviceId) { public DeviceInfo findByDeviceId(String deviceId) {

View File

@ -118,6 +118,16 @@ public class DeviceInfoPropertyDataCache implements IDeviceInfoData {
return deviceInfoData.getPropertyUpdateTime(deviceId); 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 @Override
public DeviceInfo findByDeviceId(String deviceId) { public DeviceInfo findByDeviceId(String deviceId) {
DeviceInfo deviceInfo = deviceInfoData.findByDeviceId(deviceId); DeviceInfo deviceInfo = deviceInfoData.findByDeviceId(deviceId);

View File

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

View File

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

View File

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