Windows 与 ATK-IMX6U 通过网线直连,板子上的网页控制 LED、蜂鸣器并显示输入状态。远程维护走 Tailscale,临时分享走 Cloudflare Tunnel。下面分别记录这几部分的配置。
一、访问方式
远程访问分为自用维护和临时分享,另外保留板子本地控制台:
- 自用维护通道:通过 Tailscale 访问板子所在的
192.168.10.0/24子网,可 SSH 登录、调试、维护。 - 分享访问通道:通过 Cloudflare Tunnel 暴露一个 HTTPS 登录页,登录后访问板子的 IO 控制台。
- 板子本地控制台:替换原 nginx 默认页,提供
sys-led、beep输出控制,以及 GPIO Key 输入状态实时显示。
当前关键状态
| 项目 | 值 | 说明 |
|---|---|---|
| 板子主机名 | ATK-IMX6U | 通过串口和 SSH 确认 |
| 板子网口 IP | 192.168.10.2/24 |
eth1 静态配置 |
| Windows 有线网卡 | 192.168.10.1/24 |
与板子直连 |
| 串口 | COM4,115200 | 备用控制台 |
| SSH 用户 | root |
Dropbear SSH,端口 22 |
| Tailscale 地址 | 登录后动态分配 | Windows 网关设备 |
| 板子 IO 控制台 | http://192.168.10.2/ |
nginx 提供网页 |
| 板子状态 API | http://192.168.10.2/api/status |
nginx 反代到本机 Python API |
二、整体架构
整体分为三层:板子端、Windows 网关端、外部访问端。
| 层级 | 组件 | 职责 |
|---|---|---|
| 板子端 | nginx + Python IO API | 提供网页控制台,读写 LED 和输入事件 |
| Windows 网关 | Tailscale | 把 192.168.10.0/24 子网发布到 tailnet |
| Windows 网关 | Node 登录代理 | 给 Cloudflare 公网访问加密码登录 |
| Windows 网关 | cloudflared | 把本机 127.0.0.1:8090 暴露为 HTTPS 临时链接 |
| 外部设备 | 浏览器或 SSH 客户端 | 浏览器访问控制台;自用设备可通过 Tailscale SSH |
自己维护:
你的电脑/手机 -> Tailscale -> Windows 网关 -> ATK-IMX6U 192.168.10.2
临时分享:
别人浏览器 -> Cloudflare Tunnel HTTPS -> Windows 登录代理 127.0.0.1:8090 -> ATK-IMX6U 192.168.10.2
三、第一阶段:打通 Windows 与板子直连 SSH
1. 通过串口确认板子信息
已确认串口为 COM4,波特率为 115200,登录后用户为 root,主机名为 ATK-IMX6U。
powershell -ExecutionPolicy Bypass -File .\serial_bridge.ps1 -Port COM4 -Baud 115200 -Command "whoami; hostname; ip addr show" -TimeoutMs 8000
2. 设置板子静态 IP
板子 eth1 初始拿到 169.254.x.x 链路本地地址,无法与 Windows 的 192.168.10.1/24 互通。通过串口设置静态 IP:
ifconfig eth1 192.168.10.2 netmask 255.255.255.0 up
ip addr show eth1
ip route
3. Windows 侧测试连通性
ping 192.168.10.2
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.10.2
板子上的 Dropbear SSH 较旧,只提供
ssh-rsahost key。新版本 OpenSSH 默认禁用该算法,所以连接时需要添加HostKeyAlgorithms和PubkeyAcceptedAlgorithms参数。
四、第二阶段:Tailscale 自用维护通道
1. 安装并登录 Tailscale
Windows 上安装 Tailscale 后登录账号,记下当前网关设备名称与动态分配的 Tailscale IP。公开文档不记录真实设备名和组网地址。
winget install --id Tailscale.Tailscale --source winget --accept-package-agreements --accept-source-agreements
"C:\Program Files\Tailscale\tailscale.exe" up
"C:\Program Files\Tailscale\tailscale.exe" status
"C:\Program Files\Tailscale\tailscale.exe" ip
2. 发布板子所在子网
Windows 电脑作为 Tailscale 子网路由器,把直连板子的 192.168.10.0/24 发布给 tailnet。
"C:\Program Files\Tailscale\tailscale.exe" up --advertise-routes=192.168.10.0/24
随后在 Tailscale 管理后台进入 Machines,找到承担网关角色的 Windows 设备,批准 192.168.10.0/24 路由。批准后状态中会出现:
AllowedIPs:
<tailscale-ip>/32
192.168.10.0/24
PrimaryRoutes:
192.168.10.0/24
3. 手机或其他电脑访问
其他设备如果安装并登录同一个 Tailscale,就可以直接访问板子:
ping 192.168.10.2
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.10.2
浏览器打开 http://192.168.10.2/
五、第三阶段:板子 IO 控制台
1. 板子端硬件资源
已识别可用资源如下:
| 资源 | 路径 | 用途 |
|---|---|---|
| 系统灯 | /sys/class/leds/sys-led |
网页开关控制 |
| 蜂鸣器 | /sys/class/leds/beep |
网页开关控制 |
| GPIO Key | /dev/input/event1 |
实时输入状态显示 |
| nginx 根目录 | /var/www/localhost/html |
控制台前端页面 |
2. 板子端文件
| 文件 | 作用 |
|---|---|
/var/www/localhost/html/index.html |
IO 控制台网页 |
/root/io-control/io_api.py |
Python API,读写 LED 与输入事件 |
/etc/nginx/nginx.conf |
nginx 反向代理 /api/ 到 127.0.0.1:8081 |
/etc/init.d/io-api |
API 开机启动脚本 |
3. 备份文件
原始 nginx 页面和配置已备份,可用于回滚:
/var/www/localhost/html/index.html.bak-codex
/etc/nginx/nginx.conf.bak-codex
4. API 功能
| 接口 | 用途 | 刷新频率 |
|---|---|---|
/api/status |
返回主机时间、LED 状态、输入状态 | 网页每 1 秒请求一次 |
/api/input |
只返回输入状态,用于更实时显示 | 网页每 200 ms 请求一次 |
/api/led?name=sys-led&value=1 |
打开 sys-led |
点击按钮触发 |
/api/led?name=sys-led&value=0 |
关闭 sys-led |
点击按钮触发 |
/api/led?name=beep&value=1 |
打开 beep |
点击按钮触发 |
/api/led?name=beep&value=0 |
关闭 beep |
点击按钮触发 |
5. 常用验证命令
curl http://192.168.10.2/api/status
curl http://192.168.10.2/api/input
curl "http://192.168.10.2/api/led?name=sys-led&value=1"
curl "http://192.168.10.2/api/led?name=sys-led&value=0"
六、第四阶段:Cloudflare Tunnel 临时分享通道
1. 设计原则
Cloudflare Tunnel 用于让别人无需安装 Tailscale,只用浏览器访问 HTTPS 地址。但由于页面可以控制硬件,不能直接裸露板子 API,所以在 Windows 上增加了一个 Node 登录代理。
| 组件 | 地址 | 作用 |
|---|---|---|
| Node 登录代理 | 127.0.0.1:8090 |
校验密码,成功后代理到板子 |
| 板子控制台 | 192.168.10.2:80 |
实际 IO 控制页面 |
| Cloudflare quick tunnel | trycloudflare.com 临时域名 |
公网 HTTPS 入口 |
2. Windows 端文件
C:\Users\vincent\Documents\Codex\2026-05-22\github-linux\cloudflare-board-proxy.js
C:\Users\vincent\Documents\Codex\2026-05-22\github-linux\cloudflare-board-password.txt
C:\Users\vincent\Documents\Codex\2026-05-22\github-linux\cloudflared.err.log
3. 启动代理与 Tunnel
$env:BOARD_PROXY_PASSWORD = Get-Content .\cloudflare-board-password.txt
node .\cloudflare-board-proxy.js
cloudflared tunnel --url http://127.0.0.1:8090 --no-autoupdate
4. 获取临时公网地址
终端会输出一个临时 trycloudflare.com 地址。该地址每次启动都可能变化,不应写入公开网页或长期保存;需要分享时通过单独渠道发送。
访问密码不要写入公开文档。当前密码保存在 Windows 本机
cloudflare-board-password.txt中;需要分享时建议通过单独渠道发送,并定期更换。
5. 安全验证
已验证未登录访问 API 会被拒绝,登录后才允许访问控制台和 API。
未登录访问 /api/status -> 401 login required
输入密码登录 -> 302 跳转到 /
登录后访问 /api/status -> 返回板子实时状态
登录后访问 / -> 返回 ATK-IMX6U IO 控制台
七、个人主页入口
个人主页本地副本已增加两个入口:
- 顶部导航与首页增加单板项目入口,便于直达。
- 在静态站点中,可通过独立页面挂载单板概览与控制台拓扑,对外提供公开控制台与 API 交互说明。
八、性能与刷新策略
为了兼顾实时性与板子负载,网页采用分层刷新:
| 数据 | 接口 | 频率 | 原因 |
|---|---|---|---|
| LED 和整体状态 | /api/status |
1 秒 | 避免频繁读 sysfs 导致页面卡顿 |
| GPIO Key 输入 | /api/input |
200 ms | 提升输入显示实时性 |
实测板子本地 API 延迟约 12 ms 到 43 ms;Cloudflare 公网访问首跳延迟可能约 1 秒,适合分享体验,不适合高频硬实时控制。
九、常见问题与排查
1. 手机打不开 192.168.10.2
- 确认手机已经登录同一个 Tailscale。
- 确认 Windows 电脑在线,Tailscale 在线。
- 确认 Tailscale 后台已批准网关设备发布的
192.168.10.0/24子网路由。 - 确认板子仍然是
192.168.10.2。
2. SSH 报 no matching host key type found
这是旧版 Dropbear 只提供 ssh-rsa 导致,使用以下命令:
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@192.168.10.2
3. Cloudflare 链接失效
- 检查
cloudflared进程是否还在。 - quick tunnel 是临时地址,重启后可能换地址。
- 长期使用建议配置 Cloudflare named tunnel 和 Cloudflare Access。
4. IO 控制台打不开
curl http://192.168.10.2/
curl http://192.168.10.2/api/status
ps | grep python3
netstat -tlnp | grep 8081
/etc/init.d/io-api restart
/etc/init.d/nginx restart
十、回滚方案
如果需要恢复 nginx 默认页面和配置,可以在板子上执行:
cp /etc/nginx/nginx.conf.bak-codex /etc/nginx/nginx.conf
cp /var/www/localhost/html/index.html.bak-codex /var/www/localhost/html/index.html
/etc/init.d/io-api stop
/etc/init.d/nginx restart
十一、后续建议
- 将板子 IP 持久化,避免重启后
eth1回到169.254.x.x。 - 将 Cloudflare quick tunnel 升级为 named tunnel,绑定固定域名。
- 使用 Cloudflare Access 邮箱登录替代简单密码,便于授权和撤销。
- 为 IO 控制加入操作日志,记录谁在什么时候切换了输出。
- 如需开放给他人长期使用,只暴露网页控制台,不暴露 SSH。
讨论交流
支持免注册访客评论,填写真实邮箱可接收回复提醒