RTK-Caster Lite

轻量级 RTK / NTRIP Caster,适合小团队内部自建差分服务。

当前实现只做三件事:

  • 接收基站上传的 RTCM 原始数据
  • 通过 NTRIP 向 rover 分发 RTCM
  • 提供内嵌 Web 管理后台

项目保持轻量:

  • 不依赖数据库
  • 不依赖 Redis、消息队列、Prometheus
  • 管理后台使用内嵌静态页面
  • 基站地图使用本地 Leaflet 资源和免费 OpenStreetMap 底图

功能概览

基站接入

  • 默认监听 9000/TCP
  • 基站上传协议固定为:
BASE <station_id>\n
<后续持续发送 RTCM 原始字节流>
  • 支持预配置基站
  • 支持动态基站自动出现
  • 同一个 station_id 的新连接会替换旧连接
  • 基站首包 15 秒超时,超时未发送 BASE <station_id> 会自动断开

NTRIP 分发

  • 默认监听 2101/TCP
  • 兼容 GET /<mountpoint>
  • 兼容 Authorization: Basic ...
  • 成功响应兼容:
ICY 200 OK
  • 也兼容 HTTP/1.0 200 OK / HTTP/1.1 200 OK
  • 支持多个 rover 同时连接同一挂载点
  • 支持同一账号多客户端并发拉流
  • 管理员账号 admin / Bone1644 也可直接用于 NTRIP 鉴权

最近站 NEAREST

  • 内置虚拟挂载点,默认名称 NEAREST
  • rover 连接 NEAREST 后继续回传 GGA
  • 服务端根据 GGA 坐标从在线基站中选择最近站
  • 最近站逻辑保留,不要求客户端升级

基站坐标

  • 默认优先使用在线基站 RTCM 中自动提取的参考站坐标
  • 当前支持低频解析 RTCM 1005 / 1006
  • 解析是旁路低频行为,不影响主转发链路
  • 如果暂时取不到坐标:
    • 不影响基站上传
    • 不影响普通挂载点分发
    • 只会影响地图展示和 NEAREST 选站候选
  • 后台也支持手动录入坐标,保存后写回 config.yaml

Web 管理后台

默认地址:

http://127.0.0.1:8080/

当前页面包括:

  • 总览
  • 基站
  • 流动站
  • 日志
  • 后台管理

默认管理员账号:

  • 用户名:admin
  • 密码:Bone1644

目录结构

rtk_caster/
  config.yaml
  config.yaml.example
  main.go
  README.md
  internal/
    api/
    config/
    hub/
    ingest/
    model/
    ntrip/
    rtcm/
    util/

编译与启动

Windows

go build -o rtk-server.exe .
.\rtk-server.exe -config config.yaml

Linux / macOS

go build -o rtk-server .
./rtk-server -config config.yaml

配置文件

示例见 config.yaml.example。

当前推荐配置结构:

admin:
  username: admin
  password: "Bone1644"

server:
  base_ingest_port: 9000
  ntrip_port: 2101
  api_port: 8080

base_stations: []

rovers:
  - username: rover
    password: "123456"
    display_name: 默认流动站
    allowed_mountpoints: []
    note: ""

nearest:
  mountpoint: NEAREST

admin

  • username
    • 后台管理员账号
  • password
    • 后台管理员密码

说明:

  • 当前默认值固定为 admin / Bone1644
  • 后台改密后会写回 config.yaml
  • 管理员账号也可以直接用于 NTRIP 鉴权

server

  • base_ingest_port
    • 基站上传端口,默认 9000
  • ntrip_port
    • NTRIP 端口,默认 2101
  • api_port
    • 后台和 API 端口,默认 8080

base_stations

每个基站可包含:

  • station_id
  • mountpoint
  • lat
  • lon
  • height

说明:

  • 当前不再要求手工维护大量静态坐标
  • base_stations 主要用于:
    • 手动录入坐标后的持久化
    • 保留固定挂载点名称
    • 兼容已有静态配置
  • 动态基站仍可正常接入

rovers

每个 rover 账号包含:

  • username
  • password
  • display_name
  • allowed_mountpoints
  • note

说明:

  • 当前实现中,所有已认证 rover 默认都可访问全部挂载点
  • allowed_mountpoints 字段仍保留在配置和接口中,主要用于兼容旧配置
  • 后台当前不再提供挂载点白名单编辑入口
  • rover 密码会明文返回到后台页面,符合当前内部使用场景

nearest

  • mountpoint
    • 最近站虚拟挂载点名称,默认 NEAREST

后台说明

总览

优先展示:

  • 在线基站数
  • 在线 rover 数
  • 已获坐标数
  • 实时吞吐
  • 关键告警
  • 基站状态摘要

基站

可查看:

  • 在线 / 离线状态
  • 实时输入速率
  • 累计流量
  • 客户端数
  • 最后在线时间
  • 离线时长
  • 坐标来源
  • 地图位置

并支持:

  • 自动坐标展示
  • 手动坐标录入并保存到 config.yaml

流动站

可操作:

  • 新增 rover 账号
  • 编辑 rover 账号
  • 删除 rover 账号
  • 直接复制单账号连接信息

说明:

  • 页面顶部会额外显示一个只读的 admin NTRIP 卡片
  • admin 只读卡片只支持复制信息,不支持编辑或删除

日志

  • 支持按级别筛选
  • 支持关键词搜索
  • 前端区分 INFO / WARN / ERROR

后台管理

  • 查看当前管理员账号
  • 修改管理员密码
  • 退出登录

协议说明

基站上传协议

保持不变:

BASE <station_id>\n
<后续持续发送 RTCM 原始字节流>

注意:

  • BASE 必须大写
  • station_id 前只有一个空格
  • 首行必须以 \n 结束

Rover NTRIP 协议

保持不变:

GET /<mountpoint> HTTP/1.0
Authorization: Basic ...

最近站示例:

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

当前实现中,NEAREST 连接建立后会持续等待 GGA,不再使用固定超时限制。

运行时行为

动态基站

如果某个 station_id 不在 config.yaml 中:

  • 仍允许接入
  • 会自动创建动态基站
  • 默认挂载点名为 station_id

坐标提取节流

  • 基站上线后会开启一个短暂解析窗口
  • 窗口内持续喂入后续 RTCM 数据,便于拼完整 1005 / 1006
  • 成功解析后进入 30 秒冷却
  • 这样比“首包未成功就整段冷却”更稳妥

配置保存

保存 config.yaml 时:

  • 先写 config.yaml.tmp
  • 同时保留 config.yaml.bak
  • Linux / macOS 使用重命名替换
  • Windows 使用更稳妥的 swap 替换流程,避免先截断原文件

当前限制

  • 管理员密码当前仍是明文保存在配置文件中
  • rover 密码会明文显示在后台页面
  • 地图底图依赖 OpenStreetMap 在线瓦片服务
  • RTCM 自动坐标提取当前只做轻量参考站坐标解析,不做全量 RTCM 解码
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%