实操W103DFT-7102026-10-11

125 元的盒子
——把 FT-710 变成随时能用的远程电台

电台被绑在书桌上,是因为它的"面板"是一台电脑。这篇文章记录一条完整的路: 想要什么 → 一台远程电台服务端到底需要什么 → 与树莓派/小主机逐项对比 → 为什么是一台二手云电脑盒子 → 真机上把六个缺陷一个个摁掉(含一场从 4% 音频 覆盖率挖到根因的排查)→ 以及这 125 元最后买到了什么。

1. 想法:电台不该被绑在书桌上

一台 FT-710 摆在书桌上,它本体什么都不缺:CAT、USB 声卡、真实频谱都在机身上, 插一根 USB 线全给你。缺的是你在别处的时候,怎么用上它—— 在沙发上想听一会儿 40 米、在阳台上想调一下天线、出差在外想确认频率有没有被谁占了。

第一反应是远程桌面 / VNC。我们认真试过,然后放弃了,理由都很具体:

真正想要的形态是反过来的:服务端守在电台旁边,浏览器只是面板。 手机、平板、笔记本随便哪一台,打开一个网址就是一台能听、能看瀑布、能按 PTT 的电台。 这台服务端要:接住电台的 USB(串口 + 声卡 + 频谱)、编码音频、把状态推给浏览器、 常年通电而不吵不热。

2. 调研:这台服务端到底需要什么

先量化需求,再挑硬件。服务端是 Python(有 GIL),热路径基本跑在一个核上, 所以核心数帮不上忙,真正决定成败的是单线程性能。逐项列出来:

真正决定成败的 为什么
单线程性能 Python 服务端、音频编码、频谱解析都在一个事件循环里;多核只帮到别的进程
USB 口 ≥ 2 电台线一根;另一根留给天调、U 盘或键盘。这是最常见的翻车点
有线网口 每路客户端约 60 KB/s,百兆都富余;但 WiFi 抖动会直接变成音频断续
7×24 的功耗与散热 它要常年通电、放在电台旁边,风扇声与电费都算成本
价格与可得性 上面四条达标之后,这一条才是真正的决定因素

然后把这些候选的 CPU 拿去查实测单线程分(PassMark,单一来源、同一天抓取, 样本数一并列出——样本数少于 100 的那几行只能当参考):

处理器 单线程 TDP 样本数 服务端热路径 ≈
Intel N100 1879 6 W 4111 ~8%
AMD R1505G(HP t640) 1822 15 W 138 ~8%
Broadcom BCM2712(树莓派 5) 1813 — ⚠️ 4 ~8%
Intel Celeron J1900 653 10 W 881 ~22%
Intel Atom D525 293 13 W 336 ~49%

结论有点反直觉但很实用:算力几乎不是选型依据。从 2008 年的 Core 2 Duo 到今天的 N100,任何一台单线程能跑到 700 分以上的机器,都只占一个核的 15–45%;而 2 GB 内存、几百 MB 存储就够。 真正把项目卡住的从来不是 CPU,而是 USB 口数、网口、功耗,以及"这东西好不好买、好不好装"。

3. 对比:四条路,各自的真实代价

方案 好在哪里 代价
N100 小主机(新) 单线程最高、6 W、四核、有保修,唯一"不用算余量"的一档 价格最高(新机整机通常 500 元以上,还要配存储与电源)
二手瘦客户机(HP t640 / Dell Wyse 一类) 单线程与 N100 打平(1822 vs 1879)、15 W、企业淘汰量大、便宜 要挑型号:确认 USB 口数、存储形态、能否装 Linux;货源与成色看运气
树莓派 4 / 5 官方镜像、生态最厚、教程最多,几乎零移植 涨价与缺货;要另配电源/散热/存储;加上配件通常 400 元起
运营商盒子(ZTE W103D) 125 元二手价、<5 W、32 GB eMMC、自带两个 USB 与有线口 要自己刷系统:专属内核,不能升;100M 网口;WiFi 依赖社区驱动

注意最后一行和前三条的区别:前三者是"买来就能装",它是"买来还要把系统换成我们自己的"。 我们这边正好有 MRRC Modern 的服务端镜像,这件事才成立——这也是这篇文章里最花时间的部分。

4. 为什么是这台 125 元的盒子

