分类: IT业界
2011-07-10 11:59:57
——本文内容包括例子Example2,D-Bus的调试工具的详细介绍及Example2的调试方法
首先请自行下载源代码:example2-dbus-add.tar
再运行:./autogen.sh 与./configure与make
如果没有安装相应的库,按照编译错误信息的提示使用 yum命令下载
先在不同的终端下运行一次./example-service和./example-client,观察client端显示结果,其说明见
dbus-send部分
以下在不同的调试工具下运行Example2
一.D-feet
D-feet是D-Bus的一种调试工具,用python写的。它可以很详细而清晰地显示各个bus上的Bus names,
unique name,object paths,interfaces,methods or signals,并且可以对某个object发送消息和观察相应的结果。(如果你没有D-feet,在运行程序之前,请再下载D-feet )
接下来,先运行./example-service,再在另一个终端中键入并运行d-feet命令,就会弹出下面窗口,展开各个选项,选取一个截图如下:
选择session bus,
在Bus Name栏中找到:org.fmddlmyy.Test;在右边一栏中可以看到:
连接名——Name(well-known name):org.fmddlmyy.Test
唯一名——Unique Name(connection unique name)::1.17
对象路径——/TestObj(在Object Paths下)
各个接口——如org.fmddlmyy.Test.Basic等(在Interfaces下)
方法或信号——如Add(Int32 arg0,Int32 arg1)→(Int32 ret),它有两个参数,一个返回值
双击名为Add的method,弹出以下窗口:
在Parameters框中输入:1,2;
Execut它,
在Output框中显示:3
在D-feet中我们可以很明了地看到一条路线:
session bus→org.fmddlmyy.Test(1.17)→TestObj→org.fmddlmyy.DBus.Basic
→[Add(Int32 arg0,Int32 arg1)→(Int32 ret)];
二.qdbusviewer
qdbusviewer是Qt软件包中的开发工具,它的窗口和使用方式与D-feet十分相似,不再赘述。
三.qdbus
qdbus是Qt下的一个命令行工具。命令结构如下:
dbus [--session] [--literal] [servicename] [path] [method] [args]
--session也可以是--system
--literal表示打印返回信息
其中servicename即为connection name
其他选项含义不言自明
用法示例:
在Example2中运行了./example-service后,在另一终端上:
1.$ qdbus --session ——列出session上所有的connection name,包括unique connection names
2.$ qdbus org.fmddlmyy.Test ——列出org.fmddlmyy.Text下的所有对象路径
3.$ qdbus org.fmddlmyy.Test /org/fmddlmyy/TestObj ——列出TestObj下的所有接口
4.$ qdbus org.fmddlmyy.Test /org/fmddlmyy/TestObj org.fmddlmyy.TestObj.Basic ——列出方法
四.dbus-send与dbus-monitor
dbus-send与dbus-monitor都是dbus提供的工具
dbus-send:既可以查看系统中D-Bus信息,又可以代替client端发送消息给server端
dbus-monitor:监视总线上流动着的消息
在运行了./example-server后,在第二个终端(Term1)中准备运行dbus-send相关命令,在第三个终端(Term2)上准备运行dbus-monitor相关命令。
用法示例:1.用dbus-send查看bus上挂载的连接:本质是在调用org.freedesktop.DBus提供的标准接口,
而org.freedesktop.DBus就类似于文件系统中的根目录,点击它就能看到下面的子目录。命令基
格式可以用帮助命令查看
Term1命令:$ dbus-send --session --type=method_call --printreply --dest=org/freedesktop.DBus /
org.freedesktop.DBus.ListNames
Term1输出:
method return sender=org.freedesktop.DBus -> dest=:1.23 reply_serial=2
array [
string "org.freedesktop.DBus"
string "org.freedesktop.Notifications"
string "org.freedesktop.Tracker"
string "org.freedesktop.PowerManagement"
string ":1.7"
string ":1.8"
string "org.gnome.ScreenSaver"
string ":1.9"
string ":1.10"
string ":1.22"
string ":1.11"
string "org.gnome.GnomeVFS.Daemon"
string ":1.23"
string ":1.12"
string ":1.13"
string ":1.0"
string ":1.14"
string ":1.1"
string ":1.15"
string ":1.2"
string ":1.16"
string ":1.3"
string "org.gnome.GkbdConfigRegistry"
string ":1.4"
string "org.fmddlmyy.Test"
string ":1.5"
string "org.gnome.SettingsDaemon"
string ":1.6"
]
在输出里我们找到我们感兴趣的:org.fmddlmyy.Test,那么对象路径如何获得呢?所有的对象路径都是由根:/ 开始的,可以从它遍历
Term1命令:$ dbus-send --session --type=mothod_call --print-reply -dest=org.fmddlmyy.Test /
org.freedesktop.Test.Introspectable.Introspect
Tem1输出:
method return sender=:1.22 -> dest=:1.25 reply_serial=2
string " "">
"
用类似的方式继续查找/TesObj下的接口和方法
Term1命令:$ dbus-send --session --type=method_call --print-reply --dest=org.fmddlmyy.Test
/TestObj org.freedesktop.DBus.Introspectable.Introspect
Term1输出:
method return sender=:1.22 -> dest=:1.26 reply_serial=2
string " "">
"
上面的输出不正和Example2中的client端显示的内容类似吗?这是用XML语言显示的,每个<>里是对数据的形式描述,而不涉及数据的内容
至此,我们用消息总线对象中的标准接口:org.freedesktop.DBus.Intropectable.Intropect得到了我们想要的关于一个连接的足够的信息。
现在,我们可以开始使用dbus-monitor了
Term2命令:$ dbus-monitor
Term1命令:$ dbus-send --session --type=methoc_call --print-reply --dest=org.fmddlmyy.Test
/TestObj org.fmddlmyy.Test.Basic
Term1输出:
method return sender=:1.21 -> dest=:1.22 reply_serial=2
int32 1099
Term2输出:
signal sender=org.freedesktop.DBus -> dest=(null destination) path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string ":1.22"
string ""
string ":1.22"
method call sender=:1.22 -> dest=org.freedesktop.DBus path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=Hello
method call sender=:1.22 -> dest=org.fmddlmyy.Test path=/TestObj; interface=org.fmddlmyy.Test.Basic; member=Add
int32 100
nt32 999
method return sender=:1.21 -> dest=:1.22 reply_serial=2
int32 1099
signal sender=org.freedesktop.DBus -> dest=(null destination) path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string ":1.22"
string ":1.22"
string ""
":1".22就是dbus-send在本次调用中与会话总线所建立的unique connection name。":1.21"是连接“org.fmddlmyy.Test”的unique connection name。上述输出显示:":1.22向"1.21"发送method_call消息,调用Add方法。 ":1.21"通过method_return消息将调用结果发回":1.22"。
说明:以上内容均整理自网上,本文亦为网络共享