跳到主要内容

RustCam

开发者

RustCam 的环境要求、目录结构、快速开始、配置说明、API 概览与常见问题。

Environment

Rust

1.95+

PostgreSQL

14+(需 PostGIS 扩展)

TimescaleDB

PostgreSQL 扩展(遥测时序必需)

Redis

6+

Node.js

18+(前端构建)

ZLMediaKit

任意近期版本(推流 / 拉流 / 转推)

Qt + CMake

Qt 5.15.2 / 6.2+、CMake 3.16+(仅桌面客户端)

项目结构

crates/rustcam-media/Rust 后端库:api / application / auth / domain / infrastructure / protocol / transport / drone_gateway
crates/rustcam-server/服务端可执行程序(rustcam-media)
crates/rustcam-drone-service/移动眼控制面:注册表、遥测影子、控制权、指令、围栏、审计
crates/rustcam-drone-adapter/机载适配:MAVLink / PX4 / ArduPilot 接入
crates/rustcam-drone-sim/MAVLink 机体模拟器(测试/演示)
crates/rustcam-drone-proto/移动眼 gRPC 契约
crates/rustcam-drone-core/共享类型与常量
frontend/Vue 3 控制台(Vite + Element Plus + Pinia + Cesium)
testenv/移动眼一键测试环境(start.ps1 / stop.ps1 / 截图)
clientapp/Qt 桌面客户端(CMake + FFmpeg)
public/对外文档:api.md、architecture.mmd、architecture.png
sql/数据库脚本(schema.sql)

快速开始

初始化数据库

bash
psql -U postgres -c "CREATE DATABASE rustcam;"
psql -U postgres -d rustcam -f sql/schema.sql

启动后端

bash
cargo run -p rustcam-server
# 或发布构建
cargo build --release -p rustcam-server
./target/release/rustcam-media

启动 Web 控制台

bash
cd frontend
npm install
npm run dev

一键移动眼测试环境(无需真实飞控)

powershell
pwsh -File testenv\start.ps1
# 登录:admin / admin123
# 内置 MAVLink 模拟器:PX4 / ArduPilot

登录并获取令牌

bash
curl -s -X POST http://127.0.0.1:8081/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"admin"}'

配置文件

编辑仓库根目录的 config.toml。下方是可启动的最小完整配置:server、database、redis、media_servers、cluster、session、onvif、rtsp_auth、signaling_server、jwt 均为必填段,缺任一段后端启动即报错。生产环境务必修改 JWT secret 与数据库口令。

toml
[server]
host = "0.0.0.0"
port = 8081
tls_enabled = false

[database]
url = "postgres://user:pass@localhost:5432/rustcam"
max_connections = 10

[redis]
url = "redis://localhost:6379"
pool_size = 5

[[media_servers.servers]]
name = "zlmediakit"
url = "http://127.0.0.1:80"
api_key = "your_api_key"
server_type = "zlmediakit"   # zlmediakit / srs / xiu
weight = 100
enabled = true
server_tag = "default"

[cluster]
strategy = "round_robin"
health_check_interval_secs = 30
max_session_per_server = 1000

[session]
expiration_secs = 300
max_per_user = 10

[onvif]
discovery_enabled = false
scopes = ["onvif://www.onvif.org/Profile/Streaming", "onvif://www.onvif.org/Profile/PTZ"]

[rtsp_auth]
enabled = true
realm = "RustCam"

[signaling_server]
server_gb_id = "31011500001000000001"
server_gb_domain = "3101150000"
bind_ip = "0.0.0.0"
tcp_signaling_port = 5060
udp_signaling_port = 5061
rtp_port_start = 15000
rtp_port_end = 15100
rtp_bind_addr = "0.0.0.0"

[jwt]
secret = "change-me-in-production"
access_token_expire_minutes = 60
refresh_token_expire_days = 30

[drone]
service_addr = "http://127.0.0.1:50051"

