"""Эндпоинт /api/v1/raw-obd — приём сырых OBD-ответов от тонкого клиента. Формат входящих данных: {"raw": "41 05 5A", "timestamp": 1716652800000} Сервер логирует, складывает в очередь, и по готовности парсит + отправляет в LLM. """ import json import logging import threading from collections import deque from datetime import datetime, timezone logger = logging.getLogger("elmer.raw") # Буфер сырых сообщений на сессию (в production — Redis очередь) raw_buffer: deque[dict] = deque() buffer_lock = threading.Lock() def register(app): """Регистрирует эндпоинт на Flask-приложении.""" @app.route("/api/v1/raw-obd", methods=["POST"]) def raw_obd(): from flask import request, jsonify data = request.get_json(silent=True) if not data or "raw" not in data: return jsonify({"error": "missing 'raw' field"}), 400 raw = data["raw"].strip() ts = data.get("timestamp", int(datetime.now(timezone.utc).timestamp() * 1000)) # Логируем в консоль logger.info(f"[RAW] {raw}") # Складываем в буфер with buffer_lock: raw_buffer.append({ "raw": raw, "timestamp": ts, }) return jsonify({ "status": "ok", "received": raw, "buffer_size": len(raw_buffer), }) return app