45个版本
0.9.7 | 2023年1月6日 |
---|---|
0.9.6 | 2022年7月10日 |
0.9.5 | 2021年10月2日 |
0.9.3 | 2021年6月14日 |
0.0.6 | 2015年3月4日 |
#7 in Unix API
423,062 每月下载量
用于 309 个crate(141个直接使用)
5MB
112K SLoC
Rust的D-Bus绑定
- 使用
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的开发。
- 如果您发现了您认为是bug的问题,请提交问题。
- 如果您有疑问或评论,文档难以简单解答,请发起讨论。
- 如果您对代码、文档、示例等有较小的改进,请提交pull request。较大的工作建议先进行讨论。
代码采用 Apache 2.0 / MIT 双重许可。除非明确声明,否则所有通过pull request、讨论或问题提交的代码都假定具有此许可。
示例
客户端
此示例打开到会话总线的连接,并请求当前存在的所有名称列表。
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 库(即,没有绑定到 C 库)。还有一些替代方案列在这里,但我不确定它们的可用性如何。