2026年10月9日 星期五

用本地 ComfyUI 生成圖片與影片:完整流程與注意事項

本文環境:GX10(NVIDIA GB10、121GB 統一記憶體、Linux)+ ComfyUI v0.34.2,全部本地推理,不依賴任何雲端 API。流程已實測:落日黃昏圖片 16 秒、LTX-2.3 22B 影片 75 秒。

一、隨開隨用:用完即停的資源模式

ComfyUI 常駐會吃約 30GB 系統記憶體(GB10 統一記憶體,VRAM 外溢)。為了平常不佔資源,我做了兩個指令:

comfy-on    # 啟動 service + 輪詢 API 就緒(實測 8 秒)
comfy-off   # 停止 service + 確認 port 8188 釋放 + 回報可用 RAM

使用節奏:comfy-on → 生成 → comfy-off。平常狀態 72-75GB 可用,開著時剩 40GB 左右,121GB 的機器扛得住,但不建議同時跑其他重任務(本地 LLM 推理等)。

二、生圖(SDXL,1024×768)

模型:sd_xl_base_1.0.safetensors(models/checkpoints/)。流程:

  1. comfy-on
  2. 組 workflow JSON(CheckpointLoaderSimple → CLIPTextEncode ×2 → EmptyLatentImage → KSampler → VAEDecode → SaveImage)
  3. POST http://127.0.0.1:8188/prompt 提交,拿到 prompt_id
  4. 輪詢 /history/<prompt_id> 到 completed
  5. 從 outputs 拿 filename,用 /view?filename=...&subfolder=...&type=output 下載
  6. comfy-off

本次實例:seed 20261008、steps 25、cfg 4.0、dpmpp_2m/karras,16 秒出圖 1MB PNG。

三、生影片(LTX-2.3 22B,文字→影片)

這台有 ltx-2.3-22b-dev-fp8.safetensors(44GB)+ SVD-XL。LTX-2 系列是新架構,有以下幾點一定要正確組合,任何一錯都會在執行時報錯:

1. 文字編碼器(最容易踩的坑)

  • LTXV 需要 Gemma3-12B(hidden 3840),不是 SDXL 那套 CLIP,也不是 T5-XXL。
  • ComfyUI 要的是單一 safetensors,內部同時含:權重重映射為 model.* 前綴 + spiece_model(sentencepiece tokenizer 原始 bytes)+ LTX 的 text_embedding_projection.* 四支張量(後者本來在 LTX checkpoint 裡,要撈出來合併)。
  • HF 上 google 官方 repo 是 gated、Lightricks 官方是 12+ 分片;實務上抓公開整包的 bf16(5 分片約 22.7GB),合併、key 重整後變成一台 25GB 的單檔,一次搞定。
  • FP4/NVFP4 量化版會撞 ComfyUI 的權重載入路徑('Linear' object has no attribute 'weight'),用 bf16 版。

2. VAE 用錯 = 影片只剩 1 幀

LTX checkpoint 自帶 VAE(vae.encoder/decoder),VAEDecode 要拿 [checkpoint, 2],不要外接 flux2-vae。接錯的症狀是:影片成功輸出,但 ffprobe 只看到 1 幀、尺寸縮半——很容易誤以為「生成成功」。

3. 參數(本次實測值)

  • EmptyLTXVLatentVideo:768 × 512(32 的倍數);幀數 8n+1(97 ≈ 3.9 秒 @25fps)
  • DualCLIPLoader:type=ltxv,clip1/clip2 都填同一支 Gemma3-12B
  • KSampler:cfg=1.0(LTX-2 是 guidance-free,別用 2-7 的舊值)、steps 20-25、euler/simple
  • SaveVideo:新版節點要求必填 format(mp4)

4. 圖→影片(img2vid)

可用「先生圖 → 上傳 /upload/image(會進 input/ 目錄)→ LoadImage 當第一幀」的做法,起幅最穩定。SVD-XL 也可走 img2vid,但品質舊一代;LTX 走 LTXVAddGuide/img2video 節點。

