[*] 日常优化

This commit is contained in:
acgist
2023-07-28 08:11:59 +08:00
parent c9af50a324
commit 82731876f2
11 changed files with 133 additions and 99 deletions

View File

@@ -1048,6 +1048,38 @@ class Taoyao extends RemoteClient {
me.push(protocol.buildMessage("client::close", {})); me.push(protocol.buildMessage("client::close", {}));
} }
/**
* @returns 媒体服务列表
*/
async mediaList() {
const response = await this.request(protocol.buildMessage("client::list", {
clientType: "MEDIA"
}));
return response.body;
}
/**
* @returns 媒体终端列表
*/
async mediaClientList() {
const response = await this.request(protocol.buildMessage("client::list", {}));
return response.body.filter(v => {
return v.clientType === "WEB" || v.clientType === "CAMERA" || v.clientType === "MOBILE";
});
}
/**
* @param {*} clientType 终端类型(默认所有)
*
* @returns 终端列表
*/
async clientList(clientType) {
const response = await this.request(protocol.buildMessage("client::list", {
clientType
}));
return response.body;
}
/** /**
* 终端配置信令 * 终端配置信令
* *
@@ -2090,28 +2122,6 @@ class Taoyao extends RemoteClient {
return response.body; return response.body;
} }
/**
* @returns 媒体服务列表
*/
async mediaList() {
const response = await this.request(protocol.buildMessage("client::list", {
clientType: "MEDIA"
}));
return response.body;
}
/**
* @param {*} clientType 终端类型(默认所有)
*
* @returns 终端列表
*/
async clientList(clientType) {
const response = await this.request(protocol.buildMessage("client::list", {
clientType
}));
return response.body;
}
/** /**
* @param {*} clientId 终端ID * @param {*} clientId 终端ID
* *

View File

@@ -68,7 +68,12 @@ public interface Client extends AutoCloseable {
/** /**
* @return 授权是否超时 * @return 授权是否超时
*/ */
boolean timeout(); boolean authorizeTimeout();
/**
* @return 心跳是否超时
*/
boolean heartbeatTimeout();
/** /**
* 设置授权 * 设置授权

View File

@@ -1,5 +1,7 @@
package com.acgist.taoyao.signal.client; package com.acgist.taoyao.signal.client;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@@ -140,10 +142,16 @@ public abstract class ClientAdapter<T extends AutoCloseable> implements Client {
} }
@Override @Override
public boolean timeout() { public boolean authorizeTimeout() {
return System.currentTimeMillis() - this.time > this.timeout; return System.currentTimeMillis() - this.time > this.timeout;
} }
@Override
public boolean heartbeatTimeout() {
final LocalDateTime last = this.status.getLastHeartbeat();
return Duration.between(last, LocalDateTime.now()).getSeconds() >= this.timeout * 60;
}
@Override @Override
public void authorize(String clientId) { public void authorize(String clientId) {
this.clientId = clientId; this.clientId = clientId;

View File

@@ -220,8 +220,13 @@ public class ClientManager {
private void closeTimeout() { private void closeTimeout() {
final int oldSize = this.clients.size(); final int oldSize = this.clients.size();
this.clients.stream() this.clients.stream()
.filter(v -> v.unauthorized()) .filter(v -> {
.filter(v -> v.timeout()) if(v.unauthorized()) {
return v.authorizeTimeout();
} else {
return v.heartbeatTimeout();
}
})
.forEach(v -> { .forEach(v -> {
log.debug("关闭超时终端:{}", v); log.debug("关闭超时终端:{}", v);
this.close(v); this.close(v);

View File

@@ -54,7 +54,7 @@ public class ClientStatus {
@Schema(title = "终端配置", description = "其他扩展终端配置") @Schema(title = "终端配置", description = "其他扩展终端配置")
private Map<String, Object> config = new HashMap<>(); private Map<String, Object> config = new HashMap<>();
@Schema(title = "最后心跳时间", description = "最后心跳时间") @Schema(title = "最后心跳时间", description = "最后心跳时间")
private LocalDateTime lastHeartbeat; private LocalDateTime lastHeartbeat = LocalDateTime.now();
/** /**
* 拷贝属性 * 拷贝属性

View File

@@ -19,18 +19,19 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
@Description( @Description(
body = """ body = """
{ {
"latitude": 纬度, "latitude" : 纬度,
"longitude": 经度, "longitude" : 经度,
"humidity": 湿度, "humidity" : 湿度,
"temperature": 温度, "temperature" : 温度,
"signal": 信号强度0~100, "signal" : 信号强度0~100,
"battery": 电池电量0~100, "battery" : 电池电量0~100,
"alarming": 是否发生告警true|false, "alarming" : 是否发生告警true|false,
"charging": 是否正在充电true|false, "charging" : 是否正在充电true|false,
"recording": 是否正在录像true|false, "clientRecording": 是否正在录像true|false,
"lastHeartbeat": "最后心跳时间", "serverRecording": 是否正在录像true|false,
"status": {更多状态}, "lastHeartbeat" : "最后心跳时间",
"config": {更多配置} "status" : {更多状态},
"config" : {更多配置}
} }
""", """,
flow = "终端->信令服务->终端" flow = "终端->信令服务->终端"

View File

@@ -30,28 +30,29 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
""" """
[ [
{ {
"ip": "终端IP", "ip" : "终端IP",
"name": "终端名称", "name" : "终端名称",
"clientId": "终端ID", "clientId" : "终端ID",
"clientType": "终端类型", "clientType" : "终端类型",
"latitude": 纬度, "latitude" : 纬度,
"longitude": 经度, "longitude" : 经度,
"humidity": 湿度, "humidity" : 湿度,
"temperature": 温度, "temperature" : 温度,
"signal": 信号强度0~100, "signal" : 信号强度0~100,
"battery": 电池电量0~100, "battery" : 电池电量0~100,
"alarming": 是否发生告警true|false, "alarming" : 是否发生告警true|false,
"charging": 是否正在充电true|false, "charging" : 是否正在充电true|false,
"recording": 是否正在录像true|false, "clientRecording": 是否正在录像true|false,
"lastHeartbeat": "最后心跳时间", "serverRecording": 是否正在录像true|false,
"status": {更多状态}, "lastHeartbeat" : "最后心跳时间",
"config": {更多配置} "status" : {更多状态},
"config" : {更多配置}
}, },
... ...
] ]
""" """
}, },
flow = "终端->信令服务->终端" flow = "终端=>信令服务->终端"
) )
public class ClientListProtocol extends ProtocolClientAdapter { public class ClientListProtocol extends ProtocolClientAdapter {

View File

@@ -30,7 +30,8 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
"battery": 电池电量0~100, "battery": 电池电量0~100,
"alarming": 是否发生告警true|false, "alarming": 是否发生告警true|false,
"charging": 是否正在充电true|false, "charging": 是否正在充电true|false,
"recording": 是否正在录像true|false, "clientRecording": 是否正在录像true|false,
"serverRecording": 是否正在录像true|false,
"lastHeartbeat": "最后心跳时间", "lastHeartbeat": "最后心跳时间",
"status": {更多状态}, "status": {更多状态},
"config": {更多配置} "config": {更多配置}

View File

@@ -45,7 +45,8 @@ import lombok.extern.slf4j.Slf4j;
"battery": 电池电量0~100, "battery": 电池电量0~100,
"alarming": 是否发生告警true|false, "alarming": 是否发生告警true|false,
"charging": 是否正在充电true|false, "charging": 是否正在充电true|false,
"recording": 是否正在录像true|false, "clientRecording": 是否正在录像true|false,
"serverRecording": 是否正在录像true|false,
"lastHeartbeat": "最后心跳时间", "lastHeartbeat": "最后心跳时间",
"status": {更多状态}, "status": {更多状态},
"config": {更多配置} "config": {更多配置}

View File

@@ -39,7 +39,8 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
"battery": 电池电量0~100, "battery": 电池电量0~100,
"alarming": 是否发生告警true|false, "alarming": 是否发生告警true|false,
"charging": 是否正在充电true|false, "charging": 是否正在充电true|false,
"recording": 是否正在录像true|false, "clientRecording": 是否正在录像true|false,
"serverRecording": 是否正在录像true|false,
"lastHeartbeat": "最后心跳时间", "lastHeartbeat": "最后心跳时间",
"status": {更多状态}, "status": {更多状态},
"config": {更多配置} "config": {更多配置}

View File

@@ -43,7 +43,8 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter;
"battery": 电池电量0~100, "battery": 电池电量0~100,
"alarming": 是否发生告警true|false, "alarming": 是否发生告警true|false,
"charging": 是否正在充电true|false, "charging": 是否正在充电true|false,
"recording": 是否正在录像true|false, "clientRecording": 是否正在录像true|false,
"serverRecording": 是否正在录像true|false,
"lastHeartbeat": "最后心跳时间", "lastHeartbeat": "最后心跳时间",
"status": {更多状态}, "status": {更多状态},
"config": {更多配置} "config": {更多配置}