diff --git a/main/manager-api/src/main/resources/db/changelog/202512161529.sql b/main/manager-api/src/main/resources/db/changelog/202512161529.sql new file mode 100644 index 00000000..40f154c7 --- /dev/null +++ b/main/manager-api/src/main/resources/db/changelog/202512161529.sql @@ -0,0 +1 @@ +INSERT INTO `sys_params` (id, param_code, param_value, value_type, param_type, remark) VALUES (311, 'enable_websocket_ping', 'false', 'boolean', 1, '是否启用WebSocket心跳保活机制'); \ No newline at end of file diff --git a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml index dd6dff55..67d912a1 100755 --- a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml @@ -445,3 +445,10 @@ databaseChangeLog: - sqlFile: encoding: utf8 path: classpath:db/changelog/202512131453.sql + - changeSet: + id: 202512161529 + author: RanChen + changes: + - sqlFile: + encoding: utf8 + path: classpath:db/changelog/202512161529.sql diff --git a/main/xiaozhi-server/config.yaml b/main/xiaozhi-server/config.yaml index e7b61dcd..f2bbe9be 100644 --- a/main/xiaozhi-server/config.yaml +++ b/main/xiaozhi-server/config.yaml @@ -69,6 +69,9 @@ enable_greeting: true enable_stop_tts_notify: false # 说完话是否开启提示音,音效地址 stop_tts_notify_voice: "config/assets/tts_notify.mp3" +# 是否启用WebSocket心跳保活机制 +enable_websocket_ping: false + # TTS音频发送延迟配置 # tts_audio_send_delay: 控制音频包发送间隔 diff --git a/main/xiaozhi-server/core/handle/textHandler/pingMessageHandler.py b/main/xiaozhi-server/core/handle/textHandler/pingMessageHandler.py new file mode 100644 index 00000000..f3af85eb --- /dev/null +++ b/main/xiaozhi-server/core/handle/textHandler/pingMessageHandler.py @@ -0,0 +1,45 @@ +import json +import time +from typing import Dict, Any + +from core.handle.textMessageHandler import TextMessageHandler +from core.handle.textMessageType import TextMessageType + +TAG = __name__ + + +class PingMessageHandler(TextMessageHandler): + """Ping消息处理器,用于保持WebSocket连接""" + + @property + def message_type(self) -> TextMessageType: + return TextMessageType.PING + + async def handle(self, conn, msg_json: Dict[str, Any]) -> None: + """ + 处理PING消息,发送PONG响应 + 消息格式:{"type": "ping"} + Args: + conn: WebSocket连接对象 + msg_json: PING消息的JSON数据 + """ + # 检查是否启用了WebSocket心跳功能 + enable_websocket_ping = conn.config.get("enable_websocket_ping", False) + if not enable_websocket_ping: + conn.logger.debug(f"WebSocket心跳功能未启用,忽略PING消息") + return + + try: + conn.logger.debug(f"收到PING消息,发送PONG响应") + conn.last_activity_time = time.time() * 1000 + # 构造PONG响应消息 + pong_message = { + "type": "pong", + "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), + } + + # 发送PONG响应 + await conn.websocket.send(json.dumps(pong_message)) + + except Exception as e: + conn.logger.error(f"处理PING消息时发生错误: {e}") diff --git a/main/xiaozhi-server/core/handle/textMessageHandlerRegistry.py b/main/xiaozhi-server/core/handle/textMessageHandlerRegistry.py index e90d7231..65e9474f 100644 --- a/main/xiaozhi-server/core/handle/textMessageHandlerRegistry.py +++ b/main/xiaozhi-server/core/handle/textMessageHandlerRegistry.py @@ -7,6 +7,7 @@ from core.handle.textHandler.listenMessageHandler import ListenTextMessageHandle from core.handle.textHandler.mcpMessageHandler import McpTextMessageHandler from core.handle.textMessageHandler import TextMessageHandler from core.handle.textHandler.serverMessageHandler import ServerTextMessageHandler +from core.handle.textHandler.pingMessageHandler import PingMessageHandler TAG = __name__ @@ -27,6 +28,7 @@ class TextMessageHandlerRegistry: IotTextMessageHandler(), McpTextMessageHandler(), ServerTextMessageHandler(), + PingMessageHandler(), ] for handler in handlers: diff --git a/main/xiaozhi-server/core/handle/textMessageType.py b/main/xiaozhi-server/core/handle/textMessageType.py index 53e71b71..bd04d289 100644 --- a/main/xiaozhi-server/core/handle/textMessageType.py +++ b/main/xiaozhi-server/core/handle/textMessageType.py @@ -9,3 +9,4 @@ class TextMessageType(Enum): IOT = "iot" MCP = "mcp" SERVER = "server" + PING = "ping"