☰
RTK数据链路搭建:str2str串口转NTRIP转发实战指南
2026/9/28 16:23:27 网站建设 项目流程

RTK定位这件事,硬件买回来只是第一步。真正让人头疼的,往往是数据链路怎么搭——基准站的数据怎么稳定地推给流动站,流动站怎么通过一个统一的入口拿到差分改正数。我见过太多人设备买了一大堆,结果卡在数据转发这一环,要么延迟忽高忽低,要么干脆连不上。RTKLIB里的str2str工具就是专门解决这个问题的,它能把串口、TCP、NTRIP、文件流之间任意转换和转发,而且完全免费。这篇内容适合已经上手RTK、但被数据链路折腾过的朋友,也适合想用低成本方案替代商业CORS服务的团队。我会把str2str的配置逻辑、参数含义、实际踩过的坑都摊开讲清楚,让你看完就能自己搭一套稳定的转发服务。

1. 先搞清楚str2str到底在转发什么

1.1 数据流的本质:从串口字节到差分改正数

很多人一上来就急着敲命令,结果参数写错了都不知道错在哪。要理解str2str,得先明白它处理的数据到底是什么形态。RTK的核心是基准站把观测到的卫星数据(通常是RTCM格式)发给流动站,流动站结合自己的观测数据做差分计算,从而把定位精度从米级压到厘米级。这个过程中,基准站输出的可能是串口数据、可能是TCP流、也可能是NTRIP协议封装的数据包。str2str做的事情,就是把这些不同来源、不同格式的数据流“搬运”到另一个出口,中间可以做一些格式转换和协议适配。

你可以把它想象成一个水管接头转换器。一头接的是基准站串口出来的原始字节流,另一头要接的是流动站能识别的NTRIP客户端。如果没有这个转换器,两边接口对不上,水就流不过去。str2str支持同时配置多个输入流和多个输出流,这意味着你可以一个基准站数据同时推给好几个流动站,或者把多个基准站的数据汇聚到一个端口上。

关键点在于,str2str本身不做差分计算,它只负责搬运和格式转换。差分计算是流动站端的RTK算法在做。所以转发服务器的稳定性直接决定了差分数据的连续性和延迟,而这两项指标又直接反映在最终的定位精度和固定率上。

1.2 支持的流类型与典型组合场景

str2str支持的流类型相当丰富,我列一下常用的几种:

流类型标识符典型用途
串口serial连接基准站接收机
TCP客户端tcpc主动连接远程服务器
TCP服务端tcps监听端口等待连接
NTRIP客户端ntripc从CORS或NTRIP Caster拉取数据
NTRIP服务端ntrips搭建自己的NTRIP Caster
文件file记录数据或回放数据
UDPudp局域网内低延迟传输

实际搭建中,最常见的组合是:基准站接收机通过串口输出RTCM数据,str2str从串口读取,然后通过NTRIP服务端模式对外发布,流动站用NTRIP客户端连接获取数据。另一种常见组合是:从某个NTRIP Caster拉取数据,然后转发到本地TCP端口,供局域网内多台设备使用。

还有一种容易被忽略的场景:把串口数据同时转发到文件和TCP端口。文件用于事后复盘和问题排查,TCP端口用于实时定位。这个组合在调试阶段特别有用,因为你可以把原始数据存下来,事后用RTKPOST做后处理验证。

1.3 为什么不用商业软件而选str2str

市面上确实有一些商业软件能做类似的事情,但str2str有几个不可替代的优势。第一是免费开源,没有授权限制,你可以随便部署多少份。第二是跨平台,Windows、Linux、树莓派上都能跑,这对低成本部署很关键——你可以用一块树莓派做转发服务器,功耗低、体积小、可以放在野外。第三是配置灵活,命令行参数虽然多,但一旦理解逻辑,就能组合出各种复杂的转发拓扑。

我自己的做法是在树莓派上跑str2str,通过systemd做成开机自启的服务。整个方案的成本就是一块树莓派加一个电源,比买商业转发服务器便宜太多。而且因为Linux系统稳定,连续跑几个月不出问题是很正常的。

2. 命令行参数逐个拆解:别被那一长串吓到

2.1 输入输出流的基本语法结构

str2str的命令行语法看起来吓人,但拆开看其实很规整。基本结构是这样的:

