外观
远程开发体系
板子永远挂公司 VM
10.8.0.6上;其余设备通过 WireGuard 远程使用它的串口、ADB、烧录能力。 开发板零改动,人在哪台机器上都一样干活。
全景
星型拓扑:所有节点只和云端互加 peer,跨节点流量经云端 ip_forward 中转。新设备入网只需动两处:自己 + 云端。
机器清单
单一事实源是 machines.tsv(版本化,权威副本在云端 /srv/mesh/)。换机先自检身份:
bash
mesh-whoami # 按本机 WireGuard IP 自动匹配身份| id | IP | 角色 |
|---|---|---|
| cloud | 10.8.0.1 | WG 中转 · 清单权威宿主 · nginx 托管 · 档案库 |
| home-vm | 10.8.0.4 | 家里编译 VM · 常驻 Agent |
| company-vm | 10.8.0.6 | 接板子:ser2net / adb-server / 板子锁 |
| mac | 10.8.0.10 | 交互 · AI Agent · 随身编译烧录 |
| phone | 10.8.0.100 | Termius SSH · 远程查看 |
| home-host | 10.8.0.2 | home-vm 宿主机(平时不在线) |
同名陷阱
vms 与 vmt 的 hostname 都叫 olicca-vm——认 IP 不认 hostname。
WireGuard:新设备入网
以 iPhone 入网为例的完整链路(2026-09 实测):
配置纪律:客户端配置存 ~/.wireguard-mesh/<设备>.conf(0600,含私钥不进 git);二维码用 qrcode 库出 PNG,别用终端 ASCII(显示不全)。
日常开发链路速查
| 需求 | 通道 | 关键命令 |
|---|---|---|
| shell / 推拉文件 | adb client → 远端 adb server | adb -H 10.8.0.6 shell |
| MCU 日志 / 控制台 | ser2net raw TCP | socket://10.8.0.6:400x |
| 烧录 | 产物推远端,刷机命令在远端跑 | rsync + ssh |
| 板端网页 | forward 在 vmt 本地执行 | http://10.8.0.6:18080 |
| 随便跑点啥 | SSH 免密(ed25519) | ssh olicca@10.8.0.6 |
远程 ADB
bash
adb -H 10.8.0.6 devices # 显式走远端
export ADB_SERVER_SOCKET=tcp:10.8.0.6:5037 # 脚本里免 -H远端本地 adb shell 与远程 adb -H 共用同一 server,可并发;两端 adb 版本须接近(当前均 28.0.2)。
远程串口(ser2net)
| 端口 | 板子 | 功能 | 波特率 |
|---|---|---|---|
| 4000 | S100P | MCU-COM | 921600 |
| 4001 | S100P | Main-COM | 921600 |
| 4002 | RV1126B | AP (Linux) | 1500000 |
| 4003 | RV1126B | MCU (RT-Thread) | 1500000 |
python
import serial
s = serial.serial_for_url("socket://10.8.0.6:4002", timeout=2) # raw TCP,波特率在 ser2net 端固定别用 rfc2217://
ser2net 4.3.4 的 telnet 栈异常断连后会僵死(接受 TCP 但不发协商字节)。raw TCP 模式经 15 次快速连断压测稳定。代价只是不能远程改波特率——我们的波特率本来就是固定的。
30 秒健康检查
远程烧录
高延迟链路(RTT 130ms)别把刷机 USB 映射回本机,正确姿势:
板子互斥锁
开发板是单例资源,烧录/独占监听前必取锁:
锁存 /tmp/boards/*.lock/(含 owner/任务/时间戳),/tmp 重启即清,死锁自愈。
异步任务派发(Level 2)
人往共享目录投任务文件,家里 VM 的无人值守 Agent 领取执行:
本机直连模式(板子插 Mac)
不经 WireGuard 时 adb 直连;4 路 CH340/341 串口(/dev/cu.wchusbserial*)名字会随重枚举变化,靠「波特率 + 提示符」识别:
| 板子 | 功能 | 波特率 | 提示符 |
|---|---|---|---|
| RV1126B | AP | 1500000 | root@ATK-DLRV1126B-MCU720:/# |
| RV1126B | MCU | 1500000 | msh /> |
| S100P | AP | 921600 | ubuntu login:(root 空密码) |
| S100P | MCU | 921600 | 无 shell,仅开机日志 |
S100P 进 fastboot:AP 串口以 ~100ms 间隔逐个发 \x03 打断 0 延迟 autoboot(10ms 连发会淹没 U-Boot 输入缓冲)→ 出现 Hobot$ → fastboot 0。
数据与协作生态
云端不只是中转,还是整套协作设施的宿主:
| 设施 | 端口/入口 | 说明 |
|---|---|---|
| omp-web | http://10.8.0.1:8080(仅 WG 内网,免鉴权) | 全端会话浏览 + 网页聊天 + 任务 UI |
| 任务中心 | http://10.8.0.1:8090 | REST + work-task CLI + deadline 飞书提醒 |
| 会话日报 | systemd timer 09:30 | 扫全量会话 → kimi-k3 生成 → 飞书 DM |
| nginx | 80(公网) | 静态主页 + prebuilts 工具链下载 |
omp 会话同步按「一项目一 syncthing folder」,folder_id 三端一致、各端路径各自映射;云端 ignoreDelete 当只增不删的档案库。映射唯一事实源:projects.tsv。
踩坑档案
| 现象 | 根因 | 修复 |
|---|---|---|
CH340 插着却没有 /dev/ttyUSB0 | Ubuntu brltty 抢占 CH340/CP210x | apt purge brltty + 重插 |
| ser2net 接受 TCP 但无数据 | 4.3.4 RFC2217 栈异常断连后僵死 | 换 raw TCP(socket://) |
| ser2net 进程活着但端口不监听 | boot 竞态:拉起时 USB 串口未枚举,静默禁用 | udev 规则自动 restart |
| adb-server systemd 卡 activating | 旧 adb -a nodaemon 占着 5037 | pkill -f "adb -a nodaemon" |
| 远程 adb 突然全挂 | 两端 adb 版本漂移 | 对齐版本(当前 28.0.2) |
Mac 侧 adb -H ... forward 报 more than one | adb 1.0.41 的 -s 对 forward 无效 | forward 放 vmt 本地执行 |
| vms 上 syncthing 全部 folder 挂起 | 磁盘 100% 触发 minHomeFreePct | journal vacuum + 清磁盘 |
复现与出处
- 全部远端配置已固化为幂等脚本
setup/,新资源主机跑一次setup-resource-host.sh即复现 - 操作细节与逐条命令见 skill
remote-dev及 4 篇参考文档(初始化踩坑 / 方案选型 / 拓扑演进 / 多项目设计)