fix: mock reads byte-by-byte, handles any line endings

This commit is contained in:
Repinoid
2026-05-26 09:20:21 +04:00
parent 5c72e30db5
commit 6c60ef4a61
+22 -13
View File
@@ -58,24 +58,30 @@ class ElmHandler(socketserver.StreamRequestHandler):
print(f"\n🔌 Подключение: {self.client_address}")
# Отправляем приветствие
self.wfile.write(b"ELM327 v1.5\r\n>")
self.wfile.write(b"\r\nELM327 v1.5\r\n>")
self.wfile.flush()
buf = b""
while True:
try:
data = self.rfile.readline()
if not data:
# Читаем побайтово — принимает \r или \n как конец строки
ch = self.rfile.read(1)
if not ch:
break
cmd = data.decode("utf-8", errors="ignore").strip().upper()
if not cmd:
continue
if ch in (b'\n', b'\r'):
if buf:
cmd = buf.decode("utf-8", errors="ignore").strip().upper()
buf = b""
if cmd:
response = self._process(cmd)
if response:
self.wfile.write(response)
self.wfile.flush()
else:
buf += ch
response = self._process(cmd)
if response:
self.wfile.write(response)
self.wfile.flush()
except (ConnectionResetError, BrokenPipeError):
except (ConnectionResetError, BrokenPipeError, OSError):
break
except Exception as e:
print(f" ⚠️ Ошибка: {e}")
@@ -144,7 +150,10 @@ def main():
parser.add_argument("--host", default="0.0.0.0")
args = parser.parse_args()
server = socketserver.ThreadingTCPServer((args.host, args.port), ElmHandler)
class ReuseTCPServer(socketserver.ThreadingTCPServer):
allow_reuse_address = True
server = ReuseTCPServer((args.host, args.port), ElmHandler)
print(f"🚗 Mock ELM327 на {args.host}:{args.port}")
print(f" Подключиться: telnet localhost {args.port}")
print(f" Ctrl+C чтобы остановить")