str2str -in [输入流配置] -out [输出流配置] [其他选项]

输入流和输出流都用“类型://参数”的格式来描述。比如串口输入就是:

-in serial://ttyUSB0:115200:8:n:1

这里ttyUSB0是设备名,115200是波特率,8是数据位,n是无校验,1是停止位。这几个参数必须和接收机输出的配置完全一致,否则读出来的就是乱码。

TCP服务端输出:

-out tcps://:2101

冒号前面为空表示监听本机所有网卡,2101是端口号。流动站就连接这个端口获取数据。

NTRIP服务端输出:

-out ntrips://:2101/MOUNTPOINT

MOUNTPOINT是你自己起的挂载点名称,流动站连接时需要指定这个名称。

2.2 那些容易写错的参数细节

有几个参数我踩过坑,这里重点说一下。

串口设备名:Linux下通常是/dev/ttyUSB0或/dev/ttyACM0,但如果你插了多个USB转串口设备,编号可能会变。稳妥的做法是用/dev/serial/by-id/下面的持久化路径,这样重启后设备名不会乱。

波特率匹配:接收机输出RTCM的波特率必须和str2str设置的完全一致。我遇到过接收机默认115200但配置成了9600的情况,结果读出来全是乱码,排查了半天才发现是波特率不匹配。

NTRIP挂载点命名:挂载点名称不要用特殊字符,建议用字母数字和下划线组合。有些NTRIP客户端对特殊字符处理不好,会导致连接失败。

TCP端口选择:2101是NTRIP的默认端口,但如果你在公网环境,建议换一个非标准端口,减少被扫描的概率。当然这只是一个基本的安全习惯,不是必须的。

2.3 常用选项参数的含义与取舍

除了输入输出,str2str还有一些选项参数会影响转发行为:

  • -p:指定定位模式,一般不用改
  • -msg:指定要转发的消息类型,可以过滤掉不需要的RTCM消息
  • -t:设置超时时间
  • -b:设置缓冲区大小
  • -r:设置重连间隔

其中-msg这个参数值得说一下。基准站输出的RTCM消息可能有很多类型,但流动站实际需要的可能只有几种。通过过滤掉不需要的消息,可以减少带宽占用和延迟。比如你只需要1004和1019这两种消息,就可以这样写:

-msg 1004,1019

不过要注意,过滤太多可能导致流动站无法完成初始化。建议先用默认配置跑通,确认能固定之后,再尝试精简消息类型。

3. 从零搭建一套串口转NTRIP的转发服务

3.1 硬件连接与系统环境确认

先确认硬件连接。基准站接收机的串口输出接到树莓派的USB口,通过USB转串口芯片识别为ttyUSB0或ttyACM0。用ls /dev/tty*确认设备名,然后用dmesg | tail看一下内核识别信息,确认驱动加载正常。

系统环境方面,RTKLIB的二进制文件在大多数Linux发行版上可以直接运行。如果你用的是树莓派,建议用64位系统,性能更好。安装依赖:

sudo apt update sudo apt install -y build-essential

如果你需要从源码编译RTKLIB:

git clone https://github.com/tomojitakasu/RTKLIB.git cd RTKLIB/src make sudo make install

编译完成后,str2str的可执行文件在/usr/local/bin/下面。

3.2 串口参数的确定与验证

在正式配置str2str之前,先用stty命令确认串口参数:

stty -F /dev/ttyUSB0 -a

这会显示当前串口的配置。如果波特率不对,可以用:

stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb

设置成115200、8数据位、1停止位、无校验。

然后用cat命令看一下串口有没有数据输出:

cat /dev/ttyUSB0 | xxd | head -20

如果看到类似d3 00开头的十六进制数据,说明RTCM数据正常输出。如果什么都没有,检查接收机的输出配置是否正确启用了RTCM输出。

3.3 完整的str2str启动命令与参数注释

确认串口有数据后,就可以启动str2str了。下面是一个完整的命令:

str2str -in serial://ttyUSB0:115200:8:n:1 \ -out ntrips://:2101/RTK_BASE \ -msg 1004,1019,1033,1074,1084,1094,1104,1114,1124 \ -t 30 \ -b 1

