使用 dbus-send 调用 GetAll

Posted

技术标签:

【中文标题】使用 dbus-send 调用 GetAll【英文标题】:Using dbus-send to call GetAll 【发布时间】:2014-09-02 05:59:20 【问题描述】:

我试试运气:

  dbus-send --system --print-reply  \   
     --dest=org.freedesktop.UDisks \
      /org/freedesktop/UIDisks/devices/md0 \
      org.freedesktop.DBus.Properties.GetAll \
      string:""

如果我使用 d-free 并发送 "" 作为 GetAll 的参数,我得到一长串输出

尝试上面的代码只会报错:

Error org.freedesktop.DBus.Error.UnknownMethod: Method "GetAll" with signature "s" on
interface "org.freedesktop.DBus.Properties" doesn't exist

所以我做错了,但我不知道出了什么问题。我搜索了一个解决方案,但没有想出一个像样的解决方案。也许这很琐碎,但我不知道....

【问题讨论】:

【参考方案1】:

您需要指定接口名称作为 GetAll 的参数。这个例子对我有用(我有 UDisks2 而不是 UDisks 但其他方面是相似的):

dbus-send --system --print-reply \
   --dest=org.freedesktop.UDisks2 \ 
   /org/freedesktop/UDisks2/block_devices/loop0 
   org.freedesktop.DBus.Properties.GetAll 
   string:"org.freedesktop.UDisks2.Block"

【讨论】:

抱歉,如果我在 d-feet 中输入一个空字符串,我会得到:'DeviceAutomountHint': '', 'DeviceBlockSize': 512L, 'DeviceDetectionTime': 1405083881L, 'DeviceFile': '/dev /md0', 'DeviceFileById': ['/dev/disk/by-id/md-uuid-d56d4165:72b8959a:ea459adc:678b0998', '/dev/disk/by-uuid/0bfac438-3d04-4d4e-a71c- 2f4a3e63a8e9'],'DeviceFileByPath':[],'DeviceFilePresentation':'/dev/md0','DeviceIsDrive':真,'DeviceIsLinuxDmmp':假,'DeviceIsLinuxDmmpComponent':假,'DeviceIsLinuxLoop':假,'DeviceIsLinuxLvm2LV':假,'DeviceIsLinuxLvm2PV':假,.... 所以必须有一个方法才能真正立即获取所有属性。【参考方案2】:

我试试运气:

dbus-send --system --print-reply  \   
   --dest=org.freedesktop.UDisks \
    /org/freedesktop/UIDisks/devices/md0 \
    org.freedesktop.DBus.Properties.GetAll \
    string:""

您在对象路径中有错字:您输入了UIDisks 而不是UDisks。修复它应该可以修复您的错误。


针对您在this answer 上关于一次获取所有属性的评论,D-Bus specification 未指定GetAll 应接受其interface_name 参数的空字符串,因此如果有任何服务,这是一个错误接受这个。相反,您必须为对象上的每个接口调用一次GetAll

最简单的方法是使用更高级别的 D-Bus 实用程序,例如 gdbus 或 D-Feet(正如您所尝试的那样)。 dbus-send 旨在与 D-Bus 服务进行简单的低级交互。

$ gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/block_devices/sda1 --only-properties
node /org/freedesktop/UDisks2/block_devices/sda1 
  interface org.freedesktop.UDisks2.Partition 
    properties:
      readonly u Number = 1;
      …
  ;
  interface org.freedesktop.UDisks2.Filesystem 
    properties:
      readonly aay MountPoints = [b'/boot/efi'];
  ;
  …

【讨论】:

【参考方案3】:

经过这么多年,我终于解决了这个问题并找到了一些东西。 是的,有时需要一些时间

dbus-send --system --print-reply \--dest=org.freedesktop.UDisks2 \
/org/freedesktop/UDisks2/block_devices/sda1 \
org.freedesktop.DBus.Properties.GetAll \
string:"org.freedesktop.UDisks2.Filesystem"

工作,至少获得文件系统接口的属性。

我又花了几个小时才弄清楚这个 dbus-send 的东西。

【讨论】:

【参考方案4】:

错误 org.freedesktop.DBus.Error.UnknownMethod:方法“GetAll”,签名为“s” 接口“org.freedesktop.DBus.Properties”不存在

我有类似的问题,我运行 d-feet,自省界面,发现, 我不应该写“完整/路径/到/对象”,而只是“/对象”, 在您的情况下,不是“/org/freedesktop/UIDisks/devices/md0”,而是“/md0”。

如果这没有帮助,请尝试将 dbus 调用中的所有参数与 d-feet 进行比较 秀,我相信你会发现你的问题。

【讨论】:

以上是关于使用 dbus-send 调用 GetAll的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 dbus-send 发送方法调用?

如何使用 dbus-send 调用 org.bluez.Adapter1.StartDiscovery?

从 shell dbus-send 在 C 中调用 dbus

使用 dbus-send 设置/获取属性

使用 dbus-send 的 DBus 自省对象树

使用 dbus-send 关闭 Linux