11 个版本

0.2.1 2023 年 9 月 9 日
0.2.0 2023 年 9 月 8 日
0.1.39 2023 年 9 月 5 日

#1472网络编程

Download history 2/week @ 2024-05-22 1/week @ 2024-06-26 54/week @ 2024-07-03

每月 69 次下载

MIT 许可证

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