逐段解释:

  • -in serial://ttyUSB0:115200:8:n:1:从串口读取,波特率115200,8数据位,无校验,1停止位
  • -out ntrips://:2101/RTK_BASE:以NTRIP服务端模式输出,监听2101端口,挂载点名为RTK_BASE
  • -msg:指定转发的RTCM消息类型,这里列出了常用的GPS、GLONASS、Galileo、北斗的观测值和星历消息
  • -t 30:超时时间30秒,超过这个时间没有数据就断开重连
  • -b 1:缓冲区大小为1,降低延迟

启动后,str2str会持续运行,把串口数据转发到NTRIP服务端。流动站就可以通过NTRIP客户端连接你的IP:2101/RTK_BASE来获取差分数据。

3.4 用systemd做成开机自启服务

手动运行只适合调试,正式部署需要做成服务。创建一个systemd服务文件:

sudo nano /etc/systemd/system/str2str.service

内容如下:

[Unit] Description=str2str RTK Forwarder After=network.target [Service] Type=simple ExecStart=/usr/local/bin/str2str -in serial://ttyUSB0:115200:8:n:1 -out ntrips://:2101/RTK_BASE -msg 1004,1019,1033,1074,1084,1094,1104,1114,1124 -t 30 -b 1 Restart=always RestartSec=5 User=root [Install] WantedBy=multi-user.target

然后启用服务:

sudo systemctl daemon-reload sudo systemctl enable str2str sudo systemctl start str2str

用sudo systemctl status str2str查看运行状态。如果启动失败,用journalctl -u str2str -f看日志排查。

4. 实测中遇到的坑与排查思路

4.1 数据能连上但无法固定:差分龄期在作怪

有一次我搭好转发服务后,流动站能连上NTRIP,也能收到数据,但就是无法固定,一直浮点解。排查了半天,最后发现是差分龄期太大。差分龄期是指流动站使用的差分改正数距离当前时刻的时间差,这个值越大,改正数的有效性越差。

在RTKNAVI或RTKPOST里可以看到差分龄期这个指标。正常情况下应该在1秒以内,如果超过5秒,基本就很难固定了。导致差分龄期大的原因有几个:转发链路延迟高、基准站输出频率低、网络抖动严重。

我的解决方法是:把基准站的输出频率从1Hz提高到5Hz,同时把str2str的缓冲区设为1,减少转发延迟。调整之后差分龄期降到了0.2秒左右,固定率明显提升。

4.2 NTRIP客户端连接失败:挂载点与认证的坑

另一个常见问题是流动站连不上NTRIP服务端。可能的原因有:

  • 挂载点名称写错了,大小写敏感
  • 端口被防火墙挡住了
  • str2str没有正常运行
  • 网络不通

排查步骤:先在服务器本机用telnet 127.0.0.1 2101测试端口是否监听。如果本机能通但外部不通,检查防火墙规则。如果端口通但NTRIP连接失败,检查挂载点名称是否完全匹配。

还有一个容易忽略的点:有些NTRIP客户端需要认证信息。str2str的NTRIP服务端模式默认不需要认证,但如果你在公网环境,建议加上认证。不过str2str本身对NTRIP认证的支持有限,如果需要完整的认证功能,可能需要配合其他工具。

4.3 长时间运行后断流:串口掉线的心跳检测

str2str跑几天后偶尔会出现断流,表现是流动站突然收不到数据了。排查发现是USB转串口设备掉线了,可能是供电不稳或者USB口松动。

解决方法有两个层面。软件层面,str2str本身有重连机制,但前提是它检测到了断流。可以配合-t参数设置超时,让str2str在超时后自动重连。硬件层面,换一个质量好一点的USB转串口线,或者给树莓派加一个有源USB Hub,保证供电稳定。

另外可以写一个简单的监控脚本,定期检查str2str进程是否存活,如果挂了就自动重启。配合systemd的Restart=always,基本上可以做到无人值守。

4.4 多流动站并发时的带宽与性能

当多个流动站同时连接时,需要考虑带宽和性能。RTCM数据量其实不大,一路1004+1019的消息大概每秒几百字节到一两千字节。即使10个流动站同时连接,总带宽也就几十KB/s,对网络压力不大。

但树莓派的处理能力有限,如果流动站数量很多,可能会出现转发延迟。我实测树莓派4B同时转发给5个流动站没有问题,延迟在可接受范围内。如果流动站更多,建议用性能更好的设备,或者做多级转发。

还有一个优化点:如果多个流动站都在同一个局域网内,可以用TCP服务端模式而不是NTRIP服务端模式,减少协议开销。NTRIP协议本身有一些额外的HTTP交互,在局域网内用纯TCP会更高效。

5. 进阶玩法:把转发服务玩出更多花样

5.1 串口转TCP加文件双输出

调试阶段我习惯把数据同时存一份到文件,方便事后分析。str2str支持多输出,命令如下:

str2str -in serial://ttyUSB0:115200:8:n:1 \ -out tcps://:2101 \ -out file:///home/pi/rtcm_log/%Y%m%d_%H%M%S.rtcm

这样数据会同时推到TCP端口和文件。文件名支持时间格式,每次启动会生成一个新的日志文件。事后可以用RTKPOST加载这些日志做后处理,验证转发数据的质量。

需要注意的是,文件输出会占用磁盘空间。按每秒1KB计算,一天大概80MB左右,一个月就是2.4GB。建议定期清理或者用logrotate做轮转。

5.2 从NTRIP Caster拉取再转发到本地

如果你用的是外部CORS服务,但局域网内多台设备需要共享这份数据,可以用str2str做二次转发:

str2str -in ntripc://user:pass@caster.example.com:2101/MOUNTPOINT \ -out tcps://:2102

这样str2str从外部Caster拉取数据,然后在本地2102端口以TCP服务端模式发布。局域网内的设备连接本地端口即可,不需要每台设备都去外部Caster拉数据。这样做的好处是减少外部连接数,同时降低每台设备的配置复杂度。

5.3 用配置文件管理复杂转发拓扑

当转发规则比较复杂时,命令行参数会变得很长,不好维护。str2str支持用配置文件的方式管理。配置文件里可以定义多个输入输出流,以及它们之间的转发关系。

配置文件的语法和命令行类似,但更清晰。比如:

in = serial://ttyUSB0:115200:8:n:1 out = ntrips://:2101/RTK_BASE out = file:///home/pi/rtcm_log/base.rtcm msg = 1004,1019,1033

然后启动时用-c参数指定配置文件:

str2str -c /home/pi/str2str.conf

这种方式适合需要频繁调整配置的场景,改配置文件比改命令行方便得多。

5.4 监控与告警:让服务自己说话

正式部署后,你需要知道服务是否正常运行。除了systemd的状态检查,还可以加一些简单的监控。比如用ntripclient定期测试NTRIP服务端是否可用,或者用ss -tlnp检查端口是否监听。

更完善的做法是写一个脚本,定期检查str2str进程和端口状态,如果异常就发告警。告警方式可以用邮件、Webhook或者其他你习惯的方式。我自己的做法是用一个简单的Python脚本,每5分钟检查一次,异常时通过Webhook推送到手机上。

监控指标方面,重点关注:进程是否存活、端口是否监听、数据是否有更新、差分龄期是否正常。前三个可以在服务器端检查,最后一个需要在流动站端观察。

6. 关于稳定性和成本的一些个人体会

这套方案我用了挺长时间,从最初的树莓派3B到现在的树莓派4B,整体稳定性是可靠的。成本方面,树莓派加电源加外壳大概几百块,USB转串口线几十块,加起来不到一千块。相比商业转发服务器动辄几千上万的价格,这个方案对预算有限的团队非常友好。

稳定性方面,最关键的是供电和散热。树莓派在野外环境要注意防水防尘,电源要稳定。我遇到过因为电源电压不稳导致USB设备反复掉线的情况,换了一个质量好的电源之后就再没出现过。散热方面,如果放在密闭空间里,夏天可能会过热降频,加一个小风扇就能解决。

另外一点体会是,不要过度追求低延迟。RTK定位对延迟的容忍度其实比想象中高,1秒以内的差分龄期都能正常工作。与其花大力气优化那几十毫秒的延迟,不如把精力放在保证数据连续性和稳定性上。数据断断续续比延迟高一点要致命得多。

最后说一个实际使用中的小技巧:在str2str启动命令里加上-p参数指定定位模式,虽然转发场景下这个参数不影响数据转发,但有些版本的str2str在特定模式下对数据流的处理方式略有不同。如果遇到奇怪的问题,可以试试调整这个参数。当然,大多数情况下用默认值就行。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询