如何使用zbus设置Null Destination接收无目标D-Bus信号?
解决zbus接收Null Destination信号的问题
你用ProxyBuilder设置空目标行不通,因为Proxy是为与特定DBus服务交互设计的,而Null Destination的信号是广播信号,需要直接通过Connection来匹配监听,而非Proxy。
修改后的可运行代码如下:
use tokio_stream::StreamExt; use zbus::{Connection, MessageFilter}; #[tokio::main] async fn main() -> zbus::Result<()> { // 连接到系统总线 let connection = Connection::system().await?; // 创建信号过滤器:匹配指定路径、接口、信号名,不限制发送方(对应Null Destination) let filter = MessageFilter::new() .path("/")? .interface("com.example.greeting")? .member("GreetingSignal")?; // 应用过滤器,获取信号流 let mut signal_stream = connection.add_message_filter(filter).await?; while let Some(msg) = signal_stream.next().await { let grt: String = msg.body().deserialize()?; println!("收到信号:{}", grt); } Ok(()) }
关键说明:
- 放弃使用
Proxy,直接调用Connection::add_message_filter方法,它支持创建灵活的信号匹配规则,无需指定目标服务,正好对应Null Destination的广播信号场景。 - 你用
dbus-send发送的是无目标的广播信号,所有监听对应路径、接口、信号名的客户端都能接收,上述过滤器完全匹配这类信号。 - 之前尝试的
BusName::null_value()、空字符串等方式不适用于Proxy,因为Proxy必须绑定到有效的服务名或唯一名称,而广播信号不属于特定服务,所以Proxy不支持这种场景。
内容的提问来源于stack exchange,提问作者anoond
相关产品推荐
相关产品推荐