四、驗證清單(每次生成必做)

  • ffprobe 看 duration / nb_frames / 解析度——幀數=1 或尺寸縮半 = VAE 接錯
  • 抽中間幀肉眼確認(ffmpeg -ss N -frames:v 1)
  • 生成完 comfy-off,確認 RAM 還原

五、產出位置

  • 圖片:~/ComfyUI/output/
  • 影片:~/ComfyUI/output/video/
  • 本文章案例:落日黃昏 768×512 / 97 frames / H.264 MP4,本地生成 75 秒。

本文僅記錄自家環境的本地生成流程;模型版權屬原作者(LTX-2.3: Lightricks,Gemma: Google)。

2026年10月7日 星期三

用 SSH/ADB 遠端控制 Android 平板(Android on Raspberry Pi)完整記錄

把之前的文章 Raspberry Pi4 Project - Android system用我的gx10做控制

用 SSH/ADB 遠端控制 Android 平板(Android on Raspberry Pi)完整記錄

這台「平板」其實是一台跑 Android 15 on Raspberry Pi 4 的開發機(aosp_rpi4,userdebug build),區域網路 IP 固定 192.168.1.254。它的特殊之處:

  • Android 是 userdebug 版——有 su 0 可以直接進 root
  • 系統內建 root sshd(不是 Termux 開的),port 22
  • 金鑰放 /data/ssh/authorized_keys

本文記錄從 GX10 連到這台平板的完整步驟,以及過程中踩到的坑。

一、設備規格

項目 值
核心 Raspberry Pi 4(ARM64), Android 15(userdebug)
Kernel Linux 6.6
記憶體 7.6 GB
/data 分區 12 GB
IP 192.168.1.254(wlan0)
SSH

port 22,root 金鑰登入

二、連線前的準備(GX10 端)

1. 安裝 ADB client

GX10 是 Ubuntu 24.04 ARM64,adb 套件依賴舊的 OpenSSL 1.0,直接裝會缺庫。解法:

  • 從 Ubuntu bionic 的 android-tools-adb .deb 抽出 aarch64 的 adb 二進位
  • 搭配 bionic 的 libssl1.0(放 /tmp/ssl10/)
  • 建立 /home/gx/.local/bin/adb 包裝腳本,執行時設 LD_LIBRARY_PATH=/tmp/ssl10/ext/lib/aarch64-linux-gnu

2. 確認 SSH 金鑰

艦隊統一用 ~/.ssh/id_ed25519(同一支金鑰,所有設備)。

三、ADB 授權流程(最關鍵的一步)

adb devices -l
192.168.1.254:5555     device product:aosp_rpi4 model:Raspberry_Pi_4

坑: 第一次連上狀態是 offline,不是壞掉——是平板螢幕上彈著「允許從此電腦遠端調試嗎?」的對話框。

必做: 在平板上勾「永遠允許」→「允許」。否則永遠是 offline。(注意:離人時做這步會卡住,務必在平板前操作。)

四、找對 SSH 用戶(踩坑最多的部分)

坑 1:先試了十幾個用戶全被拒

pi / root / winson / user / shell / android ... 都 Permission denied。

解法:用 ADB 看 sshd 到底用誰跑

adb shell "ps -A | grep sshd -v grep"
root   2168   1   ...   S   sshd

→ sshd 是以 root 跑的。

坑 2:金鑰檔裡的公鑰「不是我的」

userdebug build 可以 su 0:

adb shell "su 0 sh -c 'wc -l /data/ssh/authorized_keys; cut -c1-40 /data/ssh/authorized_keys'"

檢查結果:檔裡有 5 支公鑰,沒有一支是 GX10 的——之前「已放金鑰」其實是另一台的。

坑 3:經 shell 貼多行文字會被轉義

解法:一律 base64 傳輸

KEY=$(cat ~/.ssh/id_ed25519.pub)
B64=$(printf '%s\n' "$KEY" | base64 -w0)
adb shell "su 0 sh -c 'echo $B64 | base64 -d >> /data/ssh/authorized_keys'"

放完立刻測:

ssh root@192.168.1.254 "id"
uid=0(root) gid=0(root)

