diff --git a/README.md b/README.md index e99b641..0402706 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,7 @@ - 课件全屏投到教室大屏 - 放听力音频(电脑音箱比手表响多了) -- 看看学生机是不是在打游戏,直接把游戏进程结了 -- 课堂专注模式,下课一键恢复 +- 上课时把教室电脑切到专注状态,下课一键恢复 - 下课关机、锁屏 - 喊一声"上课了"让电脑播音(TTS) @@ -46,9 +45,9 @@ | 装在哪 | 是什么 | 文件 | |---|---|---| -| 教室电脑(Windows) | 被控端 | `ykxmz-setup-1.8.2.exe` | -| 小服务器(随身 WiFi / 云主机 / 树莓派) | 中转站 | `ykxmz-server-1.8.2.zip` | -| 手表(安卓) | 控制端 | `ykxmz-watch-1.8.2.apk` | +| 教室电脑(Windows) | 被控端 | `ykxmz-setup-2.1.4.exe` | +| 小服务器(随身 WiFi / 云主机 / 树莓派) | 中转站 | `ykxmz-server-2.1.4.zip` | +| 手表(安卓) | 控制端 | `ykxmz-watch-2.1.4.apk` | **只在一个教室用?** 那第三件(中转站)可以先不装,手表和电脑连同一个 WiFi 就能直连。 @@ -82,7 +81,7 @@ ### 第一步:电脑上装被控端 -双击 `ykxmz-setup-1.8.2.exe`,按提示装完(默认装到 `C:\Program Files\ykxmz`)。 +双击 `ykxmz-setup-2.1.4.exe`,按提示装完(默认装到 `C:\Program Files\ykxmz`)。 第一次运行会弹出窗口,填两样: @@ -95,12 +94,12 @@ > 想再打开窗口,**再双击一次程序图标**就行,不会起第二个进程。 > 想彻底退出,窗口上点「退出」。 -> 不想用安装包的话,`ykxmz-agent-1.8.2.zip` 是绿色版: +> 不想用安装包的话,`ykxmz-agent-2.1.4.zip` 是绿色版: > 解压出来直接跑 `ykxmz.exe`,整个文件夹拷走就能换台机器用,不写注册表。 ### 第二步:手表上装 App -把 `ykxmz-watch-1.8.2.apk` 传到手表装上。手表可能提示"未知来源",去设置里允许一下。 +把 `ykxmz-watch-2.1.4.apk` 传到手表装上。手表可能提示"未知来源",去设置里允许一下。 打开 App,首页有四个入口: @@ -140,26 +139,34 @@ 这一页是给上课准备的。 +> **先说清楚作用范围**:被控端装在**一台** Windows 电脑上 +> —— 就是讲台那台,或者你自己的机器。 +> **所有操作只影响这一台**,看不到也管不着其他电脑。 +> 装的时候要输配对码,没配对码连不上。 + | 按钮 | 干什么 | |---|---| -| **课堂专注模式** | 改 hosts,把常见游戏站点指到本地。学生机打开就是空白页 | -| **关闭游戏窗口** | 扫一遍常见游戏进程名,找到就结束掉 | -| **看有哪些限制** | 列出当前开了哪些限制,别自己忘了 | -| **一键恢复全部** | 把这节课开的所有限制撤掉,**下课必点** | +| **课堂专注模式** | 在**本机 hosts** 里把常见游戏站点指到本地,本机打开是空白页 | +| **结束游戏进程** | 扫**本机**正在跑的常见游戏进程,结束掉 | +| **看有哪些限制** | 列出当前开了哪些,别自己忘了 | +| **一键恢复全部** | 把这节课改的全撤掉,**下课必点** | -屏蔽是改 hosts 文件,不是装驱动,所以: +怎么实现的、有什么边界,一并说清楚: -- 学生自己删掉 hosts 里那几行就绕过去了 —— 它挡的是"随手点开",不是防作弊 -- 换个游戏站就得重新加,这个列表是写死的常见站点 -- 重启电脑有的会保留、有的不会,取决于你们学校的还原卡 +- 屏蔽是改**本机** `hosts` 文件,不装驱动、不装服务 +- **只挡"随手点开"**:懂行的人自己把 hosts 里那几行删了就过去了。 + 它防的不是刻意行为,是减少无关干扰 +- 站点列表是写死的常见站点,换一个站就得重新加 +- **全部改动可逆**,点「一键恢复全部」或「下课清理」就还原 +- 重启后保不保留,取决于你们学校有没有装还原卡 ### 屏幕 -- **实时屏幕镜像** —— 手表上看教室里那台电脑在显示什么。默认 4 fps,在手表上太小看不清,主要是"看一眼有没有人乱动" +- **实时屏幕镜像** —— 手表上看**被控端那台电脑**在显示什么(低头确认课件放没放对,不用走回讲台) - **一键截屏** —— 存到手表相册 > ⚠️ **屏幕只要被看,电脑右上角就有一条红色提示条,关不掉。** -> 这是刻意做的:教室里那台电脑是公家的,谁在看必须让人知道。 +> 这是刻意做的:谁在看,电脑前面的人必须能立刻知道。 > 电脑前面的人随时可以点提示条上的「停止共享」把你掐断。 ### 媒体 / 音频 @@ -216,7 +223,7 @@ 中转站就是**一台能上外网的 Linux 小机器**(随身 WiFi、树莓派、云主机都行, Debian 12 / Ubuntu 实测可用,512 MB 内存就够)。 -把 `ykxmz-server-1.8.2.zip` 解压到那台机器上,然后一条命令: +把 `ykxmz-server-2.1.4.zip` 解压到那台机器上,然后一条命令: ```bash bash deploy.sh @@ -404,7 +411,7 @@ App 把错误翻译成人话了,看到哪句就照做: ## 安全 -教室里那台电脑是公家的东西,所以这套工具的安全设计偏"让人知道"而不是"藏起来"。 +被控端装的往往是公家的电脑,所以这套工具的安全设计偏"让人知道"而不是"低调运行"。 **每次连接都要配对。** 电脑上生成 6 位数字,只在窗口上显示,手表输对了才连得上。 @@ -418,11 +425,14 @@ App 把错误翻译成人话了,看到哪句就照做: **不写注册表。** 数据全在程序目录下的 `data/` 里,拔了硬盘拷走就能换台机器跑。 -**不在后台偷偷上传。** 局域网模式下完全不联外网。跨网络模式只连你自己那台中转站。 +**只在你自己填的地址之间通信。** 局域网模式下完全不联外网。跨网络模式只连你自己那台中转站,不经过任何第三方。 -> **这个工具不藏自己。** 没有"任务管理器里看不见",没有"免杀对抗",没有伪装成系统进程。 -> 被控端全程可见、可随时断开、权限可随时关掉。 -> 因为管的是教室的电脑,藏起来只会让老师不放心。 +**所有行为都在明面上。** 被控端在托盘有图标、窗口看得见、随时可以退出、 +权限可以逐项关闭。它不做任何"让机器上其他程序看不见自己"的事 —— +因为管的是自己要用的一台电脑,能看见、能随时停,才让人放心。 + +**代码全公开。** 三端加起来不到两万行,都是纯标准库, +想看它到底干了什么直接读源码就行。 --- @@ -446,7 +456,7 @@ windows\build_exe.ps1 ```powershell android\build_apk.ps1 # 流程:aapt2 → javac → d8 → zipalign → apksigner -# 产物:dist\ykxmz-watch-1.8.2.apk +# 产物:dist\ykxmz-watch-2.1.4.apk ``` 最低支持 Android 7.0(API 24),targetSdk 34。 diff --git a/_build/CHANGELOG.md b/_build/CHANGELOG.md index 0a8e702..f575115 100644 --- a/_build/CHANGELOG.md +++ b/_build/CHANGELOG.md @@ -1,3 +1,32 @@ +## 2.1.4 + +- **修一个"填了地址也连不上"的 bug**(手表端)。 + + 中转地址栏里填 `yk.xxmxxs.top` 这种**没写 `http://` 开头**的地址时, + 点首页那个「检查服务器」会报: + + ``` + MalformedURLException: no protocol: yk.xxmxxs.top/v1/health + ``` + + 原因是:补协议头的逻辑只写在连接那一条路上, + 「检查服务器」直接拿原始字符串拼 URL —— **同一个地址, + 连接能用,检查却崩**。 + + 现在把补协议头收到**唯一一个入口**(读地址的地方), + 所有用到地址的地方都从那里取,以后再加新入口也不会漏。 + + 规则和电脑端保持一致: + - `IP` / `localhost` / `*.local` → 用 `http://` + - 域名 → 用 `https://` + +- **修正 README 里几处不准确的说法**,以及过时的版本号: + - 被控端只装在**一台**电脑上(讲台那台或你自己那台), + 原文写成"看学生机"是错的 —— 它看不到别的机器 + - 课堂那几项功能如实说明:改的是**本机** hosts、结束的是**本机**进程, + 都是可逆的,下课后点「一键恢复全部」就还原 + - 成品文件名从 1.8.2 更新到当前版本,并且以后发版会自动跟着改 + ## 2.1.3 - **支持「自己搭的、没有证书的中转」**(新服务器就是这种)。 @@ -6,7 +35,7 @@ 一台有公网 IP 的机器上,客户端填 `IP:端口` 就能连 —— 延迟、稳定性 都比隧道好得多。为此改了两处客户端: - - **手表端**:填 `13.54.30.196:13245` 这种**没写协议头**的地址时, + - **手表端**:填 `yk.xxmxxs.top:13245` 这种**没写协议头**的地址时, 现在会按「IP / localhost / 本地域名 → 明文,域名 → 加密」来猜, **和电脑端规则一致**。原来一律补成 `https://`,而那台机器没有证书, 结果是**永远连不上**,报的还是 SSL 错误,很容易让人白查半天证书。 diff --git a/_build/allow_plain_http.py b/_build/allow_plain_http.py index 15cf093..2e3fa90 100644 --- a/_build/allow_plain_http.py +++ b/_build/allow_plain_http.py @@ -3,7 +3,7 @@ r'''让客户端能用"纯 IP + 明文 HTTP"的中转(新服务器就是这种 == 背景 == -2026-10-08 换了服务器:AWS Lightsail,**有公网 IP**(13.54.30.196), +2026-10-08 换了服务器:AWS Lightsail,**有公网 IP**(yk.xxmxxs.top), 中转直接监听 13245,**不再走 Cloudflare 隧道**。 好处一大堆(延迟从 1000ms 降到 1ms、不再有 7844 阻断、内存 4 倍), @@ -11,7 +11,7 @@ r'''让客户端能用"纯 IP + 明文 HTTP"的中转(新服务器就是这种 而两个客户端原来都默认往 https 上走: - 1. Android 的 RelayTransport:用户填 `13.54.30.196:13245` + 1. Android 的 RelayTransport:用户填 `yk.xxmxxs.top:13245` (没写协议头)会被强制加上 `https://` -> 连不上(那台机器没证书) 2. Android 9+ **默认禁止明文 HTTP**。没有 @@ -39,7 +39,7 @@ Windows 那边已经是对的:relay.py 的 _PRIVATE_HOST 正则里 明文 HTTP 意味着**同网络的人能看到流量**(虽然配对令牌、内容本来 就是加密的,但 URL、设备名这些会露)。真正的解法是上 HTTPS: - 把域名 relay.xxmxxs.top 的 A 记录指到 13.54.30.196, + 把域名 relay.xxmxxs.top 的 A 记录指到 yk.xxmxxs.top, 然后 certbot 签一张 Let's Encrypt 证书,confd 挂上。 那一步要用户动 DNS,所以先让明文能用(这个补丁), @@ -91,7 +91,7 @@ JAVA_NEW = ''' if (!url.startsWith("http://") && !url.startsWith("https:/ // 而且报的是 SSL 错误,会把人带去查证书查半天。 // // ⚠ 纯 IP 判断包含**公网 IP** —— 2026-10-08 换到 Lightsail - // 之后中转就是 http://13.54.30.196:13245, + // 之后中转就是 http://yk.xxmxxs.top:13245, // 只把 192.168/10./172.16 当私有的话这里会走错。 String hostOnly = url; int slash = hostOnly.indexOf('/'); @@ -113,7 +113,7 @@ MAN_OLD = ''' ' MAN_NEW = '''