This commit is contained in:
2025-12-09 20:35:39 +09:00
parent 792db74014
commit a6b3c54534
2 changed files with 75 additions and 12 deletions

View File

@@ -1138,7 +1138,11 @@ async def client_websocket_endpoint(websocket: WebSocket, room_id: str, password
@app.websocket("/ws/admin/{session_id}") @app.websocket("/ws/admin/{session_id}")
async def admin_websocket_endpoint(websocket: WebSocket, session_id: str): async def admin_websocket_endpoint(websocket: WebSocket, session_id: str):
"""WebSocket для администраторов (просмотр и управление)""" """WebSocket для администраторов (просмотр и управление)"""
global admin_sessions
if not AdminAuth.verify_session(session_id): if not AdminAuth.verify_session(session_id):
print(f"[WebSocket] Admin connection REJECTED: session_id={session_id} not found in admin_sessions")
print(f"[WebSocket] Available sessions: {list(admin_sessions.keys()) if admin_sessions else 'None'}")
await websocket.close(code=1008) await websocket.close(code=1008)
return return

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Скрипт для отправки тестового JPEG-кадра на сервер. Скрипт для отправки тестового JPEG-кадра на сервер.
Помогает проверить, работает ли VideoProcessor без мобильного приложения. Автоматически создает комнату и отправляет видеокадры через WebSocket.
""" """
import asyncio import asyncio
@@ -10,18 +10,77 @@ import json
import sys import sys
import cv2 import cv2
import numpy as np import numpy as np
import requests
from pathlib import Path from pathlib import Path
from dotenv import load_dotenv
import os
# Загружаем переменные окружения из .env
load_dotenv()
# Параметры подключения # Параметры подключения
HOST = "192.168.0.112" # Измените на ваш PUBLIC_HOST из .env HOST = os.getenv("PUBLIC_HOST", "192.168.0.112")
PORT = 8000 PORT = int(os.getenv("PORT", 8000))
ROOM_ID = "AtR2yGhr8QM" # Измените на ID комнаты FRAME_FILE = "test_frame.jpg"
PASSWORD = "1" # Измените на пароль комнаты FRAMES_TO_SEND = 300 # 10 сек при 30 FPS
FRAME_FILE = "test_frame.jpg" # Путь к тестовому JPEG-файлу
# Учетные данные админа (из server.py)
ADMIN_USERNAME = "admin"
ADMIN_PASSWORD = "admin123"
async def send_frames(): async def send_frames():
"""Подключиться к WebSocket и отправить кадры""" """Подключиться к WebSocket и отправить кадры"""
uri = f"ws://{HOST}:{PORT}/ws/client/{ROOM_ID}/{PASSWORD}"
# 0. Логинимся как админ чтобы получить сессию
print(f"[Test] Logging in as admin...")
session = requests.Session()
try:
login_response = session.post(
f"http://{HOST}:{PORT}/login",
data={
"username": ADMIN_USERNAME,
"password": ADMIN_PASSWORD
}
)
if login_response.status_code != 200:
print(f"[Test] ❌ Failed to login: {login_response.status_code}")
print(f"[Test] Response: {login_response.text}")
return
print(f"[Test] ✓ Admin logged in")
except Exception as e:
print(f"[Test] ❌ Error during login: {e}")
return
# 1. Создаём новую комнату на сервере
print(f"[Test] Creating room on {HOST}:{PORT}...")
try:
response = session.post(
f"http://{HOST}:{PORT}/api/create-room",
data={
"name": "Test Room",
"password": "testpass",
"max_connections": "10"
}
)
if response.status_code != 200:
print(f"[Test] ❌ Failed to create room: {response.status_code}")
print(f"[Test] Response: {response.text}")
return
room_data = response.json()
if not room_data.get("success"):
print(f"[Test] ❌ Room creation failed: {room_data.get('error')}")
return
room_id = room_data.get("room", {}).get("id")
password = room_data.get("room", {}).get("password", "testpass")
print(f"[Test] ✓ Room created: {room_id}")
except Exception as e:
print(f"[Test] ❌ Error creating room: {e}")
return
# 2. Подключаемся к WebSocket с этой комнатой
uri = f"ws://{HOST}:{PORT}/ws/client/{room_id}/{password}"
print(f"[Test] Connecting to: {uri}") print(f"[Test] Connecting to: {uri}")
try: try:
@@ -43,15 +102,15 @@ async def send_frames():
print(f"[Test] Frame size: {len(frame_data)} bytes") print(f"[Test] Frame size: {len(frame_data)} bytes")
# Отправляем кадры в цикле (30 FPS, 10 секунд) # Отправляем кадры в цикле (30 FPS, ~10 секунд)
print(f"[Test] Sending frames (30 FPS for 10 seconds)...") print(f"[Test] Sending frames (30 FPS for ~{FRAMES_TO_SEND // 30} seconds)...")
for i in range(300): # 10 sec * 30 FPS for i in range(FRAMES_TO_SEND): # ~10 sec * 30 FPS
await ws.send(frame_data) await ws.send(frame_data)
if (i + 1) % 30 == 0: if (i + 1) % 30 == 0:
print(f"[Test] ✓ Sent {i + 1} frames") print(f"[Test] ✓ Sent {i + 1} frames")
await asyncio.sleep(1 / 30) # ~30 FPS await asyncio.sleep(1 / 30) # ~30 FPS
print(f"[Test] ✓ Done! Sent 300 frames") print(f"[Test] ✓ Done! Sent {FRAMES_TO_SEND} frames")
await asyncio.sleep(2) # Пауза перед отключением await asyncio.sleep(2) # Пауза перед отключением
except asyncio.TimeoutError: except asyncio.TimeoutError:
@@ -88,7 +147,7 @@ if __name__ == "__main__":
print("=" * 60) print("=" * 60)
print("WebSocket Frame Sender Test") print("WebSocket Frame Sender Test")
print("=" * 60) print("=" * 60)
print(f"Target: ws://{HOST}:{PORT}/ws/client/{ROOM_ID}/{PASSWORD}") print(f"Server: http://{HOST}:{PORT}")
print() print()
try: try: