使用 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 调用 org.bluez.Adapter1.StartDiscovery?