UDisks2 的 Dbus 自省不完整?

Posted

技术标签:

【中文标题】UDisks2 的 Dbus 自省不完整?【英文标题】:Dbus instrospection incomplete for UDisks2? 【发布时间】:2021-03-20 22:00:31 【问题描述】:

我正在使用 java dbus 接口。由于它不完整,我们必须使用dbus自省工具生成xml文件,然后将其转换为Java类。

我希望能够在驱动器插入系统或从系统中移除时接收信号。

为此,我发现信号 InterfacesAdded 和 InterfacesRemoved 是我正在搜索的。

我已使用此命令生成 xml 内省文件:

gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2 --xml

它生成了一个文件,我用这个命令转换了它:

CreateInterface --system --no-ignore-builtin --create-files org.freedesktop.UDisks2.xml

我现在能够接收 InterfacesAdded 信号,但不能接收 InterfacesRemoved 信号。

似乎有问题,这个信号想要给出block_devices节点中的一些信息。但是对于这个节点,xml 文件是空的:

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
                      "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<!-- GDBus 2.66.2 -->
<node>
  <interface name="org.freedesktop.DBus.Properties">
    ... snip ...
  <interface name="org.freedesktop.DBus.ObjectManager">
    <method name="GetManagedObjects">
      <arg type="aoasasv" name="object_paths_interfaces_and_properties" direction="out"/>
    </method>
    <signal name="InterfacesAdded">
      <arg type="o" name="object_path"/>
      <arg type="asasv" name="interfaces_and_properties"/>
    </signal>
    <signal name="InterfacesRemoved">
      <arg type="o" name="object_path"/>
      <arg type="as" name="interfaces"/>
    </signal>
  </interface>
  <node name="Manager"/>
  <node name="drives"/>
  <node name="block_devices"/>
</node>

因此,java 代码不知道如何创建信号。

我能做些什么呢?

【问题讨论】:

“这个信号想要给出block_devices节点中的一些信息”——你是怎么得出这个结论的?如果您使用的 java 工具无法处理额外的节点,请尝试手动将它们从 xml 中删除。 空节点不会被 CreateInterface 工具转置为类。所以从 xml 中删除它不会改变任何东西。我的结论来自异常:org.freedesktop.dbus.exceptions.DBusException: Failed to create proxy object for /org/freedesktop/UDisks2/block_devices/sdb export by :1.75。原因:找不到要转换的接口 【参考方案1】:

我认为核心误解是这样的:您为对象/org/freedesktop/UDisks2 生成接口文件,然后在您的代码中使用这些接口文件为/org/freedesktop/UDisks2/block_devices/sdb 实现的接口创建代理。这些对象实现了不同的接口。

您将需要为您创建代理的所有接口定义接口。我无法通过自省给出确切的命令来执行此操作,但只要找到合适的对象,您就可以使用相同的方法来生成它们。举个例子:

gdbus introspect --system --xml \
    --dest org.freedesktop.UDisks2 \
    --object-path /org/freedesktop/UDisks2/block_devices/nvme0n1

在我的机器上为org.freedesktop.UDisks2.Blockorg.freedesktop.UDisks2.PartitionTable 生成接口定义。

也就是说,UDisks2 似乎在源代码中提供了所有 org.freedesktop.UDisks2.* 接口:org.freedesktop.UDisks2.xml。

【讨论】:

谢谢!事实上,我必须导出块定义(并从 2.7.2 到 3.2.3 进行重大更新)。

以上是关于UDisks2 的 Dbus 自省不完整?的主要内容,如果未能解决你的问题,请参考以下文章

如何从python将'a sv' dbus签名传递给udisks2.Mount()?

尝试获取具有自定义类型的 DBus 属性时出现致命错误

dbus-send

BlueZ DBUS API - GATT 接口对 BLE 设备不可用

由于 QDBusRawType,dbus-send 失败

使用 dbus-binding-tool 的 glib dbus 服务示例?