fix(mock): реалистичные задержки + нет приветствия при коннекте
- ATZ: ~2.5 сек (как реальный ELM) - ATSP0: SEARCHING... + 1.8 сек - OBD/PID: 0.2-0.5 сек - ±30% случайный разброс для всех задержек - Убрано авто-приветствие при подключении (реальный ELM не шлёт)
This commit is contained in:
+23
-9
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user