# -*- coding: utf-8 -*- r'''端到端验证局域网直连路径。 结论已经很清楚了: 局域网 118 ms vs 公网 1215 ms —— 快 10 倍 瓶颈是这条网络到 Cloudflare 的 4G 上行(裸 RTT 就 1.4 秒), Cloudflare 那一侧没得优化。 所以真正要保证的是**局域网这条路能用**。 这个脚本起一个真实被控端,走 192.168.2.x 直连,量一下握手耗时。 ''' from __future__ import annotations import json import socket import subprocess import sys import time from pathlib import Path ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote") PORT = 8875 CODE = "246810" def talk(payload: dict, timeout: float = 12.0) -> dict: sock = socket.create_connection(("127.0.0.1", PORT), timeout=timeout) sock.settimeout(timeout) sock.sendall((json.dumps(payload, ensure_ascii=False) + "\n").encode()) raw = b"" while b"\n" not in raw: chunk = sock.recv(65536) if not chunk: break raw += chunk sock.close() return json.loads(raw.split(b"\n")[0].decode("utf-8")) def lan_ip() -> str: try: probe = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) probe.connect(("8.8.8.8", 80)) addr = probe.getsockname()[0] probe.close() return addr except OSError: return "192.168.2.64" def main() -> int: env = dict(__import__("os").environ) env["YKXMZ_DATA"] = str(ROOT / "_build" / "_lantest_data") Path(env["YKXMZ_DATA"]).mkdir(parents=True, exist_ok=True) print(" 启动被控端(端口 %d,配对码 %s)" % (PORT, CODE)) proc = subprocess.Popen( [sys.executable, str(ROOT / "windows" / "run_agent.py"), "--port", str(PORT), "--code", CODE, "--silent"], cwd=str(ROOT), env=env, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) passed = failed = 0 def check(name, ok, detail=""): nonlocal passed, failed if ok: passed += 1 print(" [PASS] " + name) else: failed += 1 print(" [FAIL] " + name + " " + str(detail)) try: time.sleep(7) ip = lan_ip() print(" 本机局域网地址: %s" % ip) print() # 1. 本机回环 print(" 一、回环路径") t = time.perf_counter() reply = talk({"cmd": "pair", "deviceId": "lantest", "deviceName": "测试手表", "code": CODE}) loop_ms = (time.perf_counter() - t) * 1000 check("回环配对成功", reply.get("ok") is True, str(reply)[:90]) token = reply.get("token", "") print(" 握手 %.0f ms" % loop_ms) # 2. 局域网地址(真实用户路径) print() print(" 二、局域网地址 %s(手表实际走这条)" % ip) sock = socket.create_connection((ip, PORT), timeout=10) sock.settimeout(10) t = time.perf_counter() sock.sendall((json.dumps({"cmd": "auth", "deviceId": "lantest", "token": token}, ensure_ascii=False) + "\n").encode()) raw = b"" while b"\n" not in raw: raw += sock.recv(65536) lan_ms = (time.perf_counter() - t) * 1000 auth = json.loads(raw.split(b"\n")[0].decode("utf-8")) check("局域网认证成功", auth.get("ok") is True, str(auth)[:90]) print(" 认证 %.0f ms" % lan_ms) # 3. 功能列表 t = time.perf_counter() sock.sendall((json.dumps({"cmd": "feature_list"}, ensure_ascii=False) + "\n").encode()) raw = b"" while b"\n" not in raw: raw += sock.recv(262144) feat = json.loads(raw.split(b"\n")[0].decode("utf-8")) feat_ms = (time.perf_counter() - t) * 1000 features = feat.get("features", []) check("功能列表拿到 %d 项" % len(features), len(features) > 100) print(" 功能列表 %.0f ms" % feat_ms) sock.close() print() print(" 三、结论") print(" 局域网往返 %.0f ms vs 公网 1215 ms" % lan_ms) print(" 局域网快 %.1f 倍" % (1215 / max(lan_ms, 1))) check("局域网明显快于公网", lan_ms < 300, "%.0f ms" % lan_ms) finally: proc.terminate() try: proc.wait(timeout=8) except subprocess.TimeoutExpired: proc.kill() print() print("=" * 52) print(" 通过 %d 项,失败 %d 项" % (passed, failed)) return 0 if failed == 0 else 1 if __name__ == "__main__": sys.exit(main())