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_gatewaycrates/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.pngsql/数据库脚本(schema.sql)快速开始
初始化数据库
psql -U postgres -c "CREATE DATABASE rustcam;"
psql -U postgres -d rustcam -f sql/schema.sql启动后端
cargo run -p rustcam-server
# 或发布构建
cargo build --release -p rustcam-server
./target/release/rustcam-media启动 Web 控制台
cd frontend
npm install
npm run dev一键移动眼测试环境(无需真实飞控)
pwsh -File testenv\start.ps1
# 登录:admin / admin123
# 内置 MAVLink 模拟器:PX4 / ArduPilot登录并获取令牌
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 与数据库口令。
[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>
Authorization: Bearer <access_token>分组速览
| Group | Count | Endpoints |
|---|---|---|
| 用户 / 角色 / 权限 | 11 | GET/POST /users、PUT /users/{id}/roles、GET/POST /roles |
| 设备 | 13 | GET/POST /devices、POST /devices/{id}/play、GET /devices/{id}/config |
| 通道 | 7 | GET/POST /channels、GET /channels/{device_tag}/{channel_tag}/status |
| 云台 PTZ | 6 | POST /channels/{d}/{c}/ptz、GET/POST/PUT/DELETE .../ptz/presets |
| 流 | 9 | GET/POST /streams、GET /streams/{id}/play、POST /streams/{id}/restart |
| 录像任务 | 10 | GET/POST /recordings、POST /recordings/{id}/start|stop|pause|resume |
| 录像策略 | 5 | GET/POST /recording-policies、PUT/DELETE /recording-policies/{id} |
| 媒体服务器 | 10 | GET/POST /servers、GET /servers/{tag}/status、POST /servers/{tag}/enable |
| 监控墙布局 | 6 | GET/POST /layouts、PUT /layouts/{id}/default |
| 设备分组 / 行政区划 | 8 | GET /groups/tree、POST /groups、GET /regions/tree |
| ONVIF | 6 | POST /onvif/discover、POST /onvif/probe、POST /onvif/devices |
| 移动眼(drone) | 19 | GET/POST /drone/drones、POST /drone/{id}/command、GET/POST /drone/routes、GET/POST /drone/fences、POST /drone/control/acquire |
| 会话 / 告警 / 统计 | 5 | GET /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 / 串口。
其他媒体服务器什么时候可用?
媒体服务器适配层已抽象完毕,部分实现仍在推进,详见产品特性页的模块进度表。