先把话说清楚:它原本不是给火腿用的设备。它是一台运营商发的"云电脑终端"—— 中国移动/ZTE 的 W103D,出厂是安卓,用途是插上显示器当瘦客户端跑云端桌面。 我买它花了 125 元(二手),买它的理由很朴素:上面第 2 节的四条件,它全过。

中兴云电脑 W103D 的包装盒
包装上写的是「中兴云电脑 W103D / 云桌面终端 BAZ01 linux」——一台给云桌面用的终端,不是电台设备。
W103D 机身标签:产品型号 W103D,额定输入 5V 2A
认型号是第一步,也是唯一不能省的一步。要的是 ZTE W103D(Amlogic S905L3A)。同一批盒子里还有国科 GK6323、RK3566 等芯片的版本,外观几乎一样,而我们的镜像只认这一颗——买错了就是一块砖。
W103D 机身标签特写:型号、CMIIT ID、生产日期与序列号
买之前值得拍一张:标签上有型号、CMIIT ID、生产日期(2024.09)和序列号——确认手里这台到底是什么,这是最快的一条路。
W103D 本体,旁边放了一节 5 号电池做尺寸参照
体积:手掌大小,一节 5 号电池当参照(旁边那节是可充电的 eneloop)。额定输入 5V/2A,实测整机 < 5 W——常年开着,一年电费不到 30 元。
ZTE W103D 树莓派 4 树莓派 5
SoC S905L3A · 4×A53(顺序核) BCM2711 · 4×A72(乱序) BCM2712 · 4×A76(乱序)
内存 / 存储 2 GB / 32 GB eMMC 1–8 GB / microSD 4–8 GB / microSD·NVMe
网口 100 Mb 千兆 千兆
功耗 < 5 W ~3–7 W ~5–12 W
软件成熟度 专属内核,不能升 官方镜像,生态最厚 同左
代价要写明白:它的 WiFi(MT7663S)靠社区逆向的驱动与专属内核补丁, 内核一升就可能静默丢 WiFi(不报错,只是连不上);100M 网口够用但不是千兆; 系统要自己刷成 Armbian(ophub 的 s905l3a-w103d 变体,内核 6.18)。 换句话说:省下的钱,是用"自己动手"换的。愿意动手,这就是全场最便宜的方案。

5. 动手:从开箱到手机上的瀑布图

整条路五步,全部只用一根网线、一个 U 盘、一台能 SSH 的电脑:

开箱:盒子里是 W103D 本体与配件
开箱:本体 + USB-C 电源 + 线。它连 HDMI、网口、两个 USB 都是齐的。

① 写 U 盘

把镜像写到 U 盘(认准盘符,别烧错盘),插到盒子上:

W103D 插着 U 盘启动
U 盘插上、网线插上,就可以从 U 盘启动了。

② 从 U 盘启动(安卓一字节不动)

盒子通电,在安卓里执行一次 reboot update,它就从 U 盘启动。 这一步只改一次 u-boot 的启动顺序,不碰安卓的分区与数据—— 拔掉 U 盘重新上电,它还是原来那台安卓盒子。这是整个方案里我最喜欢的设计: 失败不用负责,因为什么都没动。

显示器上的 Armbian 首启横幅与 SSH 会话
第一次开机:HDMI 上看到 Armbian 横幅(S905L3a / 内核 6.18.54-ophub / 50 °C / 局域网 IP),同时 SSH 进去。首启不需要联网:口令、自签证书、串口探测都在本机做完,横幅上直接印出 Web 登录口令。

③ 接电台

FT-710 用上方那个 Enhanced 口接盒子,一根线一次给出三样东西: CAT 串口(/dev/ttyUSB0)、USB 声卡、以及真频谱用的 FT4222 接口。 用自带的命令切换机型:

ssh root@<盒子IP>
mrrc-radio use ft710        # 自动探测串口 → 写配置 → 重启服务
浏览器里的连接设置:电台型号 FT-710、串口、RX/TX 音频设备
浏览器里的连接设置页:机型、串口、接收/发射音频设备都在这里,改完即生效。

④ 手机上就是一台电台

