3个版本 (破坏性更新)
0.3.0 | 2023年4月15日 |
---|---|
0.2.0 | 2022年3月20日 |
0.1.0 | 2022年3月20日 |
#38 in #服务发现
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