feat: 增加网页后台管理

This commit is contained in:
2026-07-21 17:46:00 +08:00
parent 1edb87b5f2
commit ef786b1529
42 changed files with 5222 additions and 2 deletions

View File

@@ -3,6 +3,7 @@ package com.ttstd.signaling.handler;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ttstd.signaling.manager.ConnectionRequestManager;
import com.ttstd.signaling.manager.SessionManager;
import com.ttstd.signaling.manager.SignalMetrics;
import com.ttstd.signaling.model.DeviceType;
import com.ttstd.signaling.model.SignalMessage;
import org.slf4j.Logger;
@@ -26,10 +27,14 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
private final SessionManager sessionManager;
private final ConnectionRequestManager connectionRequestManager;
private final SignalMetrics metrics;
public SignalWebSocketHandler(SessionManager sessionManager, ConnectionRequestManager connectionRequestManager) {
public SignalWebSocketHandler(SessionManager sessionManager,
ConnectionRequestManager connectionRequestManager,
SignalMetrics metrics) {
this.sessionManager = sessionManager;
this.connectionRequestManager = connectionRequestManager;
this.metrics = metrics;
this.connectionRequestManager.setSender(this::sendToDevice);
}
@@ -54,6 +59,7 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
logger.debug("Received message: {}", payload);
metrics.incMessage();
try {
SignalMessage signalMessage = objectMapper.readValue(payload, SignalMessage.class);
@@ -75,16 +81,19 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
// 客户端心跳保活消息,无需处理,仅用于防止中间代理因空闲超时断开连接
break;
case "OFFER":
metrics.incOffer();
// 连接请求:统一经 ConnectionRequestManager 做校验/去重/待确认跟踪后再转发
handleConnectionRequest(signalMessage);
break;
case "ANSWER":
metrics.incAnswer();
// 被控端已接受:清理待确认状态并转发 Answer 给主控端
connectionRequestManager.completePendingRequest(
signalMessage.getToDeviceId(), signalMessage.getFromDeviceId());
forwardMessage(signalMessage, true);
break;
case "CONNECTION_REJECTED":
metrics.incRejected();
// 被控端已拒绝:清理待确认状态并转发拒绝通知给主控端
connectionRequestManager.completePendingRequest(
signalMessage.getToDeviceId(), signalMessage.getFromDeviceId());
@@ -109,12 +118,14 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
logger.info("WebSocket connection closed: {} ({})", session.getId(), status);
sessionManager.unregisterSession(session);
metrics.recordSessionCount(sessionManager.getOnlineCount());
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
logger.error("Transport error on session {}: {}", session.getId(), exception.getMessage());
sessionManager.unregisterSession(session);
metrics.recordSessionCount(sessionManager.getOnlineCount());
if (session.isOpen()) {
session.close(CloseStatus.SERVER_ERROR);
}
@@ -132,6 +143,8 @@ public class SignalWebSocketHandler extends TextWebSocketHandler {
try {
DeviceType deviceType = DeviceType.valueOf(deviceTypeStr.toUpperCase());
sessionManager.registerDevice(deviceId, deviceType, session);
metrics.incRegistered();
metrics.recordSessionCount(sessionManager.getOnlineCount());
// 回复注册成功
Map<String, Object> response = new HashMap<>();