1 个不稳定版本
0.1.0 | 2020年2月25日 |
---|
#1098 in Rust 模式
20KB
435 行
D-Bus 绑定库 for Rust
- 使用
blocking::Connection
连接到会话或系统总线。 (或SyncConnection
/LocalConnection
) - 使用
Message
发送和接收消息。获取并附加所有类型的参数,请参阅参数指南以获取详细信息。 - 使用
dbus-crossroads
或dbus-tree
包构建方法调度服务器。支持标准 D-Bus 接口(内省、属性、对象管理器)。
重大变更
主要的 dbus 包相对成熟,您需要的特性应该都有。重大变更仍然可能发生,但不会很频繁。
- 在 0.9 中,
dbus::tree
模块已移动到dbus-tree
包(但请考虑迁移到dbus-crossroads
)。 - 如果您目前正在使用 0.6.x 的 dbus 并希望升级到更高版本,您可以阅读 dbus-rs 0.7 的变更。
额外的包
- dbus-crossroads 用于轻松构建方法调度服务器。
- dbus-tokio 将 D-Bus 与 Tokio 集成。
- dbus-codegen 安装一个二进制工具,该工具可以从 D-Bus XML 内省数据生成 Rust 代码。请参阅 README 了解如何使用它。
- libdbus-sys 包含对 libdbus 的原始 FFI 绑定。
- dbus-tree 简化了构建方法调度服务器(旧设计)。
邀请
您被邀请参与这些包的开发
代码是Apache 2.0 / MIT双授权。所有通过拉取请求、讨论或问题提交的代码默认假设具有此授权,除非明确说明否则。
示例
客户端
此示例打开与会话总线的连接,并请求当前所有名称的列表。
use dbus::blocking::Connection;
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// First open up a connection to the session bus.
let conn = Connection::new_session()?;
// Second, create a wrapper struct around the connection that makes it easy
// to send method calls to a specific destination and path.
let proxy = conn.with_proxy("org.freedesktop.DBus", "/", Duration::from_millis(5000));
// Now make the method call. The ListNames method call takes zero input parameters and
// one output parameter which is an array of strings.
// Therefore the input is a zero tuple "()", and the output is a single tuple "(names,)".
let (names,): (Vec<String>,) = proxy.method_call("org.freedesktop.DBus", "ListNames", ())?;
// Let's print all the names to stdout.
for name in names { println!("{}", name); }
Ok(())
}
示例目录中的客户端代码示例
服务器
此示例获取com.example.dbustest
总线名称,添加实现com.example.dbustest
接口的/hello
路径,并指定该接口有一个Hello
方法。然后在此路径上监听传入的D-Bus方法调用并相应处理。
dbus-crossroads:
let c = Connection::new_session()?;
c.request_name("com.example.dbustest", false, true, false)?;
let mut cr = Crossroads::new();
let token = cr.register("com.example.dbustest", |b| {
b.method("Hello", ("name",), ("reply",), |_, _, (name,): (String,)| {
Ok((format!("Hello {}!", name),))
});
});
cr.insert("/hello", &[token], ());
cr.serve(&c)?;
示例目录中使用dbus-crossroads
的示例服务器代码
dbus-tree:
let c = Connection::new_session()?;
c.request_name("com.example.dbustest", false, true, false)?;
let f = Factory::new_fn::<()>();
let tree = f.tree(())
.add(f.object_path("/hello", ()).introspectable()
.add(f.interface("com.example.dbustest", ())
.add_m(f.method("Hello", (), |m| {
let n: &str = m.msg.read1()?;
let s = format!("Hello {}!", n);
Ok(vec!(m.msg.method_return().append1(s)))
}).inarg::<&str,_>("name")
.outarg::<&str,_>("reply")
)
).add(f.object_path("/", ()).introspectable());
tree.start_receive(&c);
loop { c.process(Duration::from_millis(1000))?; }
示例目录中使用dbus-tree
的示例服务器代码
特性
futures
特性使dbus
依赖于futures
crate。这启用了nonblock
模块(由dbus-tokio
crate使用)。
vendored
特性将libdbus静态链接到最终的可执行文件中。
stdfd
特性使用std的OwnedFd
而不是dbus自有的。(这将是下一个主要版本的默认值。)
no-string-validation
特性跳过了额外的检查,即特定的字符串(例如Path
、ErrorName
等)是否符合D-Bus规范,这可能会使事情稍微快一点。但是——如果您这样做,并且实际上向D-Bus库发送了无效的字符串,您可能会收到恐慌而不是适当的错误。
需求
默认
Libdbus 1.6或更高版本,以及Rust的最新稳定版本。如果您运行Ubuntu(任何维护版本都应无问题),这意味着在构建时需要安装libdbus-1-dev
和pkg-config
包,并在运行时安装libdbus-1-3
包。
供应商
如果启用了vendored
特性,则没有默认需求。
vendored
特性是当前推荐的方式,用于交叉编译dbus-rs。更多信息和其他方法请参阅此处。
替代方案
zbus和rustbus(停滞?)是完全用Rust编写的D-Bus crate(即,没有绑定到C库)。更多替代方案请参阅此处,但我不确定它们的可用性。
lib.rs
:
一个小型crate,它实现了不同类型的D-Bus字符串的Rust本地实现。