RTK-Caster Lite

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

当前实现重点解决三件事:

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

项目保持轻量:

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

默认端口

  • 基站上传:17003/TCP
  • NTRIP:17002/TCP
  • Web / API:17001/TCP

协议约定

基站上传协议

保持不变:

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

说明:

  • BASE 必须大写
  • 首行格式不能改
  • 基站首包有 15 秒超时,超时未发 BASE <station_id> 会断开

Rover NTRIP 协议

保持不变:

GET /<mountpoint>
Authorization: Basic ...

成功响应继续兼容:

  • ICY 200 OK
  • HTTP/1.0 200 OK
  • HTTP/1.1 200 OK

最近站 NEAREST

  • 默认虚拟挂载点名:NEAREST
  • rover 连接 NEAREST 后继续回传 GGA
  • 服务端根据 GGA 从在线且有坐标的基站中选择最近站
  • 当前不再使用固定 GGA 超时限制,连接建立后会持续等待 GGA

当前账号约定

管理员

  • 用户名:admin
  • 密码:Bone1644

说明:

  • 这个账号可登录 Web 后台
  • 这个账号当前也可直接用于 NTRIP 鉴权
  • 后台改密后会写回 config.yaml

Rover

  • rover 账号用于 NTRIP 鉴权
  • 当前后台支持新增、编辑、删除 rover 账号
  • rover 密码会明文展示在后台页面,符合当前内部使用场景
  • 编辑 rover 时,密码可留空,表示保持原密码不变

挂载点权限现状

  • 当前所有已认证成功的账号默认都可访问全部挂载点
  • allowed_mountpoints 字段仍保留在配置和接口结构中,主要用于兼容旧配置
  • 当前后台不再提供挂载点白名单编辑入口

基站坐标

当前优先级:

  1. 优先使用在线基站 RTCM 中自动提取的参考站坐标
  2. 若暂时取不到,可在后台手动录入并写回 config.yaml

说明:

  • 当前轻量解析 RTCM 1005 / 1006
  • 解析是低频、旁路进行,不影响主转发链路
  • 自动坐标暂时取不到时:
    • 不影响基站上传
    • 不影响普通挂载点分发
    • 只影响地图展示和 NEAREST 选站候选

相关接口:

  • POST /api/stations/coords

管理后台

默认地址:

http://127.0.0.1:17001/

当前页面包括:

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

总览

优先显示:

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

基站

支持查看:

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

支持操作:

  • 手动录入坐标并写回 config.yaml

流动站

支持操作:

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

说明:

  • 页面顶部会额外显示一个只读的 admin NTRIP 卡片
  • 当前会显示可用挂载点信息,并在复制时一起带上

日志

支持:

  • 按级别筛选
  • 按关键字搜索
  • 前端区分 INFO / WARN / ERROR / FATAL

后台管理

支持:

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

动态基站行为

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

  • 仍允许接入
  • 会自动出现在运行时基站列表中
  • 默认挂载点名与 station_id 一致

也就是说,当前不再要求手工维护大量模拟基站样板。

坐标提取节流逻辑

当前逻辑不是“首包没成功就冷却 30 秒”,而是:

  • 基站上线后开启一个短暂解析窗口
  • 窗口内持续喂后续 RTCM 数据,便于拼完整 1005 / 1006
  • 成功解析后进入冷却期

这样比“第一次 chunk 不够就整段暂停”更容易成功。

配置保存策略

保存 config.yaml 时:

  • 先写 config.yaml.tmp
  • 同时保留 config.yaml.bak
  • Linux / macOS 使用 rename 替换
  • Windows 使用 swap 替换,避免先截断原文件

目标是尽量兼顾 Windows 和 Linux 的稳妥性。

示例配置

参见 D:\ClearCore\开发工作\ClearPro2026\ClearRTK\rtk_caster\config.yaml.example。

当前推荐最小配置:

admin:
  username: admin
  password: "Bone1644"

server:
  base_ingest_port: 17003
  ntrip_port: 17002
  api_port: 17001

base_stations: []

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

nearest:
  mountpoint: NEAREST

编译与启动

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

当前限制

  • 管理员密码当前仍是明文保存在配置文件中
  • 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%