✅ 成功。

五、使用方式

需求 指令
SSH ssh root@192.168.1.254(免密碼)
裝 APK adb install xxx.apk
截圖 adb exec-out screencap -p > screen.png
進 root 直接就是 root(免 su)
看 log adb logcat

六、注意事項(重點整理)

  1. ADB 授權框要人在場——沒按允許就是永遠 offline;重開機/清資料後權限可能被清,要重新授權
  2. root sshd 是安全敏感點——這是 userdebug 開發機,金鑰檔 /data/ssh/authorized_keys 等於 root 後門,只放自己人的公鑰;別用 password 登入
  3. 金鑰要對「這台」的金鑰檔核對——艦隊多台設備共用流程,但每台公鑰不同,放完一定要 ssh 驗證一次,並對照 cut -c1-40 確認是自己這支
  4. userdebug 的特性:有 su 0、adb root 可用,但不能當正式版用——升級 ROM、重刷後 sshd 服務可能不見
  5. IP 固定 192.168.1.254,走區網(wlan0),不在 Tailscale 上——GX10 須在區域網路內才連得到
  6. /data 只有 12G——裝模型/大檔案要挑,別當資料盤用

七、一句話總結

Android on Pi 平板 = ADB 授權(人在場)+ root sshd + 金鑰經 base64 放 /data/ssh/authorized_keys;userdebug 的 su 0 是找路徑的金鑰工具。放完公鑰先 ssh root@192.168.1.254 驗證,才算是真的接入艦隊。

2026年10月5日 星期一

Windows 11 接入 SSH 遠端控制:從 OpenSSH Server 到 TTS 中文朗讀的完整記錄

Windows 11 接入 SSH 遠端控制:從 OpenSSH Server 到 TTS 中文朗讀的完整記錄

ASUS Ascent GX10控制的第四台: windows 介面的 NB

AI fleet 第 5 台入列:WinsonNB(Windows 11 25H2、Ryzen 7 5900HS、RTX 3050 Ti)透過 Tailscale + 內建 OpenSSH Server,GX10 可以免密登入、遠端跑指令、甚至叫它喇叭念「XXX ,起床了」。

跟 Android 那台(Termux)不同,Windows 的 SSH 是官方內建的,不需要第三方套件——但坑一個不少。全部記錄如下。

一、目標機

項目 值
型號 WinsonNB(筆電)
系統 Windows 11 25H2(26200)
CPU AMD Ryzen 9 5900HS(8C/16T)
GPU NVIDIA RTX 3050 Ti + AMD Radeon 集顯
RAM 32 GB(實測時只剩 0.9 GB 可用,正有重任務在跑)
C 碟 288 GB NVMe,剩 169 GB
Tailnet 100.95.23.8

二、四步接入(實際走過的順序)

步驟 1:啟用 OpenSSH Server

Win+X → PowerShell(管理員):

# 確認功能(可能已預裝)
Get-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 | Select-Object State
# 若 NotPresent:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 啟動 + 自動
Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd
# 確認監聽
Get-NetTCPConnection -State Listen | Where-Object {$_.LocalPort -eq 22}

確認:0.0.0.0:22 和 [::]:22 都 LISTENING(雙 stack 正常)。

⚠️ 排查小坑:用 netstat -ano | findstr ":22 " 會被其他埠號包含 22 的項目(如 22112)誤導,以為有在監聽——要用 Get-NetTCPConnection -State Listen | Where LocalPort -eq 22 才準。

步驟 2:防火牆

New-NetFirewallRule -Name sshd -DisplayName "OpenSSH Server (sshd)" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

不加這條,tailnet 的探測會直接 timeout(我們的實測:規則建好前 22 埠從 GX10 連 = timeout,建好後秒開)。

步驟 3:放公鑰(最大的坑,見第五節)

步驟 4:驗證

# GX10 端
ssh winso@100.95.23.8 'whoami; hostname'
# → winsonnb\winso / WinsonNB

三、遠端能力(全部實測)

