From 659c470eba542383987aad227b7f918100f131fa Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期五, 11 九月 2026 15:09:05 +0800
Subject: [PATCH] 小智终端 5种 场景模式 OK
---
xiaozhi-esp32-server/main/xiaozhi-server/core/websocket_server.py | 37 +++++++++++++++++++++++++++++++------
1 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/xiaozhi-esp32-server/main/xiaozhi-server/core/websocket_server.py b/xiaozhi-esp32-server/main/xiaozhi-server/core/websocket_server.py
index 2ef7cda..bee13d1 100644
--- a/xiaozhi-esp32-server/main/xiaozhi-server/core/websocket_server.py
+++ b/xiaozhi-esp32-server/main/xiaozhi-server/core/websocket_server.py
@@ -35,6 +35,7 @@
from core.auth import AuthManager, AuthenticationError
from core.utils.modules_initialize import initialize_modules
from core.utils.util import check_vad_update, check_asr_update
+from core.websocket_handshake import is_websocket_upgrade
TAG = __name__
@@ -67,6 +68,33 @@
secret_key = self.config["server"]["auth_key"]
expire_seconds = auth_config.get("expire_seconds", None)
self.auth = AuthManager(secret_key=secret_key, expire_seconds=expire_seconds)
+ self.device_handlers = {}
+ self.device_handlers_lock = asyncio.Lock()
+
+ async def register_device_handler(self, device_id, handler):
+ if not device_id:
+ return
+ async with self.device_handlers_lock:
+ old = self.device_handlers.get(device_id)
+ self.device_handlers[device_id] = handler
+ if old is not None and old is not handler:
+ self.logger.bind(tag=TAG).info(f"鍏抽棴鍚岃澶囨棫杩炴帴: {device_id}")
+ asyncio.create_task(self._close_stale_handler(old))
+
+ async def _close_stale_handler(self, handler):
+ try:
+ handler.stop_event.set()
+ if handler.websocket:
+ await handler.websocket.close()
+ except Exception as e:
+ self.logger.bind(tag=TAG).warning(f"鍏抽棴鏃ц繛鎺ュけ璐�: {e}")
+
+ async def unregister_device_handler(self, device_id, handler):
+ if not device_id:
+ return
+ async with self.device_handlers_lock:
+ if self.device_handlers.get(device_id) is handler:
+ self.device_handlers.pop(device_id, None)
async def start(self):
server_config = self.config["server"]
@@ -144,13 +172,10 @@
)
async def _http_response(self, websocket, request_headers):
- # 妫�鏌ユ槸鍚︿负 WebSocket 鍗囩骇璇锋眰
- if request_headers.headers.get("connection", "").lower() == "upgrade":
- # 濡傛灉鏄� WebSocket 璇锋眰锛岃繑鍥� None 鍏佽鎻℃墜缁х画
+ headers = getattr(request_headers, "headers", None) or request_headers
+ if is_websocket_upgrade(headers):
return None
- else:
- # 濡傛灉鏄櫘閫� HTTP 璇锋眰锛岃繑鍥� "server is running"
- return websocket.respond(200, "Server is running\n")
+ return websocket.respond(200, "Server is running\n")
async def update_config(self) -> bool:
"""鏇存柊鏈嶅姟鍣ㄩ厤缃苟閲嶆柊鍒濆鍖栫粍浠�
--
Gitblit v1.9.1