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

Download history 82119/week @ 2024-04-22 80659/week @ 2024-04-29 84268/week @ 2024-05-06 76614/week @ 2024-05-13 78278/week @ 2024-05-20 80429/week @ 2024-05-27 80374/week @ 2024-06-03 81664/week @ 2024-06-10 88680/week @ 2024-06-17 88596/week @ 2024-06-24 84181/week @ 2024-07-01 95091/week @ 2024-07-08 92255/week @ 2024-07-15 107311/week @ 2024-07-22 104200/week @ 2024-07-29 112198/week @ 2024-08-05

423,062 每月下载量
用于 309 个crate(141个直接使用)

Apache-2.0/MIT

5MB
112K SLoC

C 101K SLoC // 0.2% comments Rust 8K SLoC // 0.0% comments Automake 1.5K SLoC // 0.0% comments Shell 1K SLoC // 0.3% comments Bitbake 471 SLoC // 0.0% comments M4 358 SLoC // 0.5% comments XSL 115 SLoC // 0.1% comments Python 86 SLoC // 0.1% comments PowerShell 44 SLoC // 0.2% comments C++ 21 SLoC // 0.5% comments Batch 14 SLoC

Rust的D-Bus绑定

crates.io API documentation license Github CI

  • 使用 blocking::Connection 连接到会话或系统总线。(或者 SyncConnection / LocalConnection
  • 使用 Message 发送和接收消息。获取和追加所有类型的参数,请参阅参数指南获取详细信息。
  • 使用 dbus-crossroadsdbus-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 用于轻松构建方法分派服务器。 API文档
  • dbus-tokio 将D-Bus与Tokio集成。 API文档
  • dbus-codegen 安装一个二进制工具,该工具可以从D-Bus XML introspection数据生成Rust代码。 readme 包含了如何使用它的介绍。
  • libdbus-sys 包含对 libdbus 的原始 FFI 绑定。
  • dbus-tree 便于构建方法调度服务器(旧版设计)。 API 文档

邀请

现邀请您参与这些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 特性跳过了一个额外的检查,即特定的字符串(例如 PathErrorName 等)是否符合 D-Bus 规范,这可能会让事情变得稍微快一点。但是——如果您这样做,然后实际上向 D-Bus 库发送无效的字符串,您可能会得到恐慌而不是适当的错误。

要求

默认

Libdbus 1.6 或更高版本,以及 Rust 的最新稳定版本。如果您运行 Ubuntu(任何受维护的版本都应没问题),这意味着在构建时安装 libdbus-1-devpkg-config 软件包,并在运行时安装 libdbus-1-3 软件包。

供应商

如果启用了 vendored 特性,则没有默认要求。

vendored 特性是目前推荐用于交叉编译 dbus-rs 的方法。更多信息和其他方法在这里提及。

替代方案

zbusrustbus(停滞?)是使用 Rust 完全编写的 D-Bus 库(即,没有绑定到 C 库)。还有一些替代方案列在这里,但我不确定它们的可用性如何。

依赖项