[*] 日常优化

This commit is contained in:
acgist
2023-07-30 08:29:43 +08:00
parent 82731876f2
commit 2784eb6b9b
11 changed files with 211 additions and 170 deletions

View File

@@ -4,7 +4,7 @@ import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ClientEventAdapter;
/**
* 终端关闭事件
* 关闭终端事件
*
* @author acgist
*/

View File

@@ -0,0 +1,27 @@
package com.acgist.taoyao.signal.event.room;
import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ClientEventAdapter;
/**
* 媒体服务注册事件
* 需要重新创建房间
*
* 媒体服务掉线两种方案
*
* 1. 注册相同名称媒体服务,注册成功之后通知媒体服务终端重新连接。
* 2. 自动转移媒体服务终端到个新的媒体服务,然后通知媒体服务终端重新连接。
*
* 本项目采用第一种方案
*
* @author acgist
*/
public class MediaServerRegisterEvent extends ClientEventAdapter {
private static final long serialVersionUID = 1L;
public MediaServerRegisterEvent(Client client) {
super(client);
}
}

View File

@@ -1,19 +0,0 @@
package com.acgist.taoyao.signal.event.room;
import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.ClientEventAdapter;
/**
* 创建房间事件
*
* @author acgist
*/
public class RoomCreateEvent extends ClientEventAdapter {
private static final long serialVersionUID = 1L;
public RoomCreateEvent(Client client) {
super(client);
}
}

View File

