#dbus #ipc #api-bindings

dbus-tree

编写 D-Bus 方法处理程序框架(已过时)

3 个版本

0.9.2 2021 年 10 月 14 日
0.9.1 2021 年 3 月 24 日
0.9.0 2020 年 9 月 18 日

#1001 in Unix API

Download history 2199/week @ 2024-04-03 2618/week @ 2024-04-10 1923/week @ 2024-04-17 2376/week @ 2024-04-24 3059/week @ 2024-05-01 2821/week @ 2024-05-08 2336/week @ 2024-05-15 2383/week @ 2024-05-22 3582/week @ 2024-05-29 2379/week @ 2024-06-05 2282/week @ 2024-06-12 3086/week @ 2024-06-19 2439/week @ 2024-06-26 2372/week @ 2024-07-03 2665/week @ 2024-07-10 2400/week @ 2024-07-17

10,578 下载量/月
17 crate 中使用(直接使用 10 个)

Apache-2.0/MIT

485KB
9K SLoC

D-Bus 绑定库 for Rust

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 documentation
  • dbus-tokio 将 D-Bus 与 Tokio 集成。 API documentation
  • dbus-codegen 安装一个二进制工具,可以从 D-Bus XML introspection 数据生成 Rust 代码。 readme 包含了如何使用它的介绍。
  • libdbus-sys 包含对 libdbus 的原始 FFI 绑定。
  • dbus-tree 简化了方法调度服务器的构建(旧版设计)。API 文档

邀请

您被邀请参与这些crate的开发。

  • 如果您发现了您认为的bug,请提交问题
  • 如果您有文档难以轻松解答的问题或评论,请开始讨论
  • 如果您对代码、文档、示例等有较小的改进,可以直接提交拉取请求。较大的工作建议先进行讨论。

代码采用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 特性跳过了一个额外的检查,即特定的字符串(例如 PathErrorName 等)是否符合 D-Bus 规范,这也可能使事情稍微快一点。但 - 如果您这样做,并且实际上向 D-Bus 库发送无效的字符串,您可能会收到一个恐慌而不是适当的错误。

要求

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

交叉编译 libdbus 可能有点棘手,因为它绑定到一个 C 库,这里有一些说明 在这里

依赖

~4.5MB
~106K SLoC