将 WireGuard 移植到 ESP32-P4
在 pioarduino 环境中构建 lwIP WireGuard 实现并验证初始化和基本操作;若不可行则切换其他实现或 SSH 跳板方案。
Tab5 Thin Client 将 M5Stack Tab5 和 Tab5 Keyboard 变成可随身携带的 SSH 终端。它通过 Wi-Fi 连接服务器,并在 1280×720 屏幕上显示完整的 ANSI/VT 风格终端,可流畅运行 vim、htop 等程序。

启动后的本地 CLI。可从内置的类 Linux Shell 直接建立 SSH 连接。
通过 LibSSH-ESP32 建立 SSH 连接,支持回滚、命令历史、256 色显示以及美式/日式键盘布局转换。
可在设备界面中添加和编辑 Wi-Fi / SSH 配置,保存到闪存并一键重新连接。
使用 scp get / put 在 SSH 主机与 microSD 之间传输文件,服务器也能访问 Tab5 存储。
支持 REPL、单行命令和 SD 卡中的 .py 脚本,并提供基于 M5GFX Sprite 的 gfx 绘图 API。
以浮窗方式查看 microSD、USB 存储或 SSH 服务器上的 JPEG / PNG / BMP,远程文件会自动缓存。
支持 Tab5 Keyboard、USB 键盘和 BLE 键盘,使用 Esc / Tab 即可完成界面操作。
使用 LVGL Web 模拟器以 1280×720 分辨率重现的设备界面。

连接后菜单栏会隐藏,整个 1280×720 屏幕成为终端。默认 Terminus 10x20 字体可显示 127 列×29 行,并支持 ANSI 颜色、粗体、反色、制表线和块字符。
会话开始时,固件会在服务器上部署一个小型 FUSE 助手,将 Tab5 存储挂载为 ~/sd 和 ~/usb,远程 Shell 可直接读写文件。

无需电脑即可扫描接入点、添加和编辑配置、切换网络及开关 Wi-Fi。当前行以深蓝底色和青色边框高亮。

以 user@host:port 形式管理连接目标。可从界面或使用 ssh connect 0 连接;直接执行 ssh user@host 时会复用匹配配置中的认证信息。

在屏幕上编辑 Name / Host / Port / User / Password / Term,并按 SAVE 保存至闪存。密码会以掩码显示。

可选择 Terminus 8x16、10x20、14x28 或 18x36,并用 - / + 微调行距,单屏最多显示 159 列×35 行。

设备名称、时区、NTP 服务器、美式/日式键盘映射以及 BLE 键盘扫描和配对,均可在设备上完成。

image sd:/photo.jpg fit 可在浮窗中显示 microSD、USB 存储或 SSH 服务器上的图片。远程文件会先复制到 microSD 缓存再绘制。
示例肖像是专为本页面生成的原创 AI 图片。
模拟器实现了 ECMA-48(ANSI X3.64)转义序列标准中的 VT100/VT220 子集及 xterm 扩展。它报告 TERM=xterm-256color,并在字体变化时自动更新 SSH PTY 尺寸(SIGWINCH),因此 vim、htop、less、ncurses 工具以及 sl 均可直接运行。

vim 开箱即用支持备用屏幕缓冲区(?1049/?1047/?47)、DECSTBM 滚动区域、光标保存/恢复(DECSC/DECRC、SCOSC/SCORC)及光标显示控制(?25)。退出 vim 后会恢复原 Shell 画面,256 色语法高亮也可正常显示。

sl实现了光标绝对/相对移动、行和字符插入/删除、画面和行清除以及区域滚动,因此会持续重绘屏幕的全屏动画也能正确显示。
| 支持 | ECMA-48 CSI 光标与编辑指令 / SGR:粗体、反色、ANSI 16 色、256 色、24 位真彩色(量化为 RGB565)/ 备用屏幕 / 滚动区域 / 800 行回滚 / UTF-8 与 CJK 双宽字符 / 制表线、块、盲文及 Powerline 字形 |
|---|---|
| 不支持 | 鼠标报告(?1000 系列)/ bracketed paste(?2004)/ 下划线、斜体、闪烁 / 窗口标题 / 反向索引 / DEC 特殊图形字符集 / 终端查询响应 / Sixel 等 DCS 图片 |
SSH 会话开始时,固件会向服务器部署小型 FUSE 助手,将 Tab5 的 microSD 卡和 USB 存储挂载为服务器上的 ~/sd 和 ~/usb,让服务器反向访问 Tab5。

cp、tar、rsync 等常用命令可直接操作 Tab5 存储。将构建产物或日志复制到 ~/sd 后即可随设备带走。服务器端的 image 命令还能在 Tab5 屏幕上显示 ~/sd 中的图片。
Tab5 本地 CLI 提供板载闪存(/flash)、microSD(/sd)和 USB(/usb)三个虚拟卷;服务器侧挂载 microSD 与 USB。服务器要求:Python 3 + FUSE 用户挂载(设置指南)。
从本地 CLI 启动 MicroPython 并运行 SD 卡中的脚本。脚本通过 gfx 对象绘图,并使用 gfx.present() 将画面传输至屏幕。
tab5:/$ python -c print('hello')
hello
tab5:/$ python /mandel.py 0 1 8 -1 # 渐进式 Mandelbrot
tab5:/$ python /plasma.py 0 160 16 # 正弦 plasma
tab5:/$ python /life.py # Conway 生命游戏内置演示:渐进式 Mandelbrot、正弦 plasma、线框帽、生命游戏、星空和迷宫。详情请参阅 Python API 文档和演示列表。
gfx 命令处理和 present() 传输的估算成本模拟其在 Tab5 上的执行速度。下一项重大升级是让 Tab5 通过 WireGuard 网关访问 Tailscale 网络内的 SSH 主机。开发将分阶段验证移植性、连接性和实际性能。这些功能尚未实现,详情见VPN 实现与测量计划(日文)。
在 pioarduino 环境中构建 lwIP WireGuard 实现并验证初始化和基本操作;若不可行则切换其他实现或 SSH 跳板方案。
添加 VPN 列表/编辑界面、vpn connect/status 命令、分流和 MagicDNS。SSH 配置将自动启动所需 VPN。
比较 SSH/SCP/FUSE 吞吐量、CPU 与可用堆、八小时连接稳定性、Wi-Fi 恢复及电池续航。
包括通过 M5Launcher 启动的场景,增强 LittleFS 挂载及 Wi-Fi/SSH 配置保存的可靠性。进度见 Issue #1。
| 硬件 | M5Stack Tab5 / Tab5 Keyboard / microSD 卡 / USB 线 |
|---|---|
| 网络 | Tab5 可连接的 Wi-Fi 网络及 SSH 服务器 |
| 服务器端(可选) | 若使用存储挂载功能:Python 3 + FUSE 用户挂载(设置指南) |
使用 PlatformIO 构建,详情请参阅 README。
# 构建 pio run -e tab5 # 烧录固件 pio run -e tab5 -t upload # 完整烧录:bootloader / 分区表 / 固件 / LittleFS .\tools\flash_tab5.ps1 -Port COM4