能力 方式 驗證
跑指令 ssh … "powershell -Command ..." ✅
讀資源(CPU/RAM/GPU/碟) WMI/CIM 指令 ✅ 抓到 5900HS + RTX 3050 Ti
TTS 中文朗讀 System.Speech.SpeechSynthesizer 內建,不需裝任何東西 ✅ 喇叭實播「XXX,起床了」
檔案傳輸 scp 雙向 ✅

TTS 關鍵腳本(Windows 內建,免安裝)

Add-Type -AssemblyName System.Speech
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
$synth.Speak("張瑞琪,起床了")

比 Android 的 termux-tts-speak 更乾淨——Windows 的 SAPI 聲音引擎選擇多(可選女聲/男聲/不同腔調)。

四、跟 Android 端對照

項目 Android(vivo) Windows 11
SSH server Termux openssh(第三方) 內建 OpenSSH(官方)
監聽埠 8022(慣例) 22(標準)
免密原理 authorized_keys authorized_keys(同一把)
TTS termux-tts-speak System.Speech(內建)
重開機保持 手動 boot script(vivo 會殺) systemd 對等:服務,穩
難度 7 坑 4 坑
拍相機 termux-camera-photo ✅ 要寫 MediaCapture(未做)

五、踩坑記錄(4 個,依發生順序)

坑 1:netstat -ano | findstr ":22 " 的假陽性

  • 現象:findstr 抓到 127.0.0.1:22112(某 app 的本地埠),以為 sshd 在監聽
  • 解法:改用 Get-NetTCPConnection -State Listen | Where {$_.LocalPort -eq 22}
  • 教訓:shell 的 substring grep 是排查網路問題的第一陷阱

坑 2:Set-Content 預設 UTF-16 BOM

  • 現象:公鑰檔「內容完全一樣」(hash 都算過)但 sshd 一律拒認
  • 真相:Windows PowerShell 5.1 的 Set-Content 預設用 UTF-16LE + BOM 寫檔,OpenSSH 不認
  • 解法:重寫時加 -Encoding ASCII(公鑰是純 ASCII,安全)
  • 教訓:跨平台放金鑰,編碼要顯式聲明——Pi/手機都是 LF+UTF-8,Win 預設 CRLF+UTF-16

坑 3:粘貼又丟字元(老坑重演)

  • 現象:92 vs 93 bytes,第三次出現這個問題了(手機那次是 92 vs 93)
  • 解法:不再貼——GX10 開 python3 -m http.server,Win 上一行 curl.exe -o ... http://100.69.83.97:port/id_ed25519.pub,SHA256 雙邊校驗(F3498230…995E67D 一致)
  • 教訓:「長字串跨機器」一律走檔案傳輸 + 雜湊校驗。這已是第三台機器驗證的方法,可靠率 3/3。

坑 4(★最深★):管理員的公鑰根本不在 authorized_keys

  • 現象:編碼修好了、hash 對了、權限收緊了(icacls 只留 winso/SYSTEM),還是 Permission denied,連續 4 次
  • 真相:用 sshd.exe -d -o LogLevel=DEBUG 前台跑除錯模式,一眼看到:
    user winso matched group list administrators at line 87
    trying public key file PROGRAMDATA/ssh/administrators_authorized_keys
    Could not open authorized keys ... No such file or directory

    Windows OpenSSH 的預設 sshd_config對管理員帳號有獨立規定:金鑰必須放 C:\ProgramData\ssh\administrators_authorized_keys,根本忽略 C:\Users\winso\.ssh\authorized_keys
  • 解法:
    powershell
    Copy-Item "$env:USERPROFILE\.ssh\authorized_keys" "$env:PROGRAMDATA\ssh\administrators_authorized_keys"
    icacls "$env:PROGRAMDATA\ssh\administrators_authorized_keys" /setowner "BUILTIN\Administrators"

    → 一次過,ssh winso@100.95.23.8 立刻登入成功
  • 教訓:
  • 卡住時,看 log 比猜快 100 倍——sshd.exe -d -E file.log 前台除錯模式,每條拒絕原因都寫得出來
  • Windows 的管理員/一般使用者金鑰路徑不同,這個差異官方文件藏得很深
  • 對一般使用者(非管理員),~/.ssh/authorized_keys 照常有效——這坑只咬管理員帳號