手机浏览器里的 MRRC 界面:频谱、瀑布、功率与驻波表、PTT 按钮
这是 125 元买到的东西:手机浏览器里的真频谱 + 瀑布(不是合成的 S 表回退)、功率/驻波表、模式与滤波、以及那颗红色的 PTT。手机上要能发射必须走 HTTPS(浏览器只在安全上下文里给麦克风权限),所以镜像首启就签好了自签证书。

⑤ 刷进盒子自己(然后 U 盘就可以收起来了)

前面四步都还跑在 U 盘上。最后一步让它独立:在盒子上跑 ophub 自带的安装器, 它把正在运行的系统克隆进机身里那 28.9 GB 的 eMMC,连引导一起处理好。

armbian-ddbr            # 先备份整块 eMMC 到 /ddbr/(原厂引导也一起保住)
armbian-install         # 设备 ID 填 307(ZTE-W103D),根文件系统填 1(ext4)——不要加 -m yes
poweroff                # 拔掉 U 盘、重新上电:从此从 eMMC 启动

两件值得知道的事:安装器把原厂引导逐字节保住(只有 68 字节的分区表换成新的, 可以用 cmp 验证);它会重新生成 machine-id,所以盒子的 IPv6 接口标识会变一次—— 按名字找它的东西(DDNS、Cloud Hub 隧道)几分钟内自己跟上。

剩下就是最终形态:盒子、一根电源线、一根接电台的 USB 线——不需要 U 盘、不接显示器;28.9 GB 都是它自己的;而那根 U 盘留着当救砖盘(整盘备份就在里面)。

装完之后的样子:电源插上、电台的 USB 线插在口上,没有 U 盘
最终形态:电源插上、电台的线插在 USB 口,网络走 Wi-Fi——系统直接跑在机身 eMMC 上。

6. 能开机 ≠ 能用:真机拓出来的六个坑

镜像在容器里"构建成功、验收全绿",第一次真的烧进盒子、插上电台,还是一晚上拓出六处缺陷。 每一处都只在这套硬件上才会露头——这也是为什么我不相信"构建成功"这四个字。 六条后来全部改掉、加了回归守卫、并重出一版镜像(52 项验收全过); 第 8 节那张表就是修好之后逐项测出来的。

症状 根因
网页打不开,服务每 3 秒重启一次 首启以 root 生成 TLS 证书,私钥是 0600 root:root,而服务跑在 mrrc 用户下 ⇒ uvicorn 读不了私钥
真实频谱起不来(但 CAT 与声音都正常) FT4222 没有自己的 /dev 节点,库直接开 USB 设备,而节点是 root:root ⇒ 缺一条 udev 规则。半个故障最难判
HDMI 上看不到首启横幅(上面有口令) 单元里写了 StandardOutput=console——这不是合法的 systemd 语法,systemd 只是默默忽略它
盒子里的配置带着构建机的串口 安装脚本在构建主机上写的配置文件被原样搬进镜像(那台上是我 Mac 的 /dev/cu.SLAB_USBtoUART)
新盒子上总有一颗红灯 Debian 自带的 dnsmasq.service 与 systemd-resolved 抢 53 端口(热点用的是 NetworkManager 自带实例)
验收脚本说一个正在运行的单元"未安装" systemctl list-unit-files | grep -q 在 pipefail 下因 SIGPIPE 返回 141:grep 命中即退出,systemctl 收到 SIGPIPE,"找到了"被判成"没找到"

音频那一仗(值得单独说)

电台接上之后,浏览器里的声音卡顿得厉害:先是碎,后来干脆没有。 第一反应是网络、是浏览器、是发射干扰——全错。用服务自己的音频代码在服务外做对照实验, 数据是这样的:

读法 实际拿到的音频
服务原样(20 ms 一个周期) 4%,并且约 60 秒后永久停摆
同一份代码,读得激进一点 100%
同一份代码,把缓冲加大到 400 ms 99.7%
修好后(缓冲 100 ms) 100%,50 帧/秒、帧间隔 20 ms,连续稳定

根因是这台盒子的宿主音频缓冲只有一两个 20 ms 周期:读得稍慢就溢出, 而溢出之后——最容易骗人的地方——采集接口静默停摆:系统层面显示"停止", 但音频库仍然报告"流是打开的",不抛异常,日志里一个字都没有。 macOS 与 Windows 的驱动层缓冲大得多,所以同一份代码在台式机上永远看不见这个坑。

