From 00044b91e15d4baa0a6df61f357d4b0c04c78865 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Tue, 26 May 2026 10:51:54 +0300 Subject: [PATCH] =?UTF-8?q?fix(mock):=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=87=D0=BD=D1=8B=D0=B5=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=D0=B6=D0=BA=D0=B8=20+=20=D0=BD=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D1=80=D0=B8=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ATZ: ~2.5 сек (как реальный ELM) - ATSP0: SEARCHING... + 1.8 сек - OBD/PID: 0.2-0.5 сек - ±30% случайный разброс для всех задержек - Убрано авто-приветствие при подключении (реальный ELM не шлёт) --- tools/mock_elm327.py | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/tools/mock_elm327.py b/tools/mock_elm327.py index 97aa689..bc0f9e8 100644 --- a/tools/mock_elm327.py +++ b/tools/mock_elm327.py @@ -57,10 +57,7 @@ class ElmHandler(socketserver.StreamRequestHandler): def handle(self): print(f"\n🔌 Подключение: {self.client_address}") - # Отправляем приветствие - self.wfile.write(b"\r\nELM327 v1.5\r\n>") - self.wfile.flush() - + # Реальный ELM327 НЕ шлёт приветствие при BT-подключении — ждёт ATZ buf = b"" while True: try: @@ -90,37 +87,49 @@ class ElmHandler(socketserver.StreamRequestHandler): print(f"🔌 Отключение: {self.client_address}") def _process(self, cmd: str) -> bytes: - """Обрабатывает AT/OBD команду, возвращает ответ.""" + """Обрабатывает AT/OBD команду, возвращает ответ с реалистичными задержками.""" print(f" 📥 {cmd}") # ── AT команды ─────────────────────── if cmd == "ATZ": - resp = b"\r\nELM327 v1.5\r\n>" + self._sleep(2.5) # реальный ELM перезагружается ~3 сек + resp = b"\r\n\r\nELM327 v1.5\r\n>" + + elif cmd == "ATSP0": + # Имитация SEARCHING как у реального ELM + self.wfile.write(b"SEARCHING...\r\n") + self.wfile.flush() + self._sleep(1.8) + resp = b"AUTO, ISO 15765-4 (CAN 11/500)\r\n>" + elif cmd.startswith("ATE"): resp = b"OK\r\n>" elif cmd.startswith("ATL"): resp = b"OK\r\n>" - elif cmd == "ATSP0": - resp = b"OK\r\n>" elif cmd.startswith("ATH"): resp = b"OK\r\n>" elif cmd == "ATI": resp = b"ELM327 v1.5\r\n>" + elif cmd == "ATDP": resp = b"AUTO, ISO 15765-4 (CAN 11/500)\r\n>" # ── OBD запросы ───────────────────── - elif cmd == "0902": # VIN + elif cmd == "0902": # VIN — ответ длинный, пауза побольше + self._sleep(0.5) resp = self._vin_response() elif cmd == "03": # Stored DTC + self._sleep(0.3) resp = (FAKE_DTC[0] + "\r\n" + FAKE_DTC[1] + "\r\n>").encode() elif cmd == "07": # Pending DTC + self._sleep(0.3) resp = (FAKE_NO_DTC + "\r\n>").encode() elif cmd.startswith("01"): # PID запрос pid = cmd[2:4] + self._sleep(0.2) if pid in FAKE_PIDS: resp = (FAKE_PIDS[pid] + "\r\n>").encode() else: @@ -132,6 +141,11 @@ class ElmHandler(socketserver.StreamRequestHandler): print(f" 📤 {resp.decode('utf-8', errors='ignore').strip()[:60]}") return resp + def _sleep(self, seconds: float): + """Пауза с случайным разбросом ±30%, как у реального железа.""" + import random + time.sleep(seconds * random.uniform(0.7, 1.3)) + def _vin_response(self) -> bytes: """Формирует ответ VIN (mode 09 PID 02).""" vin_hex = "".join(f"{ord(c):02X}" for c in FAKE_VIN)