API 概览

后端基于 Axum 暴露 HTTP + WebSocket 接口,业务接口统一前缀 /api/v1,覆盖用户权限、设备通道、云台、流、录像、告警、监控墙与移动眼等分组;完整接口清单见仓库 public/api.md。

认证方式

除公开端点外,所有接口都需在请求头携带 JWT:Authorization: Bearer <access_token>

http
Authorization: Bearer <access_token>

分组速览

GroupCountEndpoints
用户 / 角色 / 权限11GET/POST /users、PUT /users/{id}/roles、GET/POST /roles
设备13GET/POST /devices、POST /devices/{id}/play、GET /devices/{id}/config
通道7GET/POST /channels、GET /channels/{device_tag}/{channel_tag}/status
云台 PTZ6POST /channels/{d}/{c}/ptz、GET/POST/PUT/DELETE .../ptz/presets
流9GET/POST /streams、GET /streams/{id}/play、POST /streams/{id}/restart
录像任务10GET/POST /recordings、POST /recordings/{id}/start|stop|pause|resume
录像策略5GET/POST /recording-policies、PUT/DELETE /recording-policies/{id}
媒体服务器10GET/POST /servers、GET /servers/{tag}/status、POST /servers/{tag}/enable
监控墙布局6GET/POST /layouts、PUT /layouts/{id}/default
设备分组 / 行政区划8GET /groups/tree、POST /groups、GET /regions/tree
ONVIF6POST /onvif/discover、POST /onvif/probe、POST /onvif/devices
移动眼(drone)19GET/POST /drone/drones、POST /drone/{id}/command、GET/POST /drone/routes、GET/POST /drone/fences、POST /drone/control/acquire
会话 / 告警 / 统计5GET /sessions、GET /alarms、GET /api/v1/stats

公开路由(无需认证)

POST /api/v1/auth/login、/api/v1/auth/refresh登录 / 刷新令牌
GET /api/v1/health、/api/v1/metrics、/api/v1/stats健康 / 指标 / 统计
GET /api/v1/public/streams公开直播
GET /api/v1/proxy/wfs地图 WFS 代理
POST /hook/{event_name}、/hook/{server_type}/{event_name}媒体服务器 Hook
POST /alarm/{stream_key}外部告警上报
GET /ws、/ws/audio-talk/{device_tag}/{channel_id}事件推送与语音对讲
GET /ws/drone/{kind}?ticket=...移动眼事件推送(一次性 ticket 鉴权)

常见问题

支持哪些设备接入方式?

GB28181(SIP 注册)、ONVIF(WS-Discovery 发现)、RTSP 直连以及 WebSocket 接入,统一抽象为设备与通道模型。

云台控制设备离线时返回什么?

GB28181 设备离线时返回 503,适配器会自动重新注册设备。

是否支持 HTTPS?

支持,但平台后端未内置 TLS 监听:请在前面放一台反向代理(如 Nginx)终止 TLS 后再转发到后端;WSS 走同一入口,代理需开启 WebSocket 升级。

语音对讲如何实现?

媒体侧通过 MediaNode 中间件链完成 G711 ⇄ PCM 转换与重采样,支撑 GB28181 广播与 ONVIF Backchannel 语音对讲。

没有无人机硬件可以体验移动眼吗?

可以。仓库内置 rustcam-drone-sim,可模拟 PX4 / ArduPilot 心跳、遥测与指令 ACK;执行 pwsh -File testenv\start.ps1 即可拉起模拟器、适配器、控制面、主服务与前端。

移动眼支持哪些飞控?

通过 MAVLink 支持 PX4 与 ArduPilot,按 HEARTBEAT.autopilot 自动识别;连接方式支持 UDP / TCP / 串口。

其他媒体服务器什么时候可用?

媒体服务器适配层已抽象完毕,部分实现仍在推进,详见产品特性页的模块进度表。