六、最終連線方式

# 任何 fleet 成員(或你任何裝置上裝 Tailscale):
ssh winso@100.95.23.8          # 免密, 22 埠

# 遠端跑 Powershell:
ssh winso@100.95.23.8 "powershell -NoProfile -Command 'hostname'"

七、fleet 全景(5 台)

裝置 角色 接入方式
GX10 6679(100.69.83.97) AI 大腦 本機
Pi 5(192.168.1.236 / tailnet) GPIO 現場控制 SSH key
Pi 3(100.123.106.93) 鏡面時鐘 SSH key + systemd mm2.service
vivo V2248(100.117.225.79:8022) 行動終端/相機 Termux + sshd
WinsonNB(100.95.23.8:22) Windows 桌面 + TTS 內建 OpenSSH

同一把公鑰(hermes-gx10,sha256 校驗)開五台門。任何一台上線,都能從 GX10 一鍵觸達。

八、總結

Windows 的 SSH 接入比 Android 簡單得多——官方套件、標準埠、官方 TTS。但坑的品質更高:UTF-16 編碼和管理員金鑰路徑這類問題,不出錯時一切正常,出錯時沒有任何提示,只能靠除錯模式 sshd + 讀 log破案。

核心教訓(全 fleet 通用,第三次驗證):
1. 長字串跨機器,永遠走檔案傳輸 + 雜湊校驗:Pi 3 / vivo / Win 三台,手貼失敗率 100%,HTTP 下載+SHA256 成功率 100%
2. 卡住時,啟用除錯模式看 log:比無限猜快幾個數量級
3. Windows 管理員 ≠ 一般使用者:SSH 金鑰路徑、icacls 權限模型都不同

下一步可以做的:Windows 版「遠端打雷」(同一支 WAV + Start-Process)、相機遠端拍攝(MediaCapture)、或把它接進 fleet 的排程(定時 TTS 叫起床)。

用 SSH 控制 Android 手機:從 Termux 安裝到遠端拍照的完整踩坑記錄

用 SSH 控制 Android 手機:從 Termux 安裝到遠端拍照的完整踩坑記錄

ASUS Ascent GX10控制的第三台: Android 手機

這台 vivo(V2248,Android 15)原本只是口袋裡的電話。今天把它變成 AI fleet 的第 4 台成員:GX10 可以透過 Tailscale 直接 SSH 進去,甚至叫它用後鏡頭拍一張照回傳,再用 AI 分析畫面——全部不經過任何雲端服務。

過程比預期長,踩了 7 個坑。全部記錄如下。

一、目標架構

GX10 (100.69.83.97)
   │  ssh u0_a343@100.117.225.79 -p 8022   (Tailnet, WireGuard 加密)
   ▼
vivo 手機 (Termux + openssh + termux-api)
   │  termux-camera-photo
   ▼
實體相機 → 拍照 → scp 回 GX10 → AI 視覺分析

核心思路:Android 沒有正式的「SSH server」,但 Termux 可以跑一套完整的 Linux 環境,裡面直接裝 openssh,就成了。加上 Tailscale,手機永遠是固定 IP、免開埠、任何網路可達——跟 Pi 3 同一套玩法。

二、手機端安裝(3 個 app)

App 來源 用途
Termux(主程式) F-Droid 或 GitHub(⚠️ 不能用 Play Store 版,已棄置) Linux 環境
Termux:API 同上 相機/麥克風/感測器等硬體橋接
Tailscale 任何 store 都可以 加密私有網路

⚠️ 前兩個必須同來源(F-Droid 裝主程式+副程式,GitHub 也成對裝)——簽名金鑰不同就互相拒絕通訊,這是 Termux 生態最常見的坑。

三、踩坑總表(7 個,依發生順序)

