【问题标题】:How to connect to the systemd D-Bus org.freedesktop.timedate1 endpoint in Rust?如何连接到 Rust 中的 systemd D-Bus org.freedesktop.timedate1 端点?
【发布时间】:2020-07-25 07:02:38
【问题描述】:

我正在使用 Raspberry Pi Zero 和当前的 Raspbian Linux 发行版。我正在尝试使用systemd D-Bus 接口编写Rust 代码来设置时区(如"America/New_york")。我发现timedatectl 的systemd 端点是org.freedesktop.timedate1。

我正在尝试使用 Rust dbus crate。我已经使用dbus-send先进行测试以确保该方法有效:

$ dbus-send --system --dest=org.freedesktop.timedate1 --type=method_call --print-reply /org/freedesktop/timedate1 org.freedesktop.DBus.Properties.Get string:org.freedesktop.timedate1 string:Timezone

method return time=1596003827.891792 sender=:1.47 -> destination=:1.46 serial=3 reply_serial=2
   variant       string "America/Los_Angeles"

使用 Rust 代码:

use dbus::blocking::Connection;
use std::time::Duration;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let conn = Connection::new_system()?;
    let proxy = conn.with_proxy("org.freedesktop.timedate1", "/org/freedesktop/timedate1", Duration::from_millis(5000));
    // a dbus variant should be returned
    let name = proxy.method_call("org.freedesktop.DBus.Properties", "Get", ("org.freedesktop.timedate1", "Timezone",))?;
    println!("{:#?}", name);
    Ok(())
}

我运行它但得到一个空结果:

$ cargo run
   Compiling dbus-test v0.1.0 (/home/pi/dbus-test)
    Finished dev [unoptimized + debuginfo] target(s) in 12.28s
     Running `target/debug/dbus-test`
()

我在这里做错了什么?

【问题讨论】:

  • 执行“rust D-Bus”搜索会导致dbus crate 具有examples。按照目前的表述,这个问题并不能表明您已经为解决问题付出了很多努力。
  • 正如我已经说过的,我是 rust 新手,只是尝试向专家和示例学习。非常感谢您的指点。
  • @Shepmaster,我已经更新了我的帖子,还有更多指点吗?

标签: rust raspbian dbus


【解决方案1】:

Crate dbus 似乎不是一个好的建议。

我发现ruby-dbus 库更容易,因为它遵循 D-Bus 的服务、对象、接口和方法结构。这是我对上述示例的快速测试代码:

require "dbus"
sysbus = DBus.system_bus
time_service = sysbus["org.freedesktop.timedate1"]
time_object = time_service["/org/freedesktop/timedate1"]
time_interface = time_object["org.freedesktop.timedate1"]
timezone = time_interface["Timezone"]
puts "Your timezone is set to #{timezone}"

【讨论】:

    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2018-12-09
    • 2015-10-20
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2019-10-10
    相关资源
    最近更新 更多