@@ -29,8 +29,8 @@ import lombok.extern.slf4j.Slf4j;
如果终端意外掉线,需要自己实现重连逻辑。
""",
flow = {
"终端->信令服务->终端",
"终端-[关闭终端]>信令服务-[终端下线])终端",
"终端=>信令服务->终端",
"终端=>信令服务-[终端下线])终端",
"终端-[连接断开]>信令服务-[终端下线])终端"
}
)

View File

@@ -23,17 +23,20 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
"clientId": "下线终端ID"
}
""",
flow = "终端-[终端关闭]>信令服务-)终端"
flow = {
"终端=[关闭终端]>信令服务-[终端下线])终端",
"终端-[连接断开]>信令服务-[终端下线])终端"
}
)
public class ClientOfflineProtocol extends ProtocolClientAdapter implements ApplicationListener<ClientOfflineEvent> {
public static final String SIGNAL = "client::offline";
public static final String SIGNAL = "client::offline";
public ClientOfflineProtocol() {
super("终端下线信令", SIGNAL);
}
public ClientOfflineProtocol() {
super("终端下线信令", SIGNAL);
}
@Async
@Async
@Override
public void onApplicationEvent(ClientOfflineEvent event) {
final String clientId = event.getClientId();

View File

@@ -18,44 +18,44 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
@Description(
body = """
{
"ip": "终端IP",
"name": "终端名称",
"clientId": "终端ID",
"clientType": "终端类型",
"latitude": 纬度,
"longitude": 经度,
"humidity": 湿度,
"temperature": 温度,
"signal": 信号强度0~100,
"battery": 电池电量0~100,
"alarming": 是否发生告警true|false,
"charging": 是否正在充电true|false,
"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": {更多配置}
"lastHeartbeat" : "最后心跳时间",
"status" : {更多状态},
"config" : {更多配置}
}
""",
flow = "终端=[终端注册]>信令服务-)终端"
)
public class ClientOnlineProtocol extends ProtocolClientAdapter implements ApplicationListener<ClientOnlineEvent> {
public static final String SIGNAL = "client::online";
public ClientOnlineProtocol() {
super("终端上线信令", SIGNAL);
}
public static final String SIGNAL = "client::online";
public ClientOnlineProtocol() {
super("终端上线信令", SIGNAL);
}
@Async
@Async
@Override
public void onApplicationEvent(ClientOnlineEvent event) {
final Client client = event.getClient();
final Client client = event.getClient();
final String clientId = event.getClientId();
this.clientManager.broadcast(
clientId,
this.build(client.getStatus())
);
}
}

View File

@@ -15,17 +15,17 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
)
public class ClientRebootProtocol extends ProtocolClientAdapter {
public static final String SIGNAL = "client::reboot";
public ClientRebootProtocol() {
super("重启终端信令", SIGNAL);
}
/**
* @param clientId 终端ID
*/
public void execute(String clientId) {
this.clientManager.unicast(clientId, this.build());
}
public static final String SIGNAL = "client::reboot";
public ClientRebootProtocol() {
super("重启终端信令", SIGNAL);
}
/**
* @param clientId 终端ID
*/
public void execute(String clientId) {
this.clientManager.unicast(clientId, this.build());
}
}

View File

@@ -15,7 +15,7 @@ import com.acgist.taoyao.signal.client.ClientStatus;
import com.acgist.taoyao.signal.client.ClientType;
import com.acgist.taoyao.signal.event.client.ClientConfigEvent;
import com.acgist.taoyao.signal.event.client.ClientOnlineEvent;
import com.acgist.taoyao.signal.event.room.RoomCreateEvent;
import com.acgist.taoyao.signal.event.room.MediaServerRegisterEvent;
import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
import com.acgist.taoyao.signal.service.SecurityService;
@@ -32,24 +32,24 @@ import lombok.extern.slf4j.Slf4j;
memo = "收到注册响应之后应该设置终端的终端索引",
body = """
{
"username": "信令用户",
"password": "信令密码",
"name": "终端名称",
"clientId": "终端ID",
"clientType": "终端类型",
"latitude": 纬度,
"longitude": 经度,
"humidity": 湿度,
"temperature": 温度,
"signal": 信号强度0~100,
"battery": 电池电量0~100,
"alarming": 是否发生告警true|false,
"charging": 是否正在充电true|false,
"username" : "信令用户",
"password" : "信令密码",
"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": {更多配置}
"lastHeartbeat" : "最后心跳时间",
"status" : {更多状态},
"config" : {更多配置}
}
""",
flow = {
@@ -60,58 +60,58 @@ import lombok.extern.slf4j.Slf4j;
)
public class ClientRegisterProtocol extends ProtocolClientAdapter {
public static final String SIGNAL = "client::register";
private final SecurityService securityService;
public ClientRegisterProtocol(SecurityService securityService) {
super("终端注册信令", SIGNAL);
this.securityService = securityService;
}
public static final String SIGNAL = "client::register";
private final SecurityService securityService;
public ClientRegisterProtocol(SecurityService securityService) {
super("终端注册信令", SIGNAL);
this.securityService = securityService;
}
@Override
public void execute(String nullClientId, ClientType nullClientType, Client client, Message message, Map<String, Object> body) {
final String clientId = MapUtils.get(body, Constant.CLIENT_ID);
final String username = MapUtils.get(body, Constant.USERNAME);
final String password = MapUtils.get(body, Constant.PASSWORD);
if(this.securityService.authenticate(username, password)) {
final Client oldClient = this.clientManager.getClients(clientId);
if(oldClient != null) {
log.debug("终端已经存在(注销旧的终端):{}", clientId);
CloseableUtils.close(oldClient);
}
log.info("终端注册:{}", clientId);
client.authorize(clientId);
message.setCode(MessageCode.CODE_0000);
} else {
throw MessageCodeException.of(MessageCode.CODE_3401, "注册失败");
}
final ClientType clientType = ClientType.of(MapUtils.get(body, Constant.CLIENT_TYPE));
// 注册响应消息
final Message response = message.cloneWithoutBody();
response.setBody(Map.of(Constant.INDEX, this.idService.buildClientIndex()));
client.push(response);
// 设置终端状态
this.buildStatus(clientId, clientType, client, body);
public void execute(String nullClientId, ClientType nullClientType, Client client, Message message, Map<String, Object> body) {
final String clientId = MapUtils.get(body, Constant.CLIENT_ID);
final String username = MapUtils.get(body, Constant.USERNAME);
final String password = MapUtils.get(body, Constant.PASSWORD);
if(this.securityService.authenticate(username, password)) {
final Client oldClient = this.clientManager.getClients(clientId);
if(oldClient != null) {
log.debug("终端已经存在(注销旧的终端):{}", clientId);
CloseableUtils.close(oldClient);
}
log.info("终端注册:{}", clientId);
client.authorize(clientId);
message.setCode(MessageCode.CODE_0000);
} else {
throw MessageCodeException.of(MessageCode.CODE_3401, "注册失败");
}
final ClientType clientType = ClientType.of(MapUtils.get(body, Constant.CLIENT_TYPE));
// 注册响应消息
final Message response = message.cloneWithoutBody();
response.setBody(Map.of(Constant.INDEX, this.idService.buildClientIndex()));
client.push(response);
// 设置终端状态
this.buildStatus(clientId, clientType, client, body);
// 终端配置事件
this.publishEvent(new ClientConfigEvent(client));
this.publishEvent(new ClientConfigEvent(client));
// 终端上线事件
this.publishEvent(new ClientOnlineEvent(client));
// 媒体服务注册:创建房间事件
if(clientType.mediaServer()) {
this.publishEvent(new RoomCreateEvent(client));
this.publishEvent(new MediaServerRegisterEvent(client));
}
}
/**
* @param clientId 终端ID
* @param clientType 终端类型
* @param client 终端
* @param body 消息主体
*
* @return 终端状态
*/
private ClientStatus buildStatus(String clientId, ClientType clientType, Client client, Map<String, Object> body) {
}
/**
* @param clientId 终端ID
* @param clientType 终端类型
* @param client 终端
* @param body 消息主体
*
* @return 终端状态
*/
private ClientStatus buildStatus(String clientId, ClientType clientType, Client client, Map<String, Object> body) {
final ClientStatus status = client.getStatus();
status.setIp(client.getIP());
status.setName(MapUtils.get(body, Constant.NAME));
@@ -119,6 +119,6 @@ public class ClientRegisterProtocol extends ProtocolClientAdapter {
status.setClientType(clientType);
status.copy(body);
return status;
}
}
}

View File

@@ -12,7 +12,7 @@ import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.utils.MapUtils;
import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.client.ClientType;
import com.acgist.taoyao.signal.event.room.RoomCreateEvent;
import com.acgist.taoyao.signal.event.room.MediaServerRegisterEvent;
import com.acgist.taoyao.signal.party.room.Room;
import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
@@ -41,7 +41,7 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter;
},
flow = "终端->信令服务->媒体服务->信令服务+)终端"
)
public class RoomCreateProtocol extends ProtocolClientAdapter implements ApplicationListener<RoomCreateEvent> {
public class RoomCreateProtocol extends ProtocolClientAdapter implements ApplicationListener<MediaServerRegisterEvent> {
public static final String SIGNAL = "room::create";
@@ -51,8 +51,9 @@ public class RoomCreateProtocol extends ProtocolClientAdapter implements Applica
@Async
@Override
public void onApplicationEvent(RoomCreateEvent event) {
public void onApplicationEvent(MediaServerRegisterEvent event) {
this.roomManager.recreate(event.getClient(), this.build());
// TODO通知
}
@Override