快速开始:最小 ONVIF 设备
onvif-device-rs 是 ONVIF Device 服务端:注册几个 handler,就把你的
设备身份与媒体端点播报给任意 NVR。本页给最小可编译示例。
安装
cargo add onvif-device-rs@0.7.0 # crate 名与仓库(onvif-rs)不同
示例还需要异步运行时:
[dependencies]
onvif-device-rs = "=0.6.0"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
最小示例
use std::sync::Arc;
use onvif_device_rs::config::DeviceConfig;
use onvif_device_rs::device::{DeviceHandler, DeviceServiceHandlers};
use onvif_device_rs::media::{GetProfilesHandler, GetStreamUriHandler, OnvifMediaConfig};
use onvif_device_rs::server::{OnvifConfig, OnvifServer};
#[tokio::main]
async fn main() {
let port = 8080u16;
let device_ip = "192.0.2.10".to_string();
let mut soap = OnvifServer::new(&OnvifConfig {
port,
username: "admin".to_string(),
password: "secret".to_string(),
..Default::default()
});
let device = Arc::new(
DeviceServiceHandlers::new(
DeviceConfig {
name: "quickstart camera".into(),
manufacturer: "MiBee".into(),
model: "QS".into(),
firmware: "0.0.1".into(),
hardware_id: "qs-hw".into(),
serial_number: "QS-0001".into(),
},
port,
device_ip.clone(),
)
.expect("device identity must be configured explicitly"),
);
for action in [
"GetSystemDateAndTime",
"GetDeviceInformation",
"GetCapabilities",
"GetServices",
"GetScopes",
] {
soap.register_handler(action, Box::new(DeviceHandler(Arc::clone(&device))));
}
for action in ["GetSystemDateAndTime", "GetCapabilities", "GetServices"] {
soap.register_anonymous_action(action);
}
let media = Arc::new(OnvifMediaConfig::new(
1280, 720, 25, 2_500_000, 8554, device_ip,
));
soap.register_handler("GetProfiles", Box::new(GetProfilesHandler::new(Arc::clone(&media))));
soap.register_handler("GetStreamUri", Box::new(GetStreamUriHandler::new(Arc::clone(&media))));
tokio::spawn(soap.start());
}
要点:
- 设备身份必须显式配置(
DeviceServiceHandlers::new会校验); 匿名可访问的动作逐个放行(规范要求时钟与能力匿名)。 - ONVIF 层只播报地址:RTSP 服务器与快照 HTTP 端点在你的宿主里 (媒体服务)。
- 配
DiscoveryServer即可被 NVR 的 WS-Discovery 探测发现 (WS-Discovery)。 - 示例值均为文档保留段(
192.0.2.x、占位密码)。
下一步
- 动作 handler 模型:每个 SOAP action 的注册与接线。
- 认证与加固:WS-UsernameToken 摘要与匿名面控制。
- PTZ / 成像:可选服务。
- 仓库内置
cargo run --example device_demo:自检式全流程演示。