坑 1:ssh-host-config: command not found

  • 現象:pkg install openssh 成功、主機金鑰都生好了,但這支腳本找不到
  • 真相:openssh 10.x 的 Termux 封裝裡,ssh-host-config 是獨立套件的一部分,沒裝上不影響 sshd 本身
  • 解法:根本不需要這支——手動把金鑰放進 ~/.ssh/authorized_keys 就行,sshd 預設就讀那裡

坑 2:sv enable sshd / sv start sshd 全部失敗

  • 現象:unable to change to service directory: …/service: No such file or directory,錯誤路徑裡還雜訊亂入字元(「y」)
  • 真相:Termux 的開源版本沒有預設的 service 骨架;「雜訊字元」是手機輸入法在長命令黏貼時拆行掉字
  • 解法:繞過 sv——用 nohup 背景跑 + 自己寫 boot script(見第五節)

坑 3:長命令黏貼全部變調

  • 現象:rm -f file 報 missing operand、nohup … & sleep 2 報 Extra argument: sleep、ls -ld ~ 變 unknown option -- -、-e 參數被吞……同一台手機、同一條命令,重貼 3-5 次才有一次成功
  • 真相:黏貼是這次最大坑。長命令經過輸入法層時會拆字、吞引號、吞 - 參數
  • 解法:(a) 命令盡量拆短、一詞一詞手打;(b) 需要放檔案時改用「GX10 開 mini HTTP + 手機 curl 拉取」——完全免黏貼(坑 5 的核心解法)

坑 4:Connection refused × 2

  • 現象:每次我連都拒接
  • 真相:第一次是 sshd 沒啟動;第二次是跑 sshd 的前台視窗被關掉了——Android 的記憶體管理會清掉「看起來背景」的行程
  • 解法:最後用純前台 sshd -p 8022 -D -e 跑通(螢幕上一直能看到 Server listening on :: port 8022);常駐方案見第五節

坑 5:金鑰 92 bytes vs 93 bytes,連 3 次 Permission denied(★最終坑★)

  • 現象:sshd 在聽、埠通、權限 700/600 都對了,但所有金鑰都被拒;root、u0_a123 也試過都不對
  • 真相:我貼進去的公鑰少了一個字元(92 vs 93)——又是坑 3 的輸入法拆字,只是這次是內容被吃而不是命令,完全無從對齊
  • 解法(妙手):GX10 上一行命令開 python3 -m http.server 8931,手機上一行 curl 從尾網直接拉取:
curl -o ~/.ssh/authorized_keys http://100.69.83.97:8931/id_ed25519.pub

然後雙邊 sha256 校驗(f3498230…995e67d 逐字一致)→ 下一次 SSH 一次過。這是整篇文章最重要的一課:凡是「長字串跨機器」,永遠走傳輸驗證,不要靠手貼。

坑 6:termux-camera-photo: missing file argument / unknown option -f

  • 真相:這台裝的是老版 Termux:API(0.60 代號,官方已 0.53 重編),語法跟線上文件不符——老版用位置參數、沒有 -f
  • 解法:直接 cat 那支 sh 腳本看 usage,一行就知道:termux-camera-photo <output文件路徑>(絕對路徑)

坑 7:閃光燈 = 軟體層沒打開

  • 硬體:✅ 有(termux-camera-info 顯示 ON_ALWAYS_FLASH 能力)
  • 軟體:❌ 翻完 Termux:API 原始碼(CameraPhotoAPI.java)確認:接收器只讀 file 和 camera 兩個參數,沒有 FLASH_MODE
  • 嘗試:am start -a android.media.action.IMAGE_CAPTURE --ei android.intent.extra.FLASH_MODE 1 → vivo 相機 App 的相容性問題,照片不落盤
  • 結論:A 方案(原生相機 App 手動設「閃光燈常亮」+ Intent 跳轉)最實際;B 方案(自己寫 Camera2 小程序)成本高;C 方案(等上游加參數)最被動

四、最終就緒的連線方式

# 從 GX10(或任何尾網成員, 包含你的筆記本/iPhone 如果裝了 Tailscale):
ssh u0_a343@100.117.225.79 -p 8022

# 免密、公鑰登入 (ed25519: hermes-gx10, 93 bytes, sha256 已校驗)

