RTK Caster

一个轻量的 RTK / NTRIP Caster 服务,使用 Go 编写。

它面向“小规模自建 RTK 服务”场景,核心职责只有三件事:

  1. 接收基站上传的 RTCM 数据
  2. 通过 NTRIP Rev1 向流动站分发 RTCM 数据
  3. 提供一个内置 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 .

启动

  1. 复制配置模板
cp config.yaml.example config.yaml

Windows 可直接复制文件,或手工新建 config.yaml。

  1. 根据实际部署修改 config.yaml

  2. 启动服务

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
  • ntrip_port
    • NTRIP 服务端口,默认 2101
  • api_port
    • Web 管理后台和状态 API 端口,默认 8080

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

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
  • 管理后台是内置单页应用,适合运维管理,不适合做复杂业务系统
S
Description
Lightweight private RTK/NTRIP server with dashboard
Readme
189 KiB
0 Stars 1 Watchers 0 Forks
1.0.11
Latest
2026-06-08 15:16:04 +08:00
Languages
Go 46.7%
JavaScript 36.5%
CSS 16.2%
Dockerfile 0.4%
HTML 0.2%