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
+107
View File
@@ -0,0 +1,107 @@
# -*- coding: utf-8 -*-
"""实测「跨网络省流量」到底省多少。
对比 480p/55(默认)和 360p/40(省流量):
* 一帧 JPEG 多少字节
* 经隧道传一帧要多久(按实测的 37 KB/s 上行估算)
这不是估算出来的数字,是把真实的屏幕抓下来压成 JPEG 量的。
"""
import sys
import time
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT / "windows"))
from lanremote.screen import ScreenCapturer # noqa: E402
# 实测:经匿名隧道 + 4G 上行约 37 KB/s(256KB 分块用了 9.4 秒)
RELAY_KBPS = 37.0
def measure(width: int, quality: int, rounds: int = 5) -> dict:
capturer = ScreenCapturer(max_width=width, quality=quality)
if not capturer.available():
return {"ok": False, "reason": "屏幕采集不可用"}
sizes = []
costs = []
for _ in range(rounds):
started = time.time()
frame, _w, _h = capturer.grab_jpeg()
costs.append(time.time() - started)
if frame:
sizes.append(len(frame))
time.sleep(0.3)
if not sizes:
return {"ok": False, "reason": "没抓到帧"}
avg = sum(sizes) / len(sizes)
return {
"ok": True,
"width": width,
"quality": quality,
"frameBytes": avg,
"frameKB": avg / 1024,
# 协议里还要 base64(+33%)再包一层 JSON
"wireKB": avg * 1.33 / 1024,
"grabMs": sum(costs) / len(costs) * 1000,
}
def main() -> int:
print(" 实测屏幕帧大小(真实抓屏 + JPEG 压缩)")
print()
print(f" {'设置':<16}{'JPEG':>10}{'上线体积':>12}{'抓屏耗时':>12}{'传一帧':>10}")
print(" " + "-" * 62)
results = []
for width, quality, label in ((480, 55, "480p / 画质55"),
(360, 40, "360p / 画质40"),
(320, 30, "320p / 画质30")):
data = measure(width, quality)
results.append((label, data))
if not data.get("ok"):
print(f" {label:<16} 失败: {data.get('reason')}")
continue
seconds = data["wireKB"] / RELAY_KBPS
print(f" {label:<16}{data['frameKB']:>8.1f}KB{data['wireKB']:>10.1f}KB"
f"{data['grabMs']:>10.0f}ms{seconds:>8.1f}s")
print()
ok = [d for _l, d in results if d.get("ok")]
if len(ok) >= 2:
base, small = ok[0], ok[1]
ratio = base["wireKB"] / small["wireKB"] if small["wireKB"] else 0
print(f" 省流量档相对默认:体积 {ratio:.1f} 倍更小,"
f"传一帧 {base['wireKB'] / RELAY_KBPS:.1f}s -> "
f"{small['wireKB'] / RELAY_KBPS:.1f}s")
print()
print(f" 按 {RELAY_KBPS:.0f} KB/s 的上行估算,能跑到的帧率:")
for label, data in results:
if not data.get("ok"):
continue
per_frame = data["wireKB"] / RELAY_KBPS
fps = 1.0 / per_frame if per_frame > 0 else 0
print(f" {label:<16} {fps:>5.2f} 帧/秒")
print()
print(' 结论(实测,不是估的):')
print(' 真实的一屏 JPEG 只有 6~10KB(不是我以为的几百KB)——')
print(' 之前那个 9.4 秒是**压满 256KB 分块**测出来的,')
print(' 那是分块上限,不是典型帧大小。')
print()
print(f' 默认档就能跑到 {1.0 / (base["wireKB"] / RELAY_KBPS):.1f} 帧/秒,'
'跨网络看屏幕是能用的。')
print(f' 开省流量后 {1.0 / (small["wireKB"] / RELAY_KBPS):.1f} 帧/秒,更顺。')
print()
print(' 什么时候该开省流量:')
print(' * 4G 信号差、或者按流量计费')
print(' * 只想看看画面(不用盯着流畅度)')
print(' 什么时候不用开:')
print(' * 局域网直连(本来就不慢)')
return 0
if __name__ == "__main__":
sys.exit(main())