3 个版本
0.9.2 | 2021 年 10 月 14 日 |
---|---|
0.9.1 | 2021 年 3 月 24 日 |
0.9.0 | 2020 年 9 月 18 日 |
#1001 in Unix API
10,578 下载量/月
在 17 个 crate 中使用(直接使用 10 个)
485KB
9K SLoC
D-Bus 绑定库 for Rust
- 使用
blocking::Connection
连接到会话或系统总线。 (或SyncConnection
/LocalConnection
) - 使用
Message
发送和接收消息。获取和附加所有类型的参数,请参阅 参数指南 了解详细信息。 - 使用
dbus-crossroads
或dbus-tree
crate 构建方法调度服务器。支持标准 D-Bus 接口( introspection,属性,对象管理器)。
重大变更
主 dbus crate 相当成熟,您需要的所有功能都应该都有。重大变更仍然可能发生,但不太常见。
- 在 0.9 中,
dbus::tree
模块已移动到dbus-tree
crate(但请考虑迁移到dbus-crossroads
)。 - 如果您目前使用的是 dbus 的 0.6.x 版本并希望升级到更高版本,您可以阅读 dbus-rs 0.7 的变更。
其他 crate
- dbus-crossroads 用于轻松构建方法调度服务器。
- dbus-tokio 将 D-Bus 与 Tokio 集成。
- dbus-codegen 安装一个二进制工具,可以从 D-Bus XML introspection 数据生成 Rust 代码。 readme 包含了如何使用它的介绍。
- libdbus-sys 包含对 libdbus 的原始 FFI 绑定。
- dbus-tree 简化了方法调度服务器的构建(旧版设计)。
邀请
您被邀请参与这些crate的开发。
代码采用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
总线名称,添加 /hello
路径,该路径实现了 com.example.dbustest
接口,并指定此接口有一个 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
,位于示例目录中
特性
《code>futures 特性使得 dbus
依赖于 futures
crate。这启用了 nonblock
模块(由 dbus-tokio
crate 使用)。
《code>no-string-validation 特性跳过了一个额外的检查,即特定的字符串(例如 Path
、ErrorName
等)是否符合 D-Bus 规范,这也可能使事情稍微快一点。但 - 如果您这样做,并且实际上向 D-Bus 库发送无效的字符串,您可能会收到一个恐慌而不是适当的错误。
要求
Libdbus 1.6 或更高版本,以及最新稳定版本的 Rust。如果您运行 Ubuntu(任何维护版本都应正常),这意味着在构建时需要安装 libdbus-1-dev
和 pkg-config
软件包,并在运行时安装 libdbus-1-3
软件包。
交叉编译 libdbus 可能有点棘手,因为它绑定到一个 C 库,这里有一些说明 在这里。
依赖
~4.5MB
~106K SLoC