1.0.2
RTK Caster
一个轻量的 RTK / NTRIP Caster 服务,使用 Go 编写。
它面向“小规模自建 RTK 服务”场景,核心职责只有三件事:
- 接收基站上传的 RTCM 数据
- 通过 NTRIP Rev1 向流动站分发 RTCM 数据
- 提供一个内置 Web 管理后台,用于查看状态、管理流动站账号和管理员密码
当前实现不依赖数据库,也不依赖 Node.js 或前端构建链。Web 管理后台为内置静态页面,基站地图使用免费 OpenStreetMap 底图。
功能概览
基站接入
- 监听基站上传端口,默认
9000/TCP - 基站连接后,第一行发送:
BASE <station_id>
- 第一行之后的所有字节都按 RTCM 数据流处理
- 支持预配置基站
- 支持未预配置基站自动注册
- 同一个
station_id如果出现新的源连接,新连接会顶掉旧连接
NTRIP 分发
- 监听 NTRIP 端口,默认
2101/TCP - 支持
HTTP/1.0和HTTP/1.1的GET /<mountpoint> - 支持 Basic Auth
- 认证成功后返回:
ICY 200 OK
- 支持多个流动站客户端同时连接同一个挂载点
- 同一个流动站账号也可以同时在多个客户端上并发拉流
最近站
- 内置一个虚拟挂载点,默认名为
NEAREST - 流动站连接
NEAREST后,需要回传一条 GGA - 服务端根据 GGA 坐标,在当前在线且有坐标的基站里选择最近站
- 当前会话建立后,会固定使用本次选中的最近站
Web 管理后台
默认访问地址:
http://127.0.0.1:8080/
后台当前包含:
- 总览
- 基站
- 流动站
- 日志
- 后台管理
后台支持管理员登录,默认管理员账号密码为:
- 用户名:
clear - 密码:
Bone1644
首次登录后建议立即在“后台管理”里修改密码。
目录结构
rtk_caster/
config.yaml.example
go.mod
go.sum
main.go
README.md
internal/
api/
config/
hub/
ingest/
model/
ntrip/
util/
编译
Windows
go build -o rtk-server.exe .
Linux / macOS
go build -o rtk-server .
启动
- 复制配置模板
cp config.yaml.example config.yaml
Windows 可直接复制文件,或手工新建 config.yaml。
-
根据实际部署修改
config.yaml -
启动服务
Windows:
.\rtk-server.exe -config config.yaml
Linux / macOS:
./rtk-server -config config.yaml
配置说明
示例见 config.yaml.example。
当前配置结构如下:
admin:
username: clear
password: "Bone1644"
server:
base_ingest_port: 9000
ntrip_port: 2101
api_port: 8080
base_stations:
- station_id: GD_SZ_001
mountpoint: GD_SZ_001
lat: 22.000000
lon: 113.000000
height: 10.0
rovers:
- username: rover
password: "123456"
display_name: 默认流动站账号
nearest:
mountpoint: NEAREST
gga_timeout_seconds: 10
admin
username- Web 管理后台管理员账号
password- Web 管理后台管理员密码
说明:
- 如果配置文件中未填写,程序会自动使用默认值
clear / Bone1644 - 在后台管理页修改密码后,会写回
config.yaml
server
base_ingest_port- 基站 RTCM 上传端口,默认
9000
- 基站 RTCM 上传端口,默认
ntrip_port- NTRIP 服务端口,默认
2101
- NTRIP 服务端口,默认
api_port- Web 管理后台和状态 API 端口,默认
8080
- Web 管理后台和状态 API 端口,默认
base_stations
每个基站包含:
station_id- 基站唯一标识
mountpoint- 对外分发使用的固定挂载点名称
lat- 纬度
lon- 经度
height- 高程
说明:
- 预配置基站可以参与
NEAREST最近站选择 - 如果未配置坐标,即使基站在线,也不会参与最近站计算
rovers
每个流动站账号包含:
username- NTRIP 登录账号
password- NTRIP 登录密码
display_name- Web 后台中的显示名称
note- 运维备注
说明:
- 当前实现下,每个流动站账号默认可访问全部挂载点
- 当前不再支持基于账号的挂载点白名单配置
nearest
mountpoint- 最近站虚拟挂载点名称,默认
NEAREST
- 最近站虚拟挂载点名称,默认
gga_timeout_seconds- 连接最近站后等待 GGA 的超时时间,默认
10
- 连接最近站后等待 GGA 的超时时间,默认
Web 管理后台说明
登录
- 打开
http://<host>:<api_port>/ - 使用管理员账号登录
- 未登录时不能访问后台数据接口
总览
用于快速判断服务是否正常:
- 在线基站数量
- 活跃流动站连接数
- 实时吞吐
- 累计数据量
- 最近告警摘要
说明:
- 总览页只保留需要立刻注意的告警
- 启动成功、端口监听这类普通
INFO日志不在总览页显示 - 全量日志仍然保留在“日志”页
基站
用于查看:
- 基站在线 / 离线状态
- 实时 RTCM 输入速率
- 累计流量
- 当前客户端数
- 最后在线时间
- 坐标
- 地图位置
说明:
- 地图使用免费 OpenStreetMap 底图
- 仅当基站存在经纬度坐标时才会显示地图点位
流动站
用于:
- 新增流动站账号
- 编辑流动站账号
- 删除流动站账号
- 直接复制连接信息发给客户
日志
用于查看运行期日志,并按级别和关键字过滤。
后台管理
用于:
- 查看当前管理员账号
- 修改管理员密码
- 退出登录
基站上传协议
这套服务的基站接入不是标准 NTRIP Source 协议,而是一个更轻量的 TCP 上传协议。
上传目标
- 默认端口:
9000/TCP - 连接方式:基站端主动发起 TCP 长连接
例如服务器地址为 107.173.157.41,则基站上传目标为:
107.173.157.41:9000
上传格式
连接建立后,第一行必须先发送:
BASE <station_id>\n
例如:
BASE GD_SZ_001\n
随后立刻持续发送 RTCM 原始二进制数据。
完整顺序如下:
[TCP Connect]
-> BASE GD_SZ_001\n
-> RTCM bytes
-> RTCM bytes
-> RTCM bytes
-> ...
行为说明
BASE必须大写BASE与station_id之间只有一个空格- 第一行结束必须带换行符
\n - 第二行开始,服务端不再解析文本命令,全部当作 RTCM 数据处理
NTRIP 使用说明
固定挂载点
流动站直接请求:
GET /<mountpoint> HTTP/1.0
Authorization: Basic ...
例如:
GET /GD_SZ_001 HTTP/1.0
最近站挂载点
流动站请求:
GET /NEAREST HTTP/1.0
Authorization: Basic ...
连接建立后,继续发送一条 GGA,例如:
$GNGGA,025959.00,2230.0000,N,11354.0000,E,1,12,0.9,10.0,M,0.0,M,,*00
服务端收到 GGA 后,会自动选择当前最近的在线基站。
运行时行为
基站自动注册
如果某个 station_id 没有写在 config.yaml 里:
- 服务端仍然允许它接入
- 会自动创建一个动态基站
- 默认挂载点名就是
station_id - 默认没有坐标,因此不会参与
NEAREST
基站保留时间
离线超过 7 天的站点不会继续显示在后台中。
并发行为
- 同一流动站账号支持多客户端同时登录
- 同一挂载点支持多客户端同时订阅
- 同一
station_id的源连接不支持多路并存,新连接会替换旧连接
常见问题
1. 流动站认证失败
优先检查:
- 用户名是否正确
- 密码是否正确
- 请求是否携带 Basic Auth
2. 请求挂载点返回 404
说明挂载点不存在,常见原因:
mountpoint写错- 基站未接入
- 动态站点还没出现
3. 最近站没有返回数据
优先检查:
- 是否连接的是
NEAREST - 是否回传了 GGA
- 当前是否有在线且带坐标的基站
4. 后台能打开但看不到数据
优先检查:
- 是否已经登录管理员账号
api_port是否正确- 服务是否真的运行在当前机器和当前配置上
当前限制
- 管理员密码保存在配置文件中,当前不是哈希存储
- 流动站账号当前没有挂载点级权限控制,默认可访问全部挂载点
- 基站上传协议是自定义 TCP 协议,不是标准 NTRIP Source
- 管理后台是内置单页应用,适合运维管理,不适合做复杂业务系统
Description
Lightweight private RTK/NTRIP server with dashboard
189 KiB
0 Stars
1 Watchers
0 Forks