修法两条:把采集缓冲按平台调到 100 ms(MRRC_RX_BUFFER_MS), 再加一个静默看门狗——有人在听却连续 3 秒读不到音频,就打日志并重开采集流。 前者让问题不再发生,后者让它下次发生时看得见、并且自愈。

7. 值不值:125 元买到了什么

买到的 说明
任何设备都是电台面板 手机、平板、笔记本(连同型号的 Android 客户端)打开一个网址就能听、看真频谱、按 PTT;服务端守在电台旁边,不占书桌
成本 盒子 125 元 + 一个 U 盘(本来就有);对比:树莓派方案加上电源/散热/存储通常 400 元起,N100 小主机 500 元以上
常年开着的代价 < 5 W,一年电费不到 30 元;被动散热,没有风扇声
还能顺手干别的 同一台上还跑着通联录音(已实测,见第 8 节);接了 ATR-1000 天调就能联动(本机未接);还能给朋友开一个只听口令
往外走一步 接上 Cloud Hub(出站隧道 + 每实例证书)之后,它就从"局域网里的电台"变成公网可达的电台:详见云端的第一公里

最实在的一条:电台回到了它该在的位置——书桌上那个位置只负责接天线和电源, 至于"谁在用它、从哪里用",交给浏览器。家里谁想听一会儿短波,给个只听口令就行; 自己在外地,打开浏览器就是那台熟悉的 FT-710。

W103D 盒子安静地待在电台桌面上
它最终的位置:电台旁边,不占显示器的位置,不占书桌的中心,也不用谁去关它——接上电源和网线之后,它就只是一台"一直在"的小盒子。

8. 实测清单:它现在能做到什么

上线当天把每一项都真做了一遍。下面不是"应该可以",是日志里的数字:

能力 实测证据
CAT 控制 频率/模式/滤波/ATT/PRE 实时回读,40 m 上轮询稳定(7.050–7.053 MHz、LSB、2.4 kHz)
接收音频 50.0 帧/秒、帧间隔 20 ms、Opus 约 52 kbps,手机浏览器里连续听
发射 手机麦克风 → 服务端 → 电台 USB 声卡:一次 62 帧、peak=100%、写入电台 57 帧, decode_fail=0、write_err=0、queue_drops=0; 电台被键控并回读出 TX 表(PWR/SWR/ALC)
通联录音 recordings/ 里留下两个 MP3:07050kHz_20261011_102001.mp3 (134.7 秒、64 kbps)与一个短片段(199 KB)
真频谱 first frame received — spectrum active——FT4222 的真实频谱,不是 S 表合成谱
Web 界面 HTTPS + 自签证书,手机/平板/笔记本都开过;访客可以给一个只听口令
7×24 断电搬机再上电,systemd 自己拉起来;<5 W,被动散热
它自己的存储 armbian-install 把运行中的系统搬进了机身 28.9 GB eMMC;不插 U 盘也能启动, 且原厂引导逐字节核验过(cmp 比 [0,444) 与 [512,4 MiB) 两段,只有 68 字节分区表不同)
公网接入 已上 Cloud Hub:https://<呼号>.mrrc.vlsc.net/ 用 hub 签发的证书提供 HTTPS; 另有一个 DDNS 域名一直追着盒子的 IPv6 地址

公网接入也已经通了。Cloud Hub 给盒子一个呼号入口 (https://<呼号>.mrrc.vlsc.net/,例:https://bg1sb.mrrc.vlsc.net/), 自带证书,手机界面跟着你出家门;给客人还可以单发一个只听口令。 局域网那边没有任何变化——它依然是全部在干活的那个。

用手机通过 Cloud Hub 入口打开 MRRC
公网入口,手机上打开:界面和瀑布图与局域网里一模一样。

写于 2026-10-11,就是这台盒子上线的那天;同一天里把接收、发射、频谱、录音、手机控制 逐项实测通过(第 8 节附的就是那一天的日志数字)。文中的数据全部来自当天的日志、提交与产物校验, 包括那六个缺陷各自的判定命令。 2026-10-12 更新:补上第五步(装进盒子自己的存储)与公网接入。 镜像可以从 下载页取, 逐步操作见 W103D 完整指南。
English: A ¥125 box as my FT-710's remote server