mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-27 09:33:55 +08:00
Merge pull request #2722 from xinnan-tech/py_websocket_activate
update: 增加websocket心跳机制
This commit is contained in:
@@ -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心跳保活机制');
|
||||||
@@ -445,3 +445,10 @@ databaseChangeLog:
|
|||||||
- sqlFile:
|
- sqlFile:
|
||||||
encoding: utf8
|
encoding: utf8
|
||||||
path: classpath:db/changelog/202512131453.sql
|
path: classpath:db/changelog/202512131453.sql
|
||||||
|
- changeSet:
|
||||||
|
id: 202512161529
|
||||||
|
author: RanChen
|
||||||
|
changes:
|
||||||
|
- sqlFile:
|
||||||
|
encoding: utf8
|
||||||
|
path: classpath:db/changelog/202512161529.sql
|
||||||
|
|||||||
@@ -69,6 +69,9 @@ enable_greeting: true
|
|||||||
enable_stop_tts_notify: false
|
enable_stop_tts_notify: false
|
||||||
# 说完话是否开启提示音,音效地址
|
# 说完话是否开启提示音,音效地址
|
||||||
stop_tts_notify_voice: "config/assets/tts_notify.mp3"
|
stop_tts_notify_voice: "config/assets/tts_notify.mp3"
|
||||||
|
# 是否启用WebSocket心跳保活机制
|
||||||
|
enable_websocket_ping: false
|
||||||
|
|
||||||
|
|
||||||
# TTS音频发送延迟配置
|
# TTS音频发送延迟配置
|
||||||
# tts_audio_send_delay: 控制音频包发送间隔
|
# tts_audio_send_delay: 控制音频包发送间隔
|
||||||
|
|||||||
@@ -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}")
|
||||||
@@ -7,6 +7,7 @@ from core.handle.textHandler.listenMessageHandler import ListenTextMessageHandle
|
|||||||
from core.handle.textHandler.mcpMessageHandler import McpTextMessageHandler
|
from core.handle.textHandler.mcpMessageHandler import McpTextMessageHandler
|
||||||
from core.handle.textMessageHandler import TextMessageHandler
|
from core.handle.textMessageHandler import TextMessageHandler
|
||||||
from core.handle.textHandler.serverMessageHandler import ServerTextMessageHandler
|
from core.handle.textHandler.serverMessageHandler import ServerTextMessageHandler
|
||||||
|
from core.handle.textHandler.pingMessageHandler import PingMessageHandler
|
||||||
|
|
||||||
TAG = __name__
|
TAG = __name__
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ class TextMessageHandlerRegistry:
|
|||||||
IotTextMessageHandler(),
|
IotTextMessageHandler(),
|
||||||
McpTextMessageHandler(),
|
McpTextMessageHandler(),
|
||||||
ServerTextMessageHandler(),
|
ServerTextMessageHandler(),
|
||||||
|
PingMessageHandler(),
|
||||||
]
|
]
|
||||||
|
|
||||||
for handler in handlers:
|
for handler in handlers:
|
||||||
|
|||||||
@@ -9,3 +9,4 @@ class TextMessageType(Enum):
|
|||||||
IOT = "iot"
|
IOT = "iot"
|
||||||
MCP = "mcp"
|
MCP = "mcp"
|
||||||
SERVER = "server"
|
SERVER = "server"
|
||||||
|
PING = "ping"
|
||||||
|
|||||||
Reference in New Issue
Block a user