#upnp #protocols #networking #async #media-server

rupnp

一个异步库,用于查找 UPnP 控制点,对其执行操作并读取其服务描述

11 个版本 (3 个稳定版本)

2.0.0 2023 年 9 月 16 日
1.1.1 2022 年 2 月 21 日
1.0.0 2020 年 12 月 23 日
0.1.7 2020 年 11 月 11 日
0.1.5 2020 年 4 月 27 日

#1154 in 网络编程

Download history 6593/week @ 2024-04-14 8991/week @ 2024-04-21 4483/week @ 2024-04-28 7347/week @ 2024-05-05 8880/week @ 2024-05-12 6502/week @ 2024-05-19 6285/week @ 2024-05-26 7789/week @ 2024-06-02 7540/week @ 2024-06-09 8347/week @ 2024-06-16 6122/week @ 2024-06-23 7833/week @ 2024-06-30 9058/week @ 2024-07-07 7335/week @ 2024-07-14 6650/week @ 2024-07-21 6567/week @ 2024-07-28

30,067 每月下载量
5 个 Crates 中使用 (4 个直接使用)

MIT/Apache

52KB
1K SLoC

GitHub last commit Crates.io

rupnp

一个异步库,用于查找 UPnP 控制点,对其执行操作并读取其服务描述。UPnP 代表 通用插头和插座,广泛用于路由器、支持 WiFi 的扬声器和媒体服务器。

规范: http://rupnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf

示例用法

以下代码搜索具有 RenderingControl 服务的设备,并打印它们的名称及其当前音量。

use futures::prelude::*;
use std::time::Duration;
use rupnp::ssdp::{SearchTarget, URN};

const RENDERING_CONTROL: URN = URN::service("schemas-upnp-org", "RenderingControl", 1);

#[tokio::main]
async fn main() -> Result<(), rupnp::Error> {
    let search_target = SearchTarget::URN(RENDERING_CONTROL);
    let devices = rupnp::discover(&search_target, Duration::from_secs(3)).await?;
    pin_utils::pin_mut!(devices);

    while let Some(device) = devices.try_next().await? {
        let service = device
            .find_service(&RENDERING_CONTROL)
            .expect("searched for RenderingControl, got something else");

        let args = "<InstanceID>0</InstanceID><Channel>Master</Channel>";
        let response = service.action(device.url(), "GetVolume", args).await?;

        let volume = response.get("CurrentVolume").unwrap();

        println!("'{}' is at volume {}", device.friendly_name(), volume);
    }

    Ok(())
}

许可证

许可协议为以下之一

由您选择。

贡献

请在任何拉取请求之前使用 rustfmt

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您提交的任何有意提交以包含在作品中的贡献,将根据上述条款双许可,不附加任何额外条款或条件。

依赖关系

~5–13MB
~148K SLoC