Document NSSM (fawno/nssm.cc rebuild) as an alternative to WinSW for wrapping frpc/ser2net, with a WinSW-vs-NSSM recommendation. Add gensiot as a native RFC 2217 client alongside pySerial, noting it is optional for a server-only deployment. Update references. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
11 KiB
Windows 串口服务器部署
本文仅说明 Windows 上将物理 COM 口发布为 RFC 2217 或原始 TCP 串口服务的方法。FRP 客户端配置、服务安装和防火墙规则请参阅 FRP 客户端部署指南。
方案比较与建议
| 方案 | 适用场景 | RFC 2217 | Windows 服务 | 主要注意事项 |
|---|---|---|---|---|
原生 Windows ser2net |
可控制安装环境的开源生产部署 | 支持 | 需使用 WinSW 等包装器 | 必须安装相互匹配的 ser2net/gensio 版本 |
hub4com |
快速开源实验或维护旧部署 | 支持 | 需使用外部包装器 | 上游最后一个版本发布于 2012 年 |
| HHD TCP/IP Serial Ports Server | 偏好 GUI 的商业部署 | 支持 | 内置 | 运行主机需要 HHD Virtual Serial Port Tools 许可证 |
| FabulaTech Serial Port Redirector | 需要持续维护和厂商支持的商业部署 | 支持 | 内置 | 收费,按容量授权 |
建议如下:
- 新建开源生产环境:优先使用原生 Windows
ser2net。 - 快速实验室验证:
hub4com配置最简单,但必须评估其年代和稳定性限制。 - 需要 GUI、原生服务管理和商业支持:优先评估 FabulaTech。
1. 安装转换器并确认 COM 口
使用 Windows Update 或芯片厂商提供的已签名驱动。不要在未确认硬件型号时尝试安装 FTDI、WCH 等不同厂商的驱动;应先检查硬件 ID。
在“设备管理器”中展开“端口(COM 和 LPT)”,选中转换器并打开“属性 → 详细信息”。记录以下信息:
- COM 名称;
- 包含 VID、PID 的硬件 ID;
- 设备实例路径;
- USB 序列号(如有);
- 容器 ID;
- 位置路径。
使用 PowerShell 盘点当前端口:
Get-PnpDevice -Class Ports -PresentOnly |
Sort-Object FriendlyName |
Format-Table Status, FriendlyName, InstanceId -AutoSize
Get-CimInstance -ClassName Win32_SerialPort |
Select-Object DeviceID, Name, Description, PNPDeviceID |
Format-Table -AutoSize
也可使用 pySerial 查看更详细的信息:
py -m pip install pyserial
py -m serial.tools.list_ports -v
COM 编号只是 Windows 分配结果,不是持久的硬件身份。具有唯一序列号的 FTDI 转换器通常能稳定保留编号,但部分低价转换器没有序列号,或多个设备使用重复序列号。若无法通过序列号区分同型号设备,应固定其物理 USB 插口并记录位置路径。
端口编号达到 COM10 及以上时,各工具使用的写法不同:
- 原生 Windows API:
\\.\COM10 ser2net/gensio://./COM10- pySerial:
COM10
2. 方案 A:原生 Windows ser2net
2.1 安装 ser2net 和 gensio
截至 2026 年 7 月,上游(Corey Minyard 的 ser2net / gensio 项目)在各自 GitHub 发布页提供原生 Windows 安装包:
ser2net4.6.7(Windows 安装包在该 release 的 Assets 中);gensio3.0.2(同上)。
最新版本见 ser2net releases 与 gensio releases。
预编译包之间存在版本耦合,应安装同期配套版本,不要任意混用:
Gensio-3.0.2-windows.exeSer2Net-4.6.7-windows.exe
使用更新版本前先检查上游发布说明,配套版本号会随时间变化。原生安装包使用 MinGW/UCRT 运行时 DLL,但运行时不需要 MSYS2 shell。
默认配置文件通常位于:
C:\Program Files\Ser2Net\etc\ser2net\ser2net.yaml
以管理员身份创建或编辑该文件。
2.2 配置 COM3 的 RFC 2217 服务
新部署应使用现代的 version-2 YAML:
%YAML 1.1
---
connections:
com3:
accepter: telnet(rfc2217),tcp,127.0.0.1,2217
connector: serialdev,//./COM3,115200n81
该配置具有以下行为:
- 仅监听 IPv4 回环地址;
- 允许同一 Windows 主机上的隧道客户端连接;
- 不会额外在局域网接口上暴露通配监听器;
- COM3 初始参数为 115200 波特、无校验、8 数据位、1 停止位;
- 兼容的 RFC 2217 客户端可远程修改串口参数。
旧的 version-1 写法仍可被 ser2net 接受:
connection: &com3
accepter: telnet(rfc2217),tcp,127.0.0.1,2217
connector: serialdev,//./COM3,115200n81
但 version 1 有意不遵循标准 YAML。新部署必须优先使用 connections: 映射。
若只需要原始 TCP,不需要远程调整串口参数,可删除 telnet(rfc2217):
%YAML 1.1
---
connections:
com3-raw:
accepter: tcp,127.0.0.1,2217
connector: serialdev,//./COM3,115200n81
远端客户端需要选择波特率时,不要使用原始 TCP 模式。
2.3 交互式本机测试
创建服务前,先在管理员 PowerShell 中前台运行:
& 'C:\Program Files\Ser2Net\bin\ser2net.exe' `
-d `
-c 'C:\Program Files\Ser2Net\etc\ser2net\ser2net.yaml'
-d 会保持前台运行并输出诊断信息。测试完成后按 Ctrl-C 停止。
若已安装 gensio 客户端工具,可测试本机协议栈:
gensiot 'telnet(rfc2217),tcp,127.0.0.1,2217'
仅能建立原始 TCP 连接,不能证明 RFC 2217 完整可用;还必须使用 pySerial 等兼容客户端实际测试一次波特率变更。
2.4 使用 WinSW 注册 Windows 服务
官方 Windows ser2net 安装程序不会创建原生 Windows 服务。不要使用 sc.exe create 直接注册 ser2net.exe:它是控制台程序,没有实现 Windows Service Control Manager 生命周期。
使用 WinSW 等服务包装器:
- 将稳定版 WinSW 放在
ser2net.exe所在目录。 - 将 WinSW 重命名为
ser2net-service.exe。 - 在同一目录创建同名配置文件
ser2net-service.xml:
<service>
<id>ser2net-rfc2217</id>
<name>ser2net RFC 2217</name>
<description>Exports Windows COM ports through RFC 2217</description>
<executable>%BASE%\ser2net.exe</executable>
<arguments>-n -c "%BASE%\..\etc\ser2net\ser2net.yaml"</arguments>
<workingdirectory>%BASE%</workingdirectory>
<logpath>C:\ProgramData\Ser2Net\logs</logpath>
<log mode="roll" />
<onfailure action="restart" delay="10 sec" />
<resetfailure>1 hour</resetfailure>
</service>
在管理员 PowerShell 中创建日志目录,然后安装、启动并检查服务:
New-Item -ItemType Directory -Force C:\ProgramData\Ser2Net\logs
& 'C:\Program Files\Ser2Net\bin\ser2net-service.exe' install
& 'C:\Program Files\Ser2Net\bin\ser2net-service.exe' start
& 'C:\Program Files\Ser2Net\bin\ser2net-service.exe' status
上述示例为简化部署而使用 WinSW 默认服务账户。生产环境应改用专用的最小权限服务身份,只授予必要的程序文件、配置文件和日志目录访问权限。
也可以用 NSSM 代替 WinSW 包装 ser2net.exe,命令模式与 FRP 客户端部署指南的 NSSM 小节 一致,只需替换可执行文件与参数。
3. 方案 B:hub4com
com0com 项目包含提供 RFC 2217 功能的 hub4com 包装器。若发布的是现有物理 COM 口,不需要创建 com0com 虚拟串口对。
上游基础示例为:
com2tcp-rfc2217 COM3 7001
该命令默认监听所有 IPv4 接口。供本机隧道客户端使用时,应显式绑定回环地址并使用规范 COM 写法:
com2tcp-rfc2217 --interface 127.0.0.1 \\.\COM3 7001
高编号端口(例如 COM17):
com2tcp-rfc2217 --interface 127.0.0.1 \\.\COM17 7001
包装器默认会持续占用物理 COM 口。若只希望在网络客户端已连接时打开串口,可使用:
com2tcp-rfc2217 --interface 127.0.0.1 --share-com-port \\.\COM3 7001
仅在业务确实要求连接间释放端口时使用 --share-com-port;该选项不代表多个进程可以安全地并发占用同一串口。
3.1 限制与服务化
- 上游最新
hub4com版本为 2012 年发布的 2.1.0.0。 - 分发的可执行文件是 32 位控制台程序。
- 不内置 Windows 服务宿主。
- 不提供 TLS、身份认证或访问控制。
- 必须在实际部署镜像上验证现代 Windows、USB 重连、睡眠/恢复、服务账户和长时间运行行为。
只需要发布物理 COM 口时,不要安装 com0com 内核驱动。已签名的 com0com 驱动只在创建虚拟 COM 对时需要,典型场景是 Windows 客户端必须向旧应用呈现本地 COM 口。
服务化时可沿用前述 WinSW 模式:将 com2tcp-rfc2217 包装命令拆分为 WinSW 的 executable 和 arguments,并将 working directory 指向解压后的 hub4com 目录,确保可执行文件和插件能被找到。上线前应启用失败重启,并执行冷启动、USB 重插和睡眠恢复测试。
4. 方案 C:商业 GUI 产品
4.1 HHD TCP/IP Serial Ports Server
HHD TCP/IP Serial Ports Server 可将现有物理或 USB COM 口发布为原始 TCP 或 RFC 2217,并提供 GUI、命令行管理和内置 Windows 服务安装能力。
安装为服务:
psip_server.exe -install-service
文档给出的独立端口映射命令为:
psip_server.exe COM5=11111
省略协议时默认使用 RFC 2217;,raw 用于选择原始 TCP。
部署前必须确认以下限制:
- 根据厂商文档,服务会监听所有可用网络接口。如果预期只通过隧道访问,必须限制其局域网直接访问。
- 当前公开的服务器文档中未验证到内置 TLS 功能。
- HHD 的再分发文档说明:运行 TCP/IP Serial Ports Server 的计算机需要 Virtual Serial Port Tools 许可证。
- HHD 另有一个限制条件不同的 Free Virtual Serial Ports 产品;不能据此假定 TCP/IP Serial Ports Server 已获得生产许可。
部署前向 HHD 确认当前试用条款和生产授权条件。
4.2 FabulaTech Serial Port Redirector
应选用 Serial Port Redirector,而不是 Network Serial Port Kit。该产品支持:
- 物理 COM 口服务器模式;
- RFC 2217 和原始 TCP;
- GUI 和
SPRCmd.exe配置; - 作为 Windows 系统服务在用户登录前运行;
- x86、x64 和 ARM64 安装包;
- 厂商所述的可选证书式 SSL,以及可选客户端认证。
文档中的物理串口服务器命令为:
SPRCmd.exe setserver telnet-bin 3 7001 physical
该语法可能随产品版本变化;自动化前必须用已安装版本的帮助信息复核。
FabulaTech 是按容量收费的商业产品,试用期有限。公开说明没有完全明确试用期间物理服务器端口的计数方式,应向厂商确认。厂商将加密传输称为“SSL”,但已审阅的公开资料未说明实际启用的 TLS 协议版本和密码套件基线;如涉及合规要求,必须单独验证。
5. 故障排查
Windows 侧的常见问题——COM 口占用或拒绝访问、重新连接后 COM 编号变化、开机时序(服务早于 USB 枚举)、hub4com 意外监听 LAN、原生 ser2net 无法加载 DLL——集中在 故障排查 一页的“Windows 特定问题”一节,此处不再重复。