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)