11 个版本
0.2.1 | 2023 年 9 月 9 日 |
---|---|
0.2.0 | 2023 年 9 月 8 日 |
0.1.39 | 2023 年 9 月 5 日 |
#1472 在 网络编程
每月 69 次下载
38KB
701 行
ONVIF Rust 库
ONVIF 是许多 IP 摄像头广泛使用的行业协议。如果一个摄像头符合 ONVIF 标准,你可以发现它的 IP 地址并查询其各种功能和规范。
这个 Rust 库目前提供了一些协议的非常基础的实现。更多功能正在计划中。
这是 ONVIF 协议的非常基础的实现。以下消息已实现:
- 发现
- 功能
- 设备信息
- 配置文件
- 获取流 URI
- 以及更多...(下面为完整列表)
这些消息的实现非常基础,在很多情况下不存储或解析整个 SOAP 响应。整个库实际上是为了支持我写的 RTSP/RTP/H264 流媒体客户端而编写的,该客户端很快将成为一个 Rust crate:https://github.com/gsuyemoto/rtsp-rtp-rs。
示例发现一个 IP 摄像头(仅在单个 Topodome 上测试过)并使用 OpenCV 通过 RTP 流和 Haar 级联检测面部。
为了运行示例,你需要 Clang 和 OpenCV。在 Debian Linux 上
sudo apt-get install libclang-dev libopencv-dev
入门
当创建一个新的 Client 对象时,Client 首先会查看基本目录中是否有文件提供关于摄像头和 IP 地址的信息。如果没有该文件,Client 将在网络中广播一个预定义的消息,符合标准的摄像头应回复其 IP 地址。有了 IP 地址,你可以继续查询设备以获取更多信息。
use anyhow::Result;
use onvif_cam_rs::builder::camera::CameraBuilder;
use onvif_cam_rs::client::{self, Messages};
use onvif_cam_rs::device::camera::Camera;
#[tokio::main]
async fn main() -> Result<()> {
// Find all IP Devices on local network using ONVIF
let mut devices = client::discover().await?;
let mut cameras: Vec<Camera> = Vec::new();
// Enumerate all Camera devices found
for device in devices {
let mut camera = Camera::new(device);
camera.build_all().await?;
cameras.push(camera);
}
// Get the RTSP streaming URL for the first camera
match &cameras[0].stream.uri {
Some(url) => println!("Stream uri: {url}"),
None => panic!("Ooops"),
}
Ok(())
}
创建一个超级简单的 Camera 设备对象的示例可以是这样
use anyhow::Result;
use onvif_cam_rs::builder::camera::CameraBuilder;
use onvif_cam_rs::device::camera::Camera;
#[tokio::main]
async fn main() -> Result<()> {
let mut camera = Camera::from("http://192.168.1.100:8080/onvif/device_service");
camera.build_all().await?;
Ok(())
}
这可能在测试时效果更好,因为一些摄像头和设备可能会因为过多的发现消息而超时。
已实现的消息
- 发现
- 功能
- 设备信息
- 配置文件
- 获取流 URI
- GetServices
消息启动(基本响应和无解析回复)
- GetServiceCapabilities
- GetDNS
- GetDot11Status
- GetGeoLocation
- CreatePullPointSubscriptionRequest
依赖
~6–19MB
~274K SLoC