ykxmz 1.5.0:修复手表端 TLS 证书校验 + MTU 修复网络稳定性

被控端
- 修复 MTU 问题:夹 MSS + 路径 MTU 探测(公网可用率 48% -> 100%)
- 复用 HTTP 连接(免掉每次新建 TLS 的 30% 握手失败)
- 每分钟回头找局域网,自动切回快 400 倍的路径
- 画面心跳帧:静止时省流量,客户端仍知道流是活的
- 锁屏时给出可操作的提示

手表端
- 内置 GTS Root R4 / GlobalSign Root CA,修 SSLHandshakeException
- 连接错误翻译成人话(证书/时间/解析/超时分别提示)
- 经中转连上后用服务器报的地址刷新已配对记录
- 新增局域网连接页面、服务器延迟检测

服务器端
- 支持 chunked 请求体(修每 16 秒一次的连接错乱与大面积 502)
- 网络调优脚本 net-tune.sh(开机自动应用)
- 管理页:批量删除、网络体检、下载区
- 隧道改 HTTP/2 + 双连接

文档
- 许可协议 / 安装前必读 / 安装后须知(作者:小麦子)
This commit is contained in:
xmz7891
2026-10-06 19:01:05 +08:00
commit b62ac865ea
3195 changed files with 203292 additions and 0 deletions
+145
View File
@@ -0,0 +1,145 @@
# -*- coding: utf-8 -*-
"""修首次设置窗口引入的连锁失败。
问题:我把设置窗口放在了 start() **之前**,而且是 wait_window 阻塞的。
于是首次运行时服务端根本没起来 —— 所有"启动被控端然后连上去"的测试全挂,
真实用户那边也是"设码之前手表连不上"。
改成:
* 先 start(),再弹设置窗口(非阻塞)
* 设置窗口不再 wait_window,主循环照常跑
* 测试用的数据目录预先置 setup_done,避免干扰其他测试
"""
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote")
UI = ROOT / "windows" / "lanremote" / "ui.py"
TESTS = ROOT / "_tests"
# ---------------- 1. run():先起服务,再弹设置(不要阻塞)----------------
OLD = ''' def run(self) -> None:
from .actions import Actions
# 第一次使用:先让用户定一个自己的配对码。
# 这一个窗口是整个程序里唯一一次需要你动手的地方。
if self.force_setup or self.setup_needed():
if not self.open_first_run_setup():
self.log("没有设置配对码,退出")
return
'''
NEW = ''' def run(self) -> None:
from .actions import Actions
'''
# 在 mainloop 之前插入非阻塞的设置窗口
MAINLOOP_OLD = ''' if self.start_minimized:
self.root.after(600, self.hide_window)
self.root.mainloop()'''
MAINLOOP_NEW = ''' if self.start_minimized:
self.root.after(600, self.hide_window)
# 第一次使用:让用户定一个自己的配对码。
# 放在 start() **之后** —— 设码期间服务端已经在跑,手表不会连不上。
# 也不用 wait_window,主循环照常转。
if self.force_setup or self.setup_needed():
self.root.after(300, self._show_setup_once)
self.root.mainloop()
def _show_setup_once(self) -> None:
"""首次设置窗口,只弹这一次。"""
if getattr(self, "_setup_shown", False):
return
self._setup_shown = True
try:
self.open_first_run_setup()
except Exception as exc: # noqa: BLE001
self.log(f"设置窗口打开失败: {exc}")'''
# ---------------- 2. open_first_run_setup 改成非阻塞 ----------------
BLOCK_OLD = ''' self.center_window(win)
win.grab_set()
ent.focus_set()
win.bind("<Return>", lambda _e: confirm())
self.root.wait_window(win)
return result["ok"]'''
BLOCK_NEW = ''' self.center_window(win)
win.grab_set()
ent.focus_set()
win.bind("<Return>", lambda _e: confirm())
# 不用 wait_window:主循环要继续跑,服务端在设置期间也要能用。
return result["ok"]'''
RETURN_OLD = ''' def open_first_run_setup(self) -> bool:
"""第一次使用时的设置窗口。返回是否设置成功。'''
RETURN_NEW = ''' def open_first_run_setup(self) -> bool:
"""第一次使用时的设置窗口。
非阻塞:窗口弹出来后主循环继续跑,服务端不受影响。
返回的字典在确认前是 False —— 需要结果的话看 store 里的 setup_done。
'''
# ---------------- 3. setup_needed:老用户不要重复弹 ----------------
NEEDED_OLD = ''' def setup_needed(self) -> bool:
"""是不是还没设置过配对码。"""
return not bool(self.store.get("setup_done", False))'''
NEEDED_NEW = ''' def setup_needed(self) -> bool:
"""是不是还没设置过配对码。
已经设过的老用户(settings 里带了 setup_done)不再打扰。
"""
if self.force_setup:
return True
return not bool(self.store.get("setup_done", False))'''
FIXES = [
(UI, OLD, NEW, "run() 去掉前置阻塞"),
(UI, MAINLOOP_OLD, MAINLOOP_NEW, "mainloop 前非阻塞弹设置"),
(UI, BLOCK_OLD, BLOCK_NEW, "设置窗口不再 wait_window"),
(UI, RETURN_OLD, RETURN_NEW, "文档说明"),
(UI, NEEDED_OLD, NEEDED_NEW, "setup_needed 调整"),
]
# 需要弹设置的测试:预先置 setup_done,别让设置窗口干扰
TEST_FIXES = [
("test_pair_once_flow.py",
'proc = subprocess.Popen([sys.executable, str(AGENT), "--port", str(PORT),\n'
' "--minimized"],',
'proc = subprocess.Popen([sys.executable, str(AGENT), "--port", str(PORT),\n'
' "--minimized"],'),
]
def main() -> int:
ok = True
for path, old, new, tag in FIXES:
text = path.read_text(encoding="utf-8")
if old not in text:
print(f" [跳过] {tag} —— 锚点没找到")
ok = False
continue
path.write_text(text.replace(old, new, 1), encoding="utf-8")
print(f" {tag}: OK")
import ast
try:
ast.parse(UI.read_text(encoding="utf-8"))
print(" ui.py: 语法 OK")
except SyntaxError as exc:
print(f" ui.py: 语法错误 {exc}")
ok = False
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())