远程串口

远程串口(Cloud Relay)

跨 NAT 的透明字节管道:参数、控制线和协议流全部成立。

本页内容

远程串口(Cloud Relay)

Cloud Relay 让一台机器上的物理串口,在另一台机器的软件里表现为一个真正的端口。现场机器共享端口,操作机器新建一个类型为远程串口(Cloud Relay)的连接,中间的云端只转发字节、不读取内容。

两端都向云端出站连接,所以它和 Cloud Console 一样,现场在 NAT 后面、没有公网地址、不开入站端口也能用。差别在于链路上跑的东西:Cloud Console 是浏览器里的实时窗口——文本事件、限帧、以看为主;Cloud Relay 是端到端跑 RFC 2217 的透明字节管道,本地端口能做的事它都能做:

  • 在操作侧修改波特率、数据格式和流控,也可以选择沿用远端串口自己的配置。
  • 控制 DTR/RTS 和 Break;控制线指示灯跟随远端串口的调制解调器信号。
  • 协议流原样成立——Modbus RTU 轮询、XMODEM/YMODEM 文件传输、固件升级。

默认情况下两台机器登录同一个账号:只能中继到自己名下的设备。要让没有账号的同事接进来,用邀请码。这条路径与 RFC 2217、透明 TCP 转发、Cloud Console 的取舍,见远程访问方案选型

共享端口(现场一侧)

  1. 在软件内登录账号(Cloud 菜单 → Sign In)。
  2. 勾选 Cloud → Cloud Console。中继复用同一条云端在线通道,所以总开关必须先开;它下面的授权开关在总开关关闭时是灰的。
  3. 勾选 Cloud → Allow Cloud Relay。默认关闭,并且刻意不被 Allow Remote Send 或 Allow Remote Port Control 隐含——中继交出的是整个端口。
  4. 打开要共享的串口连接。只有串口连接会被列为可中继:RFC 2217 描述的就是串口,TCP/UDP 端点没有它能控制的东西。

操作者占用端口期间,状态栏会显示"A remote operator is using this port",本地窗口照常显示数据——没有本地发送者的流量是一次接管,你应该看得见它。取消勾选 Allow Cloud Relay 会立即结束本机所有中继。

在另一台机器上使用(操作一侧)

  1. 用同一个账号登录。
  2. 在连接设置里把端口类型选为远程串口(Cloud Relay)
  3. 在"Select a Remote Serial Port"对话框里选目标。它列出你在线的设备和各自的串口,并标出共享侧未允许中继的端口。端口列表是按需向设备索取的,填充可能要几秒——设备走慢速轮询时最长约 30 秒。
  4. 决定串口参数由谁定——规则与 RFC 2217 客户端相同:保持勾选"沿用远端配置"就不动现场的设置,取消勾选则在连接建立时下发你自己的波特率和数据格式。
  5. 启动连接。状态栏先显示"Cloud Relay · 端口 · connecting",两端配对成功后变为"connected"。

之后它就是一个普通连接:Text/HEX 收发、时间戳、日志、控制线、CRC 工具和文件传输全部可用,也可以像任何端口一样再桥接出去。

无界面机器上的共享(spu 命令)

现场机器不需要桌面会话。直接下载版在 GUI 旁边附带一个小的控制台程序 spu(Mac App Store 版不包含):

spu -l                                   # 列出本机串口
spu login --email user@example.com       # 登录;密码提示输入、不回显
spu -D /dev/ttyUSB0 -b 115200            # 本地裸终端(stdin ↔ 串口)
spu -D /dev/ttyUSB0 -b 115200 --share    # 把这个端口共享到 Cloud Relay

spu login 把账号会话存进与 GUI 相同的配置;写进脚本时用 --password-stdin 从管道读密码,不要把密码放在命令行上。-S / --share 打开端口并只开启中继授权——没有 Cloud Console 数据流、没有远程发送、没有通用端口控制命令——而且它只做共享侧:永远不会选择或拨向另一台机器的端口。空闲的共享代理只是一个控制面在线状态,在操作者真正接入端口之前,什么都不采集、不上传。

与同事共享(远程协助)

上面两节讲的是你自己的两台机器。要让没有账号的同事接进来一起分析,用邀请码——现场这台机器为一个已打开的串口签发一张有时限的码,同事在他自己的软件里粘贴,就得到与你完全相同的那个真端口。他不需要注册、不需要订阅、不需要绑定设备;流量与 Pro 授权仍然记在你这边,因为交出端口和付账的都是你。

签发(现场一侧)

  1. 登录账号并勾选 Cloud → Cloud Console(邀请码走的是同一条云端通道)。
  2. 打开要共享的串口,点 Cloud → 分享串口给访客…
  3. 选有效期(1 / 4 / 12 / 24 小时,默认 12 小时),需要时设一个口令,写一句同事能认出来的标签,点「生成邀请码」。
  4. XXXX-XXXX-XXXX 或那条链接发给他。口令请另发一条消息——和码写在一起就失去意义了。

这个动作与 Allow Cloud Relay 互不隐含:那个开关管的是"我自己名下的其他机器",邀请码管的是"拿着这张码的这个人、这个口、这段时间"。分享随端口关闭、Cloud Console 关闭、退出登录或程序退出而结束。

加入(同事一侧)

  1. 在连接设置里把端口类型选为远程串口(Cloud Relay)
  2. 在「Select a Remote Serial Port」对话框顶部的用邀请码加入里粘贴码或整条链接,填一个主人能认出的名字,需要时填口令。
  3. 启动连接。对话框会先显示这张码指向哪台机器的哪个口、是否在线、是否已被占用。

无界面机器spu --invite 做同一件事:

spu -D /dev/ttyUSB0 -b 115200 --invite --invite-label "工位 3"
spu: invite code ABCD-EFGH-JKLM   link https://alithon.com/r/ABCD-EFGH-JKLM   expires 2026-08-21 18:00

--invite-ttl 接受 30m / 4h / 1d(默认 12h),--invite-passcode-stdin 从管道读口令而不写在命令行上,Ctrl-C 退出时撤销邀请。它与 --share 可以同时给,两者是各自独立的同意。

主人始终握着的东西

  • 状态栏显示「访客 张三 正在使用此串口」——被别人驱动的串口必须看得出来,还要看得出是谁。
  • 分享对话框里随时可以「断开访客」或「停止分享」;停止分享会同时结束正在进行的会话并作废那张码。
  • 网页端「云同步 → 云控制台」的设备页也列出本机在活的分享,可以远程撤销——但不能创建:签发即授权,授权只能发生在拥有那个串口的机器上。
  • 口令连续输错 5 次,这张码会被烧掉;到期的码不再接受新的加入,但不会切断已经在进行的会话——半途掐断一次固件升级是最坏的结果。
  • 未知、过期与已撤销的码,对外是同一个答复,所以别人无法拿它探测哪些码曾经存在。

使用须知

  • 一个端口同时只有一条中继。第二个操作者请求已被占用的端口会得到响亮的失败,而不是悄悄共享一条各看到一半回复的字节流。
  • 中继断了就是断了——任一端掉线、会话被对侧关闭——不会自动重拨,需要你主动再次启动连接。
  • 中继按会话限速。超过限额的流量会以真正的背压向源头节流,并出现短暂的"rate limited"提示;每个会话还有数据总量上限,达到后会话关闭。
  • 常见的打开失败:共享侧的 Allow Cloud Relay 没开(permission_denied)、端口已在中继(relay_busy)、设备离线,或账号没有有效的 Pro 授权。
  • 除时序之外,线上流量与直连 RFC 2217 完全一致——逐字节相同,包括转义。

流量、配额与订阅

  • Cloud Relay 需要 Pro 授权——付费许可证或有效订阅。它按用量计费,而不是按设备数量:一条忘了关的满速会话几分钟就能耗尽免费额度。
  • 中继字节计入与 Cloud Console 相同的月度云流量额度和充值余额,没有单独的中继配额。
  • 用这个数做预算:115200 8N1 双向满速约 22.5 KB/s——大约每小时 81 MB。多数调试会话远低于此,但繁忙的二进制流不是。

安全与隐私

  • 共享默认关闭,授权在拥有端口的那台机器上;网页和云端都无法远程替它打开。
  • 两条链路都是出站加密连接。中继只配对同一账号的两台机器,或一台机器与它自己签发的邀请码的持有者——两者都由拥有端口的那台机器授权。
  • 在已接受的中继里,修改串口参数和控制 DTR/RTS/Break 是"交出端口"的应有之义——只在可以接受这一点的场合开启 Allow Cloud Relay。
  • 关闭 Allow Cloud Relay 或退出登录会立即结束所有中继。相关数据流在隐私政策中有完整说明。

这篇文档是否有帮助?