English | 日本語 | 中文

tab5:/$ Tab5 Thin Client

把 M5Stack Tab5(ESP32-P4)变成配有实体键盘和 SSH Shell 的便携式瘦客户端。

ESP32-P41280×720 IPSPlatformIOLibSSH-ESP32MicroPythonMIT License

GitHub 仓库命令列表

这是什么?

Tab5 Thin Client 将 M5Stack Tab5 和 Tab5 Keyboard 变成可随身携带的 SSH 终端。它通过 Wi-Fi 连接服务器,并在 1280×720 屏幕上显示完整的 ANSI/VT 风格终端,可流畅运行 vimhtop 等程序。

Tab5 本地 CLI 画面,以绿色文字显示启动日志和 help 命令输出

启动后的本地 CLI。可从内置的类 Linux Shell 直接建立 SSH 连接。

主要功能

交互式 SSH Shell

通过 LibSSH-ESP32 建立 SSH 连接,支持回滚、命令历史、256 色显示以及美式/日式键盘布局转换。

配置文件管理

可在设备界面中添加和编辑 Wi-Fi / SSH 配置,保存到闪存并一键重新连接。

类 SCP 文件传输

使用 scp get / put 在 SSH 主机与 microSD 之间传输文件,服务器也能访问 Tab5 存储。

内置 MicroPython

支持 REPL、单行命令和 SD 卡中的 .py 脚本,并提供基于 M5GFX Sprite 的 gfx 绘图 API。

图片查看器

以浮窗方式查看 microSD、USB 存储或 SSH 服务器上的 JPEG / PNG / BMP,远程文件会自动缓存。

三种键盘连接方式

支持 Tab5 Keyboard、USB 键盘和 BLE 键盘,使用 Esc / Tab 即可完成界面操作。

界面导览

使用 LVGL Web 模拟器以 1280×720 分辨率重现的设备界面。

全屏 SSH 终端,显示彩色的 ls、df 和 htop 输出

全屏 SSH 终端

连接后菜单栏会隐藏,整个 1280×720 屏幕成为终端。默认 Terminus 10x20 字体可显示 127 列×29 行,并支持 ANSI 颜色、粗体、反色、制表线和块字符。

会话开始时,固件会在服务器上部署一个小型 FUSE 助手,将 Tab5 存储挂载为 ~/sd~/usb,远程 Shell 可直接读写文件。

带有 SCAN、ADD、CONNECT 和 OFF 按钮的 Wi-Fi 配置列表

Wi-Fi 配置

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

带有 ADD、EDIT 和 CONNECT 按钮的 SSH 配置列表

SSH 配置

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

包含 Name、Host、Port、User、Password 和 Term 字段的 SSH 配置编辑器

配置编辑器

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

包含四种 Terminus 字号和行距设置的字体画面

字体和行距

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

包含设备名、区域、UTC 偏移、NTP、键盘映射和 BLE 设置的配置画面

设备设置

设备名称、时区、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),因此 vimhtopless、ncurses 工具以及 sl 均可直接运行。

通过 SSH 使用 vim 编辑带语法高亮的 Python 脚本

vim 开箱即用

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

通过 SSH 运行 sl 蒸汽机车 ASCII 动画

当然也能运行 sl

实现了光标绝对/相对移动、行和字符插入/删除、画面和行清除以及区域滚动,因此会持续重绘屏幕的全屏动画也能正确显示。

支持ECMA-48 CSI 光标与编辑指令 / SGR:粗体、反色、ANSI 16 色、256 色、24 位真彩色(量化为 RGB565)/ 备用屏幕 / 滚动区域 / 800 行回滚 / UTF-8 与 CJK 双宽字符 / 制表线、块、盲文及 Powerline 字形
不支持鼠标报告(?1000 系列)/ bracketed paste(?2004)/ 下划线、斜体、闪烁 / 窗口标题 / 反向索引 / DEC 特殊图形字符集 / 终端查询响应 / Sixel 等 DCS 图片

将 Tab5 存储挂载到服务器

SSH 会话开始时,固件会向服务器部署小型 FUSE 助手,将 Tab5 的 microSD 卡和 USB 存储挂载为服务器上的 ~/sd~/usb,让服务器反向访问 Tab5。

服务器 Shell 在 df -h 中显示 tab5-sd 和 tab5-usb,并通过 cp 和 tar 写入 ~/sd

从服务器 Shell 直接读写

cptarrsync 等常用命令可直接操作 Tab5 存储。将构建产物或日志复制到 ~/sd 后即可随设备带走。服务器端的 image 命令还能在 Tab5 屏幕上显示 ~/sd 中的图片。

Tab5 本地 CLI 提供板载闪存(/flash)、microSD(/sd)和 USB(/usb)三个虚拟卷;服务器侧挂载 microSD 与 USB。服务器要求:Python 3 + FUSE 用户挂载(设置指南)。

MicroPython 与绘图演示

从本地 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 文档演示列表

直接运行全部六个内置脚本,并根据 MicroPython 运算、gfx 命令处理和 present() 传输的估算成本模拟其在 Tab5 上的执行速度。

计划中的升级

下一项重大升级是让 Tab5 通过 WireGuard 网关访问 Tailscale 网络内的 SSH 主机。开发将分阶段验证移植性、连接性和实际性能。这些功能尚未实现,详情见VPN 实现与测量计划(日文)。

M0 / PORTABILITY POC下一步

将 WireGuard 移植到 ESP32-P4

在 pioarduino 环境中构建 lwIP WireGuard 实现并验证初始化和基本操作;若不可行则切换其他实现或 SSH 跳板方案。

M1—M3 / CONNECT计划中

VPN 配置和自动 SSH 连接

添加 VPN 列表/编辑界面、vpn connect/status 命令、分流和 MagicDNS。SSH 配置将自动启动所需 VPN。

M4—M5 / VALIDATE计划中

测量速度、内存和稳定性

比较 SSH/SCP/FUSE 吞吐量、CPU 与可用堆、八小时连接稳定性、Wi-Fi 恢复及电池续航。

RELIABILITY / STORAGE待解决

提高设置持久化可靠性

包括通过 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