#服务发现 #发现 #协议 #网络 #lenbrook

lsdp

基于Rust的Lenbrook服务发现协议

3个版本 (破坏性更新)

0.3.0 2023年4月15日
0.2.0 2022年3月20日
0.1.0 2022年3月20日

#38 in #服务发现

WTFPL 许可证

22KB
539 代码行

LSDP(Lenbrook服务发现协议)在Rust中

你可能从未听说过这个协议。在实现它之前,我自己也从未听说过。Lenbrook集团是Bluesound、NAD等品牌的制造商,并决定在现有的众多服务发现协议中不利用,而是编写自己的协议。

为什么制造商会放弃使用像mDNS或SSDP这样的成熟标准呢?Lenbrook声称这是因为他们的客户缺乏配置网络的能力。也许如果他们的客户没有购买“发烧友”垃圾路由器,这个问题就不会那么严重,但事实就是这样。

该协议基本上是一个比mDNS更差的UDP广播版本,而不是UDP多播。为了在Rust中获取一些解析二进制协议的经验,我编写了这个crate,主要是为了探索Nom。这个crate默认开启了tokio功能,这有助于服务发现,但如果你出于某种原因只想进行解码,你可以禁用tokio功能,这将给你一个相对轻量级的crate。

我该如何使用这个crate?

use anyhow::Result;
use lsdp::{net::Discover, ClassID};

#[tokio::main]
async fn main() -> Result<()> {
    println!("Finding devices using LSDP");

    let d = Discover::start().await?;

    d.query(lsdp::QueryMessage::new(vec![ClassID::All])).await?;

    tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;

    for (_, d) in d.inventory().await.lock().await.iter() {
        println!(
            "Found {}: {:?} with data {:?}",
            d.addr, d.records[0].cid, d.records[0].data
        );
    }

    Ok(())
}

依赖项

~1–30MB
~428K SLoC