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>
285 lines
11 KiB
Markdown
285 lines
11 KiB
Markdown
[返回首页](../README.md)
|
||
|
||
# Windows 串口服务器部署
|
||
|
||
本文仅说明 Windows 上将物理 COM 口发布为 RFC 2217 或原始 TCP 串口服务的方法。FRP 客户端配置、服务安装和防火墙规则请参阅 [FRP 客户端部署指南](frpc.md)。
|
||
|
||
## 方案比较与建议
|
||
|
||
| 方案 | 适用场景 | 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 盘点当前端口:
|
||
|
||
```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 查看更详细的信息:
|
||
|
||
```powershell
|
||
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 安装包:
|
||
|
||
- [`ser2net` 4.6.7](https://github.com/cminyard/ser2net/releases/tag/v4.6.7)(Windows 安装包在该 release 的 Assets 中);
|
||
- [`gensio` 3.0.2](https://github.com/cminyard/gensio/releases/tag/v3.0.2)(同上)。
|
||
|
||
最新版本见 [ser2net releases](https://github.com/cminyard/ser2net/releases) 与 [gensio releases](https://github.com/cminyard/gensio/releases)。
|
||
|
||
预编译包之间存在版本耦合,应安装同期配套版本,不要任意混用:
|
||
|
||
1. `Gensio-3.0.2-windows.exe`
|
||
2. `Ser2Net-4.6.7-windows.exe`
|
||
|
||
使用更新版本前先检查上游发布说明,配套版本号会随时间变化。原生安装包使用 MinGW/UCRT 运行时 DLL,但运行时不需要 MSYS2 shell。
|
||
|
||
默认配置文件通常位于:
|
||
|
||
```text
|
||
C:\Program Files\Ser2Net\etc\ser2net\ser2net.yaml
|
||
```
|
||
|
||
以管理员身份创建或编辑该文件。
|
||
|
||
### 2.2 配置 COM3 的 RFC 2217 服务
|
||
|
||
新部署应使用现代的 version-2 YAML:
|
||
|
||
```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` 接受:
|
||
|
||
```yaml
|
||
connection: &com3
|
||
accepter: telnet(rfc2217),tcp,127.0.0.1,2217
|
||
connector: serialdev,//./COM3,115200n81
|
||
```
|
||
|
||
但 version 1 有意不遵循标准 YAML。新部署必须优先使用 `connections:` 映射。
|
||
|
||
若只需要原始 TCP,不需要远程调整串口参数,可删除 `telnet(rfc2217)`:
|
||
|
||
```yaml
|
||
%YAML 1.1
|
||
---
|
||
connections:
|
||
com3-raw:
|
||
accepter: tcp,127.0.0.1,2217
|
||
connector: serialdev,//./COM3,115200n81
|
||
```
|
||
|
||
远端客户端需要选择波特率时,不要使用原始 TCP 模式。
|
||
|
||
### 2.3 交互式本机测试
|
||
|
||
创建服务前,先在管理员 PowerShell 中前台运行:
|
||
|
||
```powershell
|
||
& 'C:\Program Files\Ser2Net\bin\ser2net.exe' `
|
||
-d `
|
||
-c 'C:\Program Files\Ser2Net\etc\ser2net\ser2net.yaml'
|
||
```
|
||
|
||
`-d` 会保持前台运行并输出诊断信息。测试完成后按 `Ctrl-C` 停止。
|
||
|
||
若已安装 gensio 客户端工具,可测试本机协议栈:
|
||
|
||
```powershell
|
||
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](https://github.com/winsw/winsw) 等服务包装器:
|
||
|
||
1. 将稳定版 WinSW 放在 `ser2net.exe` 所在目录。
|
||
2. 将 WinSW 重命名为 `ser2net-service.exe`。
|
||
3. 在同一目录创建同名配置文件 `ser2net-service.xml`:
|
||
|
||
```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 中创建日志目录,然后安装、启动并检查服务:
|
||
|
||
```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 小节](frpc.md#4-备选使用-nssm) 一致,只需替换可执行文件与参数。
|
||
|
||
## 3. 方案 B:hub4com
|
||
|
||
com0com 项目包含提供 RFC 2217 功能的 `hub4com` 包装器。若发布的是现有物理 COM 口,不需要创建 com0com 虚拟串口对。
|
||
|
||
上游基础示例为:
|
||
|
||
```bat
|
||
com2tcp-rfc2217 COM3 7001
|
||
```
|
||
|
||
该命令默认监听所有 IPv4 接口。供本机隧道客户端使用时,应显式绑定回环地址并使用规范 COM 写法:
|
||
|
||
```bat
|
||
com2tcp-rfc2217 --interface 127.0.0.1 \\.\COM3 7001
|
||
```
|
||
|
||
高编号端口(例如 COM17):
|
||
|
||
```bat
|
||
com2tcp-rfc2217 --interface 127.0.0.1 \\.\COM17 7001
|
||
```
|
||
|
||
包装器默认会持续占用物理 COM 口。若只希望在网络客户端已连接时打开串口,可使用:
|
||
|
||
```bat
|
||
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 服务安装能力。
|
||
|
||
安装为服务:
|
||
|
||
```bat
|
||
psip_server.exe -install-service
|
||
```
|
||
|
||
文档给出的独立端口映射命令为:
|
||
|
||
```bat
|
||
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,以及可选客户端认证。
|
||
|
||
文档中的物理串口服务器命令为:
|
||
|
||
```bat
|
||
SPRCmd.exe setserver telnet-bin 3 7001 physical
|
||
```
|
||
|
||
该语法可能随产品版本变化;自动化前必须用已安装版本的帮助信息复核。
|
||
|
||
FabulaTech 是按容量收费的商业产品,试用期有限。公开说明没有完全明确试用期间物理服务器端口的计数方式,应向厂商确认。厂商将加密传输称为“SSL”,但已审阅的公开资料未说明实际启用的 TLS 协议版本和密码套件基线;如涉及合规要求,必须单独验证。
|
||
|
||
## 5. 故障排查
|
||
|
||
Windows 侧的常见问题——COM 口占用或拒绝访问、重新连接后 COM 编号变化、开机时序(服务早于 USB 枚举)、hub4com 意外监听 LAN、原生 ser2net 无法加载 DLL——集中在 [故障排查](troubleshooting.md) 一页的“Windows 特定问题”一节,此处不再重复。
|