判断设备离线时发送状态查询确定设备真实状态,确定离线再设置为离线
parent
108cdf1a13
commit
5539f52d13
|
@ -101,7 +101,7 @@ public interface IDeviceService {
|
|||
* 检查设备状态
|
||||
* @param device 设备信息
|
||||
*/
|
||||
void checkDeviceStatus(Device device);
|
||||
Boolean getDeviceStatus(Device device);
|
||||
|
||||
/**
|
||||
* 根据IP和端口获取设备信息
|
||||
|
|
|
@ -40,10 +40,12 @@ import org.springframework.util.Assert;
|
|||
|
||||
import javax.sip.InvalidArgumentException;
|
||||
import javax.sip.SipException;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.text.ParseException;
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.SynchronousQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
|
@ -199,12 +201,17 @@ public class DeviceServiceImpl implements IDeviceService {
|
|||
log.warn("[设备不存在] device:{}", deviceId);
|
||||
return;
|
||||
}
|
||||
// TODO 主动查询设备状态
|
||||
|
||||
// 主动查询设备状态
|
||||
Boolean deviceStatus = getDeviceStatus(device);
|
||||
if (deviceStatus != null && deviceStatus) {
|
||||
log.info("[设备离线] 主动探测发现设备在线,暂不处理 device:{}", deviceId);
|
||||
online(device, null);
|
||||
return;
|
||||
}
|
||||
log.info("[设备离线] {}, device:{}, 心跳间隔: {},心跳超时次数: {}, 上次心跳时间:{}, 上次注册时间: {}", reason, deviceId,
|
||||
device.getHeartBeatInterval(), device.getHeartBeatCount(), device.getKeepaliveTime(), device.getRegisterTime());
|
||||
String registerExpireTaskKey = VideoManagerConstants.REGISTER_EXPIRE_TASK_KEY_PREFIX + deviceId;
|
||||
|
||||
|
||||
dynamicTask.stop(registerExpireTaskKey);
|
||||
if (device.isOnLine()) {
|
||||
if (userSetting.getDeviceStatusNotify()) {
|
||||
|
@ -411,15 +418,23 @@ public class DeviceServiceImpl implements IDeviceService {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void checkDeviceStatus(Device device) {
|
||||
if (device == null || !device.isOnLine()) {
|
||||
return;
|
||||
}
|
||||
public Boolean getDeviceStatus(@NotNull Device device) {
|
||||
SynchronousQueue<String> queue = new SynchronousQueue<>();
|
||||
try {
|
||||
sipCommander.deviceStatusQuery(device, null);
|
||||
} catch (InvalidArgumentException | SipException | ParseException e) {
|
||||
sipCommander.deviceStatusQuery(device, ((code, msg, data) -> {
|
||||
queue.offer(msg);
|
||||
}));
|
||||
String data = queue.poll(10, TimeUnit.SECONDS);
|
||||
if (data != null && "ONLINE".equalsIgnoreCase(data.trim())) {
|
||||
return Boolean.TRUE;
|
||||
}else {
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
|
||||
} catch (InvalidArgumentException | SipException | ParseException | InterruptedException e) {
|
||||
log.error("[命令发送失败] 设备状态查询: {}", e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -843,9 +858,17 @@ public class DeviceServiceImpl implements IDeviceService {
|
|||
callback.run(result.getCode(), result.getMsg(), result.getData());
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
sipCommander.deviceStatusQuery(device, callback);
|
||||
sipCommander.deviceStatusQuery(device, (code, msg, data) -> {
|
||||
if ("ONLINE".equalsIgnoreCase(data.trim())) {
|
||||
online(device, null);
|
||||
}else {
|
||||
offline(device.getDeviceId(), "设备状态查询结果:" + data.trim());
|
||||
}
|
||||
if (callback != null) {
|
||||
callback.run(code, msg, data);
|
||||
}
|
||||
});
|
||||
} catch (InvalidArgumentException | SipException | ParseException e) {
|
||||
log.error("[命令发送失败] 获取设备状态: {}", e.getMessage());
|
||||
callback.run(ErrorCode.ERROR100.getCode(), "命令发送: " + e.getMessage(), null);
|
||||
|
|
|
@ -58,11 +58,6 @@ public class DeviceStatusResponseMessageHandler extends SIPRequestProcessorParen
|
|||
log.debug(json.toJSONString());
|
||||
}
|
||||
String text = onlineElement.getText();
|
||||
if ("ONLINE".equalsIgnoreCase(text.trim())) {
|
||||
deviceService.online(device, null);
|
||||
}else {
|
||||
deviceService.offline(device.getDeviceId(), "设备状态查询结果:" + text.trim());
|
||||
}
|
||||
responseMessageHandler.handMessageEvent(element, text);
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue