mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 10:40:44 +00:00
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:
@@ -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())
|
||||
Reference in New Issue
Block a user