From 82731876f238537e5b8d9187d8ea2cc8dd58af1d Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Fri, 28 Jul 2023 08:11:59 +0800 Subject: [PATCH] =?UTF-8?q?[*]=20=E6=97=A5=E5=B8=B8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taoyao-client-web/src/components/Taoyao.js | 54 +++++++++------ .../acgist/taoyao/signal/client/Client.java | 7 +- .../taoyao/signal/client/ClientAdapter.java | 10 ++- .../taoyao/signal/client/ClientManager.java | 9 ++- .../taoyao/signal/client/ClientStatus.java | 22 +++--- .../client/ClientHeartbeatProtocol.java | 51 +++++++------- .../protocol/client/ClientListProtocol.java | 67 ++++++++++--------- .../protocol/client/ClientOnlineProtocol.java | 3 +- .../client/ClientRegisterProtocol.java | 3 +- .../protocol/client/ClientStatusProtocol.java | 3 +- .../protocol/room/RoomClientListProtocol.java | 3 +- 11 files changed, 133 insertions(+), 99 deletions(-) diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js index 8d05b8e..a517970 100644 --- a/taoyao-client-web/src/components/Taoyao.js +++ b/taoyao-client-web/src/components/Taoyao.js @@ -1048,6 +1048,38 @@ class Taoyao extends RemoteClient { 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; } - /** - * @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 * diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java index 0bb1801..8138667 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java @@ -68,7 +68,12 @@ public interface Client extends AutoCloseable { /** * @return 授权是否超时 */ - boolean timeout(); + boolean authorizeTimeout(); + + /** + * @return 心跳是否超时 + */ + boolean heartbeatTimeout(); /** * 设置授权 diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java index c9905a7..61fc3e3 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java @@ -1,5 +1,7 @@ package com.acgist.taoyao.signal.client; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -140,10 +142,16 @@ public abstract class ClientAdapter implements Client { } @Override - public boolean timeout() { + public boolean authorizeTimeout() { 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 public void authorize(String clientId) { this.clientId = clientId; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java index d33aebe..52cbcf5 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java @@ -220,8 +220,13 @@ public class ClientManager { private void closeTimeout() { final int oldSize = this.clients.size(); this.clients.stream() - .filter(v -> v.unauthorized()) - .filter(v -> v.timeout()) + .filter(v -> { + if(v.unauthorized()) { + return v.authorizeTimeout(); + } else { + return v.heartbeatTimeout(); + } + }) .forEach(v -> { log.debug("关闭超时终端:{}", v); this.close(v); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java index 533a586..85d2633 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java @@ -54,7 +54,7 @@ public class ClientStatus { @Schema(title = "终端配置", description = "其他扩展终端配置") private Map config = new HashMap<>(); @Schema(title = "最后心跳时间", description = "最后心跳时间") - private LocalDateTime lastHeartbeat; + private LocalDateTime lastHeartbeat = LocalDateTime.now(); /** * 拷贝属性 @@ -62,18 +62,18 @@ public class ClientStatus { * @param body 消息主体 */ public void copy(Map body) { - this.setLatitude(MapUtils.get(body, Constant.LATITUDE, this.latitude)); - this.setLongitude(MapUtils.get(body, Constant.LONGITUDE, this.longitude)); - this.setHumidity(MapUtils.get(body, Constant.HUMIDITY, this.humidity)); - this.setTemperature(MapUtils.get(body, Constant.TEMPERATURE, this.temperature)); - this.setSignal(MapUtils.get(body, Constant.SIGNAL, this.signal)); - this.setBattery(MapUtils.get(body, Constant.BATTERY, this.battery)); - this.setAlarming(MapUtils.get(body, Constant.ALARMING, this.alarming)); - this.setCharging(MapUtils.get(body, Constant.CHARGING, this.charging)); + this.setLatitude(MapUtils.get(body, Constant.LATITUDE, this.latitude)); + this.setLongitude(MapUtils.get(body, Constant.LONGITUDE, this.longitude)); + this.setHumidity(MapUtils.get(body, Constant.HUMIDITY, this.humidity)); + this.setTemperature(MapUtils.get(body, Constant.TEMPERATURE, this.temperature)); + this.setSignal(MapUtils.get(body, Constant.SIGNAL, this.signal)); + this.setBattery(MapUtils.get(body, Constant.BATTERY, this.battery)); + this.setAlarming(MapUtils.get(body, Constant.ALARMING, this.alarming)); + this.setCharging(MapUtils.get(body, Constant.CHARGING, this.charging)); this.setClientRecording(MapUtils.get(body, Constant.CLIENT_RECORDING, this.clientRecording)); // this.setServerRecording(MapUtils.get(body, Constant.SERVER_RECORDING, this.serverRecording)); - this.status(MapUtils.get(body, Constant.STATUS, this.status)); - this.config(MapUtils.get(body, Constant.CONFIG, this.config)); + this.status(MapUtils.get(body, Constant.STATUS, this.status)); + this.config(MapUtils.get(body, Constant.CONFIG, this.config)); this.setLastHeartbeat(LocalDateTime.now()); } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java index b2204d3..e9db14d 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java @@ -19,35 +19,36 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; @Description( body = """ { - "latitude": 纬度, - "longitude": 经度, - "humidity": 湿度, - "temperature": 温度, - "signal": 信号强度(0~100), - "battery": 电池电量(0~100), - "alarming": 是否发生告警(true|false), - "charging": 是否正在充电(true|false), - "recording": 是否正在录像(true|false), - "lastHeartbeat": "最后心跳时间", - "status": {更多状态}, - "config": {更多配置} + "latitude" : 纬度, + "longitude" : 经度, + "humidity" : 湿度, + "temperature" : 温度, + "signal" : 信号强度(0~100), + "battery" : 电池电量(0~100), + "alarming" : 是否发生告警(true|false), + "charging" : 是否正在充电(true|false), + "clientRecording": 是否正在录像(true|false), + "serverRecording": 是否正在录像(true|false), + "lastHeartbeat" : "最后心跳时间", + "status" : {更多状态}, + "config" : {更多配置} } """, flow = "终端->信令服务->终端" ) public class ClientHeartbeatProtocol extends ProtocolClientAdapter { - public static final String SIGNAL = "client::heartbeat"; - - public ClientHeartbeatProtocol() { - super("终端心跳信令", SIGNAL); - } - - @Override - public void execute(String clientId, ClientType clientType, Client client, Message message, Map body) { - client.push(message.cloneWithoutBody()); - final ClientStatus status = client.getStatus(); - status.copy(body); - } - + public static final String SIGNAL = "client::heartbeat"; + + public ClientHeartbeatProtocol() { + super("终端心跳信令", SIGNAL); + } + + @Override + public void execute(String clientId, ClientType clientType, Client client, Message message, Map body) { + client.push(message.cloneWithoutBody()); + final ClientStatus status = client.getStatus(); + status.copy(body); + } + } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientListProtocol.java index 9c3e20e..b2b4720 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientListProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientListProtocol.java @@ -30,46 +30,47 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; """ [ { - "ip": "终端IP", - "name": "终端名称", - "clientId": "终端ID", - "clientType": "终端类型", - "latitude": 纬度, - "longitude": 经度, - "humidity": 湿度, - "temperature": 温度, - "signal": 信号强度(0~100), - "battery": 电池电量(0~100), - "alarming": 是否发生告警(true|false), - "charging": 是否正在充电(true|false), - "recording": 是否正在录像(true|false), - "lastHeartbeat": "最后心跳时间", - "status": {更多状态}, - "config": {更多配置} + "ip" : "终端IP", + "name" : "终端名称", + "clientId" : "终端ID", + "clientType" : "终端类型", + "latitude" : 纬度, + "longitude" : 经度, + "humidity" : 湿度, + "temperature" : 温度, + "signal" : 信号强度(0~100), + "battery" : 电池电量(0~100), + "alarming" : 是否发生告警(true|false), + "charging" : 是否正在充电(true|false), + "clientRecording": 是否正在录像(true|false), + "serverRecording": 是否正在录像(true|false), + "lastHeartbeat" : "最后心跳时间", + "status" : {更多状态}, + "config" : {更多配置} }, ... ] """ }, - flow = "终端->信令服务->终端" + flow = "终端=>信令服务->终端" ) public class ClientListProtocol extends ProtocolClientAdapter { - public static final String SIGNAL = "client::list"; - - public ClientListProtocol() { - super("终端列表信令", SIGNAL); - } + public static final String SIGNAL = "client::list"; + + public ClientListProtocol() { + super("终端列表信令", SIGNAL); + } - @Override - public void execute(String clientId, ClientType clientType, Client client, Message message, Map body) { - final String queryClientType = MapUtils.get(body, Constant.CLIENT_TYPE); - if(StringUtils.isEmpty(queryClientType)) { - message.setBody(this.clientManager.getStatus()); - } else { - message.setBody(this.clientManager.getStatus(ClientType.of(queryClientType))); - } - client.push(message); - } - + @Override + public void execute(String clientId, ClientType clientType, Client client, Message message, Map body) { + final String queryClientType = MapUtils.get(body, Constant.CLIENT_TYPE); + if(StringUtils.isEmpty(queryClientType)) { + message.setBody(this.clientManager.getStatus()); + } else { + message.setBody(this.clientManager.getStatus(ClientType.of(queryClientType))); + } + client.push(message); + } + } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOnlineProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOnlineProtocol.java index 4ed0302..d7371f2 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOnlineProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientOnlineProtocol.java @@ -30,7 +30,8 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; "battery": 电池电量(0~100), "alarming": 是否发生告警(true|false), "charging": 是否正在充电(true|false), - "recording": 是否正在录像(true|false), + "clientRecording": 是否正在录像(true|false), + "serverRecording": 是否正在录像(true|false), "lastHeartbeat": "最后心跳时间", "status": {更多状态}, "config": {更多配置} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java index bebfbcd..19c404a 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java @@ -45,7 +45,8 @@ import lombok.extern.slf4j.Slf4j; "battery": 电池电量(0~100), "alarming": 是否发生告警(true|false), "charging": 是否正在充电(true|false), - "recording": 是否正在录像(true|false), + "clientRecording": 是否正在录像(true|false), + "serverRecording": 是否正在录像(true|false), "lastHeartbeat": "最后心跳时间", "status": {更多状态}, "config": {更多配置} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientStatusProtocol.java index b0b6a12..b142b2b 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientStatusProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientStatusProtocol.java @@ -39,7 +39,8 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; "battery": 电池电量(0~100), "alarming": 是否发生告警(true|false), "charging": 是否正在充电(true|false), - "recording": 是否正在录像(true|false), + "clientRecording": 是否正在录像(true|false), + "serverRecording": 是否正在录像(true|false), "lastHeartbeat": "最后心跳时间", "status": {更多状态}, "config": {更多配置} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomClientListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomClientListProtocol.java index 4d54911..a7a149e 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomClientListProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomClientListProtocol.java @@ -43,7 +43,8 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; "battery": 电池电量(0~100), "alarming": 是否发生告警(true|false), "charging": 是否正在充电(true|false), - "recording": 是否正在录像(true|false), + "clientRecording": 是否正在录像(true|false), + "serverRecording": 是否正在录像(true|false), "lastHeartbeat": "最后心跳时间", "status": {更多状态}, "config": {更多配置}