#dbus #ipc

dbus-strings

Rust 对不同 D-Bus 字符串类型的本地实现

1 个不稳定版本

0.1.0 2020年2月25日

#1098 in Rust 模式

Apache-2.0/MIT

20KB
435

D-Bus 绑定库 for Rust

crates.io API documentation license Github CI

  • 使用 blocking::Connection 连接到会话或系统总线。 (或 SyncConnection / LocalConnection)
  • 使用 Message 发送和接收消息。获取并附加所有类型的参数,请参阅参数指南以获取详细信息。
  • 使用 dbus-crossroadsdbus-tree 包构建方法调度服务器。支持标准 D-Bus 接口(内省、属性、对象管理器)。

重大变更

主要的 dbus 包相对成熟,您需要的特性应该都有。重大变更仍然可能发生,但不会很频繁。

  • 在 0.9 中,dbus::tree 模块已移动到 dbus-tree 包(但请考虑迁移到 dbus-crossroads)。
  • 如果您目前正在使用 0.6.x 的 dbus 并希望升级到更高版本,您可以阅读 dbus-rs 0.7 的变更

额外的包

  • dbus-crossroads 用于轻松构建方法调度服务器。API 文档
  • dbus-tokio 将 D-Bus 与 Tokio 集成。API 文档
  • dbus-codegen 安装一个二进制工具,该工具可以从 D-Bus XML 内省数据生成 Rust 代码。请参阅 README 了解如何使用它。
  • libdbus-sys 包含对 libdbus 的原始 FFI 绑定。
  • dbus-tree 简化了构建方法调度服务器(旧设计)。API 文档

邀请

您被邀请参与这些包的开发

  • 如果您发现了一个您认为的 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总线名称,添加实现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依赖于futurescrate。这启用了nonblock模块(由dbus-tokiocrate使用)。

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 crate(即,没有绑定到C库)。更多替代方案请参阅此处,但我不确定它们的可用性。


lib.rs:

一个小型crate,它实现了不同类型的D-Bus字符串的Rust本地实现。

无运行时依赖