五、常駐設定(重開機不死)

檔 作用
~/sshd-start 一鍵重啟:pkill→nohup sshd -p 8022 -D→ps 自我檢查,報 SSHd-OK 或完整錯誤
~/.termux/boot-script.sh 調 ~/sshd-start,Termux 重開機時自動觸發
電池優化(手動設) 設定→應用程式→Termux→電池→不受限(不設的話 Android 幾個小時後會殺 sshd)
自動重啟(手動設) Termux 選單→「自動啟動」打開

⚠️ 實測發現:sv 這套在 Termux 開源版不好使(~/.sv 不存在、$PREFIX/var/service 也找不到),所以用上面的手動 boot script 方案,穩定且可控。

六、手機資源盤點(連上後第一時間拿的)

項目 值
型號 vivo V2248
Android 15 (API 35)
SoC 聯發科 MT6833 (Dimensity 700)
CPU 8 核 aarch64
RAM 7.4 GB(可用 ~3.2 GB)
內部儲存 228 GB,已用 129 GB(57%)
Termux 套件 86 個
尾網 IP 100.117.225.79(固定, 永不变)

七、遠端相機——已驗證成功的命令

# 從 GX10 遠端叫拍照 (手機後鏡頭):
ssh u0_a343@100.117.225.79 -p 8022 \
  'termux-camera-photo /data/data/com.termux/files/home/shot.jpg'

# 拉回來 (照片 3060×4080, 940KB~2MB):
scp -P 8022 u0_a343@100.117.225.79:/data/data/com.termux/files/home/shot.jpg ./

# 前置鏡頭:
ssh … 'termux-camera-photo -c 1 /path/to/front.jpg'

已實拍兩張驗證:第一張 940K,第二張 2.0M(客廳夜景、沙發上有人的場景)。

七.5、遠端聲音——打雷、TTS 中文朗讀(實測通過)

同一條 SSH 通道,手機喇叭也能被遠端控制,有兩招都實測成功:

招一:遠端播放音效
1. GX10 上用 Python 合成一段 8 秒低頻滾雷 WAV(布朗噪聲 + 三記指數衰減包絡,352KB)
2. scp -P 8022 thunder.wav u0_a343@100.117.225.79:thunder.wav
3. ssh … 'termux-media-player play ~/thunder.wav' → 手機喇叭響「轟——隆隆隆」三記雷聲
4. 已重播兩次,兩次都 rc=0,用戶親耳確認

招二:遠端 TTS 中文朗讀

ssh u0_a343@100.117.225.79 -p 8022 'termux-tts-speak "張瑞琪,起床了"'

→ 手機喇叭直接念中文繁體(用 Android 系統 TTS 引擎),一詞 rc=0。

附帶能力:termux-volume 可遠端讀/改六條音軌(ring/music/alarm/notification/system/call)的音量;配合 cron 可做「定時叫起床」「遠端報時」「警報推送」。

⚠️ 小坑:
– termux-media-player 要寫 play <檔案> 子命令,直接帶檔案會報 Invalid cmd
– SCP 落點要用相對家目錄(如 u0_a343@…:thunder.wav),用絕對路徑 /sdcard/ 在 Termux 環境會落錯位置
– TTS 要送繁體——手機端的引擎對簡體轉換不一定準確(「張」送成「张」聲母會跑)

八、總結

最難的不是 sshd 本身——Termux 把它包得很完整。

真正難的有兩個:
1. 輸入法黏貼長字串會掉字——任何跨機器的金鑰/設定,都應該走檔案傳輸 + 雜湊校驗,不要靠手貼
2. Android 的「活著」需要主動維持——電池優化、自動重啟、boot script 三件事都要做到,sshd 才會像你 Pi 3 的 pm2 一樣穩定常駐

這台 vivo 現在是 fleet 的第 4 台:GX10(大腦)、Pi 5(GPIO 控制)、Pi 3(鏡面)、手機(行動終端 + 遠端相機)——同一個 Tailscale,同一套 SSH key,任何一台上都能跳進另外三台。