mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 14:50:45 +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,181 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""安卓改造第二步:清残余 + 实现"输入配对码连接"。
|
||||
|
||||
问题:
|
||||
* requestPcSelfCheck() 还在用局域网广播(Discovery)
|
||||
* onConnectClicked() 还在读 hostInput/portInput(那两个输入框已经删了)
|
||||
* quickConnect() 还在往已删的输入框里写
|
||||
* 上一个补丁里引用了 promptPairingCode(),但还没实现
|
||||
|
||||
做完之后,手表的连接方式只有一种:
|
||||
经中转 + 配对码。不用管 IP、端口、局域网。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
MAIN = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\android\src"
|
||||
r"\com\lanremote\watch\MainActivity.java")
|
||||
|
||||
|
||||
def drop_method(text: str, header_pattern: str) -> tuple:
|
||||
"""按花括号配平删掉一个方法(连前面的注释行)。"""
|
||||
import re
|
||||
lines = text.splitlines(keepends=True)
|
||||
start = None
|
||||
for index, line in enumerate(lines):
|
||||
if re.search(header_pattern, line):
|
||||
start = index
|
||||
break
|
||||
if start is None:
|
||||
return text, False
|
||||
depth = 0
|
||||
seen = False
|
||||
end = None
|
||||
for index in range(start, len(lines)):
|
||||
depth += lines[index].count("{")
|
||||
if "{" in lines[index]:
|
||||
seen = True
|
||||
depth -= lines[index].count("}")
|
||||
if seen and depth <= 0:
|
||||
end = index
|
||||
break
|
||||
if end is None:
|
||||
return text, False
|
||||
while start > 0 and lines[start - 1].strip().startswith("//"):
|
||||
start -= 1
|
||||
while end + 1 < len(lines) and lines[end + 1].strip() == "":
|
||||
end += 1
|
||||
del lines[start:end + 1]
|
||||
return "".join(lines), True
|
||||
|
||||
|
||||
ON_CONNECT_OLD = ''' private void onConnectClicked() {
|
||||
String host = hostInput.getText().toString().trim();
|
||||
String portText = portInput.getText().toString().trim();
|
||||
String code = codeInput.getText().toString().trim();
|
||||
if (host.isEmpty()) {
|
||||
setStatus("请先填写电脑 IP", C_WARN);
|
||||
return;
|
||||
}
|
||||
int port;
|
||||
try {
|
||||
port = portText.isEmpty() ? RemoteClient.DEFAULT_PORT : Integer.parseInt(portText);
|
||||
} catch (NumberFormatException e) {
|
||||
setStatus("端口必须是数字", C_WARN);
|
||||
return;
|
||||
}
|
||||
if (code.isEmpty()) {
|
||||
setStatus("请填写电脑上显示的配对码", C_WARN);
|
||||
return;
|
||||
}
|
||||
connect(host, port, code, null, DeviceStore.deviceKey(host, port, store.deviceId()));
|
||||
}
|
||||
|
||||
private void quickConnect(String host, int port, String token, String key) {
|
||||
hostInput.setText(host);
|
||||
portInput.setText(String.valueOf(port));
|
||||
connect(host, port, null, token, key);
|
||||
}'''
|
||||
|
||||
ON_CONNECT_NEW = ''' /**
|
||||
* 让用户输 6 位配对码,直接连上那台电脑。
|
||||
*
|
||||
* 现在只有这一种连接方式了 —— 统一经中转。
|
||||
* 不用管电脑 IP、端口、在不在同一个局域网。
|
||||
*/
|
||||
private void promptPairingCode() {
|
||||
final EditText input = new EditText(this);
|
||||
input.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
input.setHint("6 位数字");
|
||||
input.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
|
||||
input.setGravity(Gravity.CENTER);
|
||||
input.setPadding(dp(12), dp(14), dp(12), dp(14));
|
||||
|
||||
String last = savedPairingCode();
|
||||
if (last != null && !last.isEmpty()) {
|
||||
input.setText(last);
|
||||
input.setSelection(input.getText().length());
|
||||
}
|
||||
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle("输入配对码")
|
||||
.setMessage("填电脑上显示的 6 位配对码\\n"
|
||||
+ "(中转地址:" + relayUrl() + ")")
|
||||
.setView(input)
|
||||
.setPositiveButton("连接", new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
connectByCode(input.getText().toString().trim());
|
||||
}
|
||||
})
|
||||
.setNegativeButton("取消", null)
|
||||
.show();
|
||||
}
|
||||
|
||||
/** 拿着配对码经中转连过去。 */
|
||||
private void connectByCode(String code) {
|
||||
if (code == null || code.length() != 6 || !code.matches("\\\\d{6}")) {
|
||||
setStatus("配对码是 6 位数字", C_WARN);
|
||||
toast("配对码要 6 位数字");
|
||||
return;
|
||||
}
|
||||
String relay = relayUrl();
|
||||
if (relay.isEmpty()) {
|
||||
setStatus("还没设置中转地址", C_WARN);
|
||||
toast("请先在「中转设置」里填服务器地址");
|
||||
promptRelayUrl();
|
||||
return;
|
||||
}
|
||||
appendLog("用配对码连接:" + code);
|
||||
// host 传中转地址:经中转时真正连的是中转,host 只用于区分已配对的设备
|
||||
connect(relay, 0, code, null, "code:" + code);
|
||||
}
|
||||
|
||||
private void quickConnect(String host, int port, String token, String key) {
|
||||
// 不再往输入框里写东西(那两个框已经删了)——
|
||||
// 直接连。host/port 对中转路径没有意义,
|
||||
// 但 key 仍然用来区分"哪台已配对的电脑"。
|
||||
connect(host, port, null, token, key);
|
||||
}'''
|
||||
|
||||
|
||||
def main() -> int:
|
||||
text = MAIN.read_text(encoding="utf-8")
|
||||
ok = True
|
||||
|
||||
# 1. 替换 onConnectClicked + quickConnect
|
||||
if ON_CONNECT_OLD in text:
|
||||
text = text.replace(ON_CONNECT_OLD, ON_CONNECT_NEW, 1)
|
||||
print(" 连接入口重写(配对码 -> 中转)")
|
||||
else:
|
||||
print(" [失败] 找不到 onConnectClicked/quickConnect 段")
|
||||
ok = False
|
||||
|
||||
# 2. 删掉局域网广播自检
|
||||
text, done = drop_method(text, r"private void requestPcSelfCheck\(\)")
|
||||
print(f" {'删掉' if done else '[跳过]'} requestPcSelfCheck()")
|
||||
|
||||
# 3. 删掉 codeInput 相关(老的手输配对码框,已被弹窗取代)
|
||||
text, done = drop_method(text, r"private EditText codeInput")
|
||||
|
||||
MAIN.write_text(text, encoding="utf-8", newline="\n")
|
||||
|
||||
# 4. 残余检查
|
||||
print()
|
||||
print(" 残余引用:")
|
||||
for name in ("openDiagPanel", "toggleManual", "btnManual", "foundBox",
|
||||
"discovering", "requestSelfCheck", "Discovery", "manualBox",
|
||||
"hostInput", "portInput", "requestPcSelfCheck"):
|
||||
count = text.count(name)
|
||||
if count:
|
||||
print(f" [{name}] 还有 {count} 处")
|
||||
ok = False
|
||||
if ok:
|
||||
print(" 没有残余 ✓")
|
||||
return 0 if ok else 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user