|
|
import asyncio
|
|
|
from aiohttp import web
|
|
|
from config.logger import setup_logging
|
|
|
from core.api.ota_handler import OTAHandler
|
|
|
from core.api.vision_handler import VisionHandler
|
|
|
|
|
|
TAG = __name__
|
|
|
|
|
|
|
|
|
class SimpleHttpServer:
|
|
|
def __init__(self, config: dict):
|
|
|
self.config = config
|
|
|
self.logger = setup_logging()
|
|
|
self.ota_handler = OTAHandler(config)
|
|
|
self.vision_handler = VisionHandler(config)
|
|
|
|
|
|
def _get_websocket_url(self, local_ip: str, port: int) -> str:
|
|
|
"""获取websocket地址
|
|
|
|
|
|
Args:
|
|
|
local_ip: 本地IP地址
|
|
|
port: 端口号
|
|
|
|
|
|
Returns:
|
|
|
str: websocket地址
|
|
|
"""
|
|
|
server_config = self.config["server"]
|
|
|
websocket_config = server_config.get("websocket")
|
|
|
|
|
|
if websocket_config and "你" not in websocket_config:
|
|
|
return websocket_config
|
|
|
else:
|
|
|
return f"ws://{local_ip}:{port}/xiaozhi/v1/"
|
|
|
|
|
|
async def start(self):
|
|
|
server_config = self.config["server"]
|
|
|
host = server_config.get("ip", "0.0.0.0")
|
|
|
port = int(server_config.get("http_port", 8003))
|
|
|
|
|
|
if port:
|
|
|
app = web.Application()
|
|
|
|
|
|
read_config_from_api = server_config.get("read_config_from_api", False)
|
|
|
|
|
|
if not read_config_from_api:
|
|
|
# 如果没有开启智控台,只是单模块运行,就需要再添加简单OTA接口,用于下发websocket接口
|
|
|
app.add_routes(
|
|
|
[
|
|
|
web.get("/xiaozhi/ota/", self.ota_handler.handle_get),
|
|
|
web.post("/xiaozhi/ota/", self.ota_handler.handle_post),
|
|
|
web.options("/xiaozhi/ota/", self.ota_handler.handle_post),
|
|
|
]
|
|
|
)
|
|
|
# 添加路由
|
|
|
app.add_routes(
|
|
|
[
|
|
|
web.get("/mcp/vision/explain", self.vision_handler.handle_get),
|
|
|
web.post("/mcp/vision/explain", self.vision_handler.handle_post),
|
|
|
web.options("/mcp/vision/explain", self.vision_handler.handle_post),
|
|
|
]
|
|
|
)
|
|
|
|
|
|
# 运行服务
|
|
|
runner = web.AppRunner(app)
|
|
|
await runner.setup()
|
|
|
site = web.TCPSite(runner, host, port)
|
|
|
await site.start()
|
|
|
|
|
|
# 保持服务运行
|
|
|
while True:
|
|
|
await asyncio.sleep(3600) # 每隔 1 小时检查一次
|