外觀
遠端開發體系
板子永遠掛公司 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 篇參考文件(初始化踩坑 / 方案選型 / 拓撲演進 / 多專案設計)