# -*- coding: utf-8 -*- r'''手表:过期 IP 给提示 + 跳过注定失败的直连尝试。 用户遇到的情况(截图): 首页「已配对的电脑」显示 DESKTOP-RN5I625 192.168.2.64:8765 但那台电脑早就换网段了(现在是 192.168.10.103)。 点一下 -> 先花 6 秒试直连(必然失败)-> 再走中转 40 秒 -> 用户以为卡死。 改两处: 1. refreshDeviceList:保存的 IP 如果和手表不在同一个网段, 按钮上直接标出来"(地址已过期)"。用户一眼就知道该重新搜。 2. quickConnect:如果保存的 IP 明显不同网段, **跳过直连**,直接走中转 —— 省掉那 6 秒白等。 中转连上后会报回电脑的最新局域网地址,记录也就自动刷新了。 ''' from __future__ import annotations import sys from pathlib import Path SRC = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote" r"\android\src\com\lanremote\watch\MainActivity.java") # ---------------------------------------------------------------- 1. 列表提示 OLD_LIST = """ Button button = bigButton(label + "\\n" + host + ":" + port, C_CARD, 14);""" NEW_LIST = """ // 保存的地址可能已经过期(电脑换了网络/网段)。 // 和手表不在同一网段时直接在按钮上标出来 —— // 不然用户点下去只会等 6 秒直连失败 + 40 秒中转超时, // 完全不知道问题出在哪儿。 String stale = ""; if (!host.isEmpty() && !hostInMySubnet(host)) { stale = " ⚠ 地址可能已过期"; } Button button = bigButton(label + "\\n" + host + ":" + port + stale, C_CARD, 14);""" # ---------------------------------------------------------------- 2. 跳过死路 OLD_QUICK = """ private void quickConnect(String host, int port, String token, String key) { // preferLan = true:先按记录里的地址直连。 // 记录里的地址可能是旧的(换过网络),直连会失败 —— // 那时自动退回中转,中转会报回电脑的最新局域网地址并刷新记录。 connect(host, port, null, token, key, true); }""" NEW_QUICK = """ private void quickConnect(String host, int port, String token, String key) { // 先判断这个保存下来的地址还有没有意义。 // 如果它和手表明显不在同一网段(电脑换网络了), // 直连必然失败 —— 那就别浪费那 6 秒,直接走中转。 // 中转连上后会报回电脑的最新局域网地址,记录自动刷新。 boolean sameNet = host.isEmpty() || hostInMySubnet(host); if (!sameNet) { appendLog("记录的地址 " + host + " 和手表不在同一网段" + "(电脑可能换了网络),直接走中转查最新地址"); toast("电脑地址已过期,正在通过中转查询最新地址…"); } // preferLan = true 时先按记录里的地址直连,失败自动退回中转。 connect(host, port, null, token, key, sameNet); } /** * host 是不是和手表在同一个 /24 网段。 * *

读不到手表自己的网卡时返回 true(保守:宁可按原地址试一次, * 也不要因为拿不到权限就误判成"过期")。 */ private boolean hostInMySubnet(String host) { if (host == null || host.isEmpty()) { return true; } java.util.List mine = localIpv4List(); if (mine.isEmpty()) { return true; } for (String myIp : mine) { if (sameSubnet(host, myIp)) { return true; } } return false; }""" def patch(text: str, old: str, new: str, label: str) -> tuple: if old not in text: print(" ✗ 没找到锚点:%s" % label) return text, False if text.count(old) != 1: print(" ! 锚点出现 %d 次:%s" % (text.count(old), label)) return text, False print(" ✓ %s" % label) return text.replace(old, new, 1), True def main() -> int: text = SRC.read_text(encoding="utf-8") before = text.count("\n") + 1 print(" 打补丁:") ok_all = True for old, new, label in ( (OLD_LIST, NEW_LIST, "设备列表标出过期地址"), (OLD_QUICK, NEW_QUICK, "quickConnect 跳过注定失败的直连"), ): text, ok = patch(text, old, new, label) ok_all = ok_all and ok if not ok_all: print() print(" 有锚点没匹配,没有写回") return 1 SRC.write_text(text, encoding="utf-8", newline="\n") print() print(" 已写回:%d -> %d 行" % (before, text.count("\n") + 1)) return 0 if __name__ == "__main__": sys.exit(main())