#协议 #网络

程序+库 upnp-rs

提供基本的通用即插即用(UPnP)协议实现

2个不稳定版本

0.2.0 2022年7月7日
0.1.0 2020年2月18日

983 in 网络编程

MIT许可

160KB
3K SLoC

Crate upnp-rs

一个提供基本通用即插即用(UPnP)协议实现的Rust crate。

MIT License Minimum Rust Version crates.io docs.rs GitHub stars

实现了UPnP设备架构(UDA)的核心协议,特别是控制点用于搜索设备和设备用于通知设备和服务可用性的发现协议。

UPnP技术允许设备无缝连接,并简化家庭和企业环境中的网络实现 — 开放连接基金会

用法

将以下内容添加到您的Cargo.toml;目前此crate没有可选功能。

upnp-rs = "0.2"

API

主要客户端接口是提供searchnotify功能的discovery模块。随着时间的推移,将完成description模块,用于解析和生成设备描述消息。以下图表显示了库的基本结构,其中两个API模块分别依赖于HTTPMU/HTTPU和SOAP的实现。

,--------, discover ,--------,     advertise     ,--------,
|        |--------->| disco. |<------------------|        |
| Client |          '--------'                   | Server |
|  API   | understand   :    ,--------, describe |  API   |
|        |------------------>| descr. |<---------|        |
'--------'              :    '--------'          '--------'
                        :         :
                        :         V
                        :    ,--------,
                        :    |  SOAP  |
                        :    '--------'
                        :         :
                        V         :
                    ,--------,    :
                    | HTTPMU |    :
                    '--------'    :
                        :         :
                        V         V              TCP/UDP
    ,---------------------------------------------------,

示例

use upnp_rs::SpecVersion;
use upnp_rs::ssdp::search::*;

let mut options = Options::default_for(SpecVersion::V10);
options.search_target = SearchTarget::RootDevices;

match search_once(options) {
    Ok(responses) => {
        println!("search returned {} results.", responses.len());
        for (index, response) in responses.iter().enumerate() {
            println!("{}: {:#?}", index, response);
        }
    }
    Err(error) => {
        println!("search failed with error: {:#?}", error);
    }
}

命令行

可以使用命令行工具upnp使用SSDP API执行基本操作。这些主要用于测试,但搜索命令可以用于通用发现。

命令的一般形式是network-options command command-options,如下所示。

upnp 0.2.0
UPnP simple qery/discovery tool.

USAGE:
    upnp [FLAGS] [OPTIONS] <SUBCOMMAND>

FLAGS:
    -h, --help        Prints help information
    -6, --use-ipv6    Use IPv6 instead of the default v4
        --version     Prints version information
    -v, --verbose     The level of logging to perform, from off to trace; the default is off

OPTIONS:
        --interface <interface>          The network interface name to bind to; the default is all
    -V, --spec-version <spec-version>    The UPnP version to use, 1.0, 1.1, or 2.0; the default is 1.0

SUBCOMMANDS:
    help      Prints this message or the help of the given subcommand(s)
    listen    Listen for device notifications
    search    Issue a multicast search to find devices
  • interface这是本地网络接口的名称,例如en0
$ upnp search --help
upnp-search 0.2.0
Issue a multicast search to find devices

USAGE:
    upnp search [OPTIONS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -d, --domain <domain>                  A domain to use in constructing device and service type targets; the default
                                           is the UPnP domain
    -w, --max-wait <max-wait>              The maximum wait time, in seconds, for devices to respond to multicast; the
                                           default is 2
    -s, --search-target <search-target>    The UPnP search target (all, root, device:{id}, device-type:{id}, service-
                                           type:{id}); the default is root

变更

版本0.2.0

  • 重写了错误处理,以拥有更多离散的错误和更好的报告。
  • logenv_logger迁移到tracingtracing_subscriber
  • 升级了依赖项,特别是报告存在漏洞的pnet
  • 将所有协议常量移动到syntax模块。
  • 使用crate os_version进行平台检测。
  • 添加了构建文件并调整了工作流程以获得干净的Windows构建。

版本0.1.0

  • 能够发出多播非缓存搜索命令,并带有解析结果。
  • 发送多播设备通知的能力。
  • 使用命令行工具 upnp 发出测试命令。

待办事项

  1. 完成搜索结果的解析。
  2. 支持监听通知。
  3. 支持获取设备详情。4. 支持发送通知。

依赖项

~8–22MB
~332K SLoC