怎么利用dbus send-send测试

1332人阅读
linux(3)
最近在设计一个linux桌面程序。而进程间的交互准备使用dbus来解决。
有那么个组织叫freedesktop,它是专门为linux桌面制定标准的。什么KDE,GNOME都是按他的标准来的。而dbus是其中的桌面消息机制的一个标准。
dbus是一个IPC的管理系统,其实就底层来说就是本地socket通信。但是他是将所有的消息都通过总线的方式来管理分发,易于管理和安全。
dbus一般就是3层结构:
1. libdbus库,允许两个应用相互连接交换消息
2. 一个建立在libdbus上的消息总线守护程序,这个守护程序可以路由消息
3. 封装库,比如libdbus-glib或libdbus-qt。一般都是使用封装库来简化使用dbus的细节。
一般gtk(c语言)开发的话,可以使用gobject-dbus库,qt(c++)的话可以使用dbus-qt库,而python使用python-dbus模块。
还有nodejs的话,我推荐使用node-native模块(配合nodewebkit还是比较好用的)。
还有做dbus相关开发的话,使用一个叫d-feet工具,就可以查看当前所有在使用中的dbus名称及其他属性。
dbus分为两种总线,一种叫SystemBus,一种叫SessionBus。SystemBus就只有一条,SessionBus是一个用户会话时会产生一条。至于这两种的区别,SystemBus一般是用于权限较高的系统级(root)进程与其他进程(可以是普通进程)的通信,而SessionBus是用于普通的用户进程之间的交流。
dbus是单对单的通信,其实和C/S架构差不多,一个server端接收消息和发布信号,多个client端发送消息和接收信号。
dbus通信的话有5个值需要注意:
1. Address:因为dbus也是通过本地socket来通信,所有会有socket文件。你可以直接连接这个sokcet文件的地址来通信,但这个我几乎不用。
2. Bus Name:当你使用总线守护进程时(你看进程表里不是有很多dbus-daemon嘛,3层结构的第二层),你只用通过一个Bus Name就可以直接将消息路由到你想要的地址。所以这么方便,干嘛用上面的。server端想要Bus Name需要向SystemBus或SessionBus申请。如果不申请连接到dbus,它会自动被分配一个唯一的名字,就是1.45之类的,这数字没什么意义,只是为了名字唯一。名字除了路由消息还有第二种用途,就是当一个程序退出,断开连接,消息总线就会提醒其他连接程序该名字失去了所有者。这样就容易管理其他程序了
3. Path:这个路径是指你在进程里的路径,你可以按模块来划分,比如NetwrokManager 有 无线和有线这两模块。
4. Interface:他就像是一组功能的集合名字,你可以按功能来划分。
5. Method/Signals:方法和信号,方法其实就是进程里的函数名,你发消息给这个函数名,这个函数就会被调用,并返回结果。信号就是当server端主动调用这个信号函数的时候,便会发出这个信号(信号名就是函数名),其他连接在同一总线上的程序,如果谁感兴趣就会接收处理。
所以总的来说,其实可以这样理解,Address和Bus Name就相当于你家的城市地址,Path就相当于你家住哪个县哪个区,Interface就相当于你家哪个村哪个路,Method就相当于你家哪个人。dbus则充当了邮局的身份。
那先尝试下发送个消息看看:
d-feet在SystemBus下可以找到org.freedesktop.DBus这个Bus Name,它有个Path叫 “ / ”,“ / ”下面有org.freedesktop.DBus这个Interface,里面有个叫GetId的Methods,可以跟它通信一下。这里使用dbus-send命令来发送。dbus-send是dbus提供的一个命令,可直接向目标发送消息。
~ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId
返回打印出了一个值,这个值就是GetId函数的执行结果。
dbus-send使用方法: --system表示是System Bus,--print-reply表示打印回复信息, --desk=[Bus Name] [Path] [Interface].[Method] 表示地址,注意Method是接在Interface后面的。
dbus python示例可以看http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html
dbus官方wiki:http://www.freedesktop.org/wiki/Software/dbus/
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5971次
排名:千里之外
(2)(2)(1)(2)Android BlueTooth(41)
应用程序A和消息总线连接,这个连接获取了一个众所周知的公共名(记作连接A)。应用程序A中有对象A1提供了接口I1,接口I1有方法M1。应用程序B和消息总线连接,要求调用连接A上对象A1的接口I1的方法M1。
在上一讲的加法例子中,上面这段话可以实例化为:应用程序example-service和会话总线连接。这个连接获取了一个众所周知的公共名“org.fmddlmyy.Test”。应用程序example-servic中有对象“/TestObj”提供了接口“org.fmddlmyy.Test.Basic”,接口“org.fmddlmyy.Test.Basic”有方法“Add”。应用程序d-feet和会话总线连接,要求调用连接“org.fmddlmyy.Test”上对象“/TestObj”的接口“org.fmddlmyy.Test.Basic”的方法“Add”。
应用程序B调用应用程序A的方法,其实就是应用程序B向应用程序A发送了一个类型为“method_call”的消息。应用程序A通过一个类型为“method_retutn”的消息将返回值发给应用程序B。我们简单介绍一下D-Bus总线上的消息。
1、D-Bus的消息
上一讲说过最基本的D-Bus协议是一对一的通信协议。与直接使用socket不同,D-Bus是面向消息的协议。 D-Bus的所有功能都是通过在连接上流动的消息完成的。
1.1、消息类型
D-Bus有四种类型的消息:
method_call 方法调用 method_return 方法返回 error 错误 signal 信号
前面介绍的远程方法调用就用到了method_call和method_return消息。顾名思义,在发生错误时会产生error消息。如果把method_call看作打电话,那么signal消息就是来电了。后面还会详细讨论。
1.2、dbus-send和dbus-monitor
dbus提供了两个小工具:dbus-send和dbus-monitor。我们可以用dbus-send发送消息。用dbus-monitor监视总线上流动的消息。让我们通过dbus-send发送消息来调用前面的Add方法,这时dbus-send充当了应用程序B。用dbus-monitor观察调用过程中的消息。
启动example-service:
$ ./example-service
在另一个控制台启动dbus-monitor:
$ dbus-monitor
dbus-monitor默认监视会话总线。执行:
$ dbus-send --session --type=method_call --print-reply --dest=org.fmddlmyy.Test /TestObj org.fmddlmyy.Test.Basic.Add int32:100 int32:999
method return sender=:1.21 -& dest=:1.22 reply_serial=2
int32 1099
dbus-monitor的相关输出包括:
signal sender=org.freedesktop.DBus -& dest=(null destination) path=/org/freedesktop/DB interface=org.freedesktop.DB member=NameOwnerChanged
string &:1.22&
string &:1.22&
method call sender=:1.22 -& dest=org.freedesktop.DBus path=/org/freedesktop/DB interface=org.freedesktop.DB member=Hello
method call sender=:1.22 -& dest=org.fmddlmyy.Test path=/TestO interface=org.fmddlmyy.Test.B member=Add
method return sender=:1.21 -& dest=:1.22 reply_serial=2
int32 1099
signal sender=org.freedesktop.DBus -& dest=(null destination) path=/org/freedesktop/DB interface=org.freedesktop.DB member=NameOwnerChanged
string &:1.22&
string &:1.22&
:1.22就是dbus-send在本次调用中与会话总线所建立连接的唯一名。:1.21是连接“org.fmddlmyy.Test”的唯一名。在以上输出中我们可以看到:1.22向“org.fmddlmyy.Test”发送method_call消息,调用Add方法。 :1.21通过method_return消息将调用结果发回:1.22。其它输出信息会在以后说明。
dbus-send的详细用法可以参阅手册。调用远程方法的一般形式是:
$ dbus-send [--system | --session] --type=method_call --print-reply --dest=连接名 对象路径 接口名.方法名 参数类型:参数值 参数类型:参数值
dbus-send支持的参数类型包括:string, int32, uint32, double, byte, boolean。
2、消息总线的方法和信号
消息总线是一个特殊的应用,它可以在与它连接的应用之间传递消息。可以把消息总线看作一台路由器。正是通过消息总线,D-Bus才在一对一的通信协议基础上实现了多对一和一对多的通信。
消息总线虽然有特殊的转发功能,但消息总线也还是一个应用。其它应用与消息总线的通信也是通过1.1节的基本消息类型完成的。作为一个应用,消息总线也提供了自己的接口,包括方法和信号。
我们可以通过向连接“org.freedesktop.DBus ”上对象“/”发送消息来调用消息总线提供的方法。事实上,应用程序正是通过这些方法连接到消息总线上的其它应用,完成请求公共名等工作的。
消息总线对象支持第一讲中提到的标准接口&org.freedesktop.DBus.Introspectable&,我们可以调用org.freedesktop.DBus.Introspectable.Introspect方法查看消息总线对象支持的接口。例如:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.Introspectable.Introspect
method return sender=org.freedesktop.DBus -& dest=:1.20 reply_serial=2
string &&!DOCTYPE node PUBLIC &-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&
&http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&&
&interface name=&org.freedesktop.DBus.Introspectable&&
&method name=&Introspect&&
&arg name=&data& direction=&out& type=&s&/&
&/interface&
&interface name=&org.freedesktop.DBus&&
&method name=&Hello&&
&arg direction=&out& type=&s&/&
&method name=&RequestName&&
&arg direction=&in& type=&s&/&
&arg direction=&in& type=&u&/&
&arg direction=&out& type=&u&/&
&method name=&ReleaseName&&
&arg direction=&in& type=&s&/&
&arg direction=&out& type=&u&/&
&method name=&StartServiceByName&&
&arg direction=&in& type=&s&/&
&arg direction=&in& type=&u&/&
&arg direction=&out& type=&u&/&
&method name=&NameHasOwner&&
&arg direction=&in& type=&s&/&
&arg direction=&out& type=&b&/&
&method name=&ListNames&&
&arg direction=&out& type=&as&/&
&method name=&ListActivatableNames&&
&arg direction=&out& type=&as&/&
&method name=&AddMatch&&
&arg direction=&in& type=&s&/&
&method name=&RemoveMatch&&
&arg direction=&in& type=&s&/&
&method name=&GetNameOwner&&
&arg direction=&in& type=&s&/&
&arg direction=&out& type=&s&/&
&method name=&ListQueuedOwners&&
&arg direction=&in& type=&s&/&
&arg direction=&out& type=&as&/&
&method name=&GetConnectionUnixUser&&
&arg direction=&in& type=&s&/&
&arg direction=&out& type=&u&/&
&method name=&GetConnectionUnixProcessID&&
&arg direction=&in& type=&s&/&
&arg direction=&out& type=&u&/&
&method name=&GetConnectionSELinuxSecurityContext&&
&arg direction=&in& type=&s&/&
&arg direction=&out& type=&ay&/&
&method name=&ReloadConfig&&
&method name=&GetId&&
&arg direction=&out& type=&s&/&
&signal name=&NameOwnerChanged&&
&arg type=&s&/&
&arg type=&s&/&
&arg type=&s&/&
&signal name=&NameLost&&
&arg type=&s&/&
&signal name=&NameAcquired&&
&arg type=&s&/&
&/interface&
从输出可以看到会话总线对象支持标准接口“org.freedesktop.DBus.Introspectable”和接口“org.freedesktop.DBus”。接口“org.freedesktop.DBus”有16个方法和3个信号。下表列出了“org.freedesktop.DBus”的12个方法的简要说明:
org.freedesktop.DBus.RequestName (in STRING name, in UINT32 flags, out UINT32 reply)
请求公众名。其中flag定义如下:
DBUS_NAME_FLAG_ALLOW_REPLACEMENT 1
DBUS_NAME_FLAG_REPLACE_EXISTING 2
DBUS_NAME_FLAG_DO_NOT_QUEUE 4
返回值reply定义如下:
DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
DBUS_REQUEST_NAME_REPLY_IN_QUEUE 2
DBUS_REQUEST_NAME_REPLY_EXISTS 3
DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4
org.freedesktop.DBus.ReleaseName (in STRING name, out UINT32 reply)
释放公众名。返回值reply定义如下:
DBUS_RELEASE_NAME_REPLY_RELEASED 1
DBUS_RELEASE_NAME_REPLY_NON_EXISTENT 2
DBUS_RELEASE_NAME_REPLY_NOT_OWNER 3
org.freedesktop.DBus.Hello (out STRING unique_name)
一个应用在通过消息总线向其它应用发消息前必须先调用Hello获取自己这个连接的唯一名。返回值就是连接的唯一名。dbus没有定义专门的切断连接命令,关闭socket就是切断连接。
在1.2节的dbus-monitor输出中可以看到dbus-send调用消息总线的Hello方法。
org.freedesktop.DBus.ListNames (out ARRAY of STRING bus_names)
返回消息总线上已连接的所有连接名,包括所有公共名和唯一名。例如连接“org.fmddlmyy.Test”同时有公共名“org.fmddlmyy.Test”和唯一名“:1.21”,这两个名称都会被返回。
org.freedesktop.DBus.ListActivatableNames (out ARRAY of STRING bus_names)
返回所有可以启动的服务名。dbus支持按需启动服务,即根据应用程序的请求启动服务。
org.freedesktop.DBus.NameHasOwner (in STRING name, out BOOLEAN has_owner)
检查是否有连接拥有指定名称。
org.freedesktop.DBus.StartServiceByName (in STRING name, in UINT32 flags, out UINT32 ret_val)
按名称启动服务。参数flags暂未使用。返回值ret_val定义如下:
1 服务被成功启动
2 已经有连接拥有要启动的服务名
org.freedesktop.DBus.GetNameOwner (in STRING name, out STRING unique_connection_name)
返回拥有指定公众名的连接的唯一名。
org.freedesktop.DBus.GetConnectionUnixUser (in STRING connection_name, out UINT32 unix_user_id)
返回指定连接对应的服务器进程的Unix用户id。
org.freedesktop.DBus.AddMatch (in STRING rule)
为当前连接增加匹配规则。
org.freedesktop.DBus.RemoveMatch (in STRING rule)
为当前连接去掉指定匹配规则。
org.freedesktop.DBus.GetId (out STRING id)
返回消息总线的ID。这个ID在消息总线的生命期内是唯一的。
接口“org.freedesktop.DBus”的3个信号是:
org.freedesktop.DBus.NameOwnerChanged (STRING name, STRING old_owner, STRING new_owner)
指定名称的拥有者发生了变化。
org.freedesktop.DBus.NameLost (STRING name)
通知应用失去了指定名称的拥有权。
org.freedesktop.DBus.NameAcquired (STRING name)
通知应用获得了指定名称的拥有权。
让我们来试试消息总线提供的方法。
2.3.1、从ListName到d-feet的基本逻辑
用dbus-send调用:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListNames
method return sender=org.freedesktop.DBus -& dest=:1.23 reply_serial=2
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&
这是会话总线当前已连接的连接名。在d-feet窗口的左侧窗口显示的就是ListNames返回的连接名。聪明的读者也许已经想到使用消息总线的“org.freedesktop.DBus.ListNames”方法和各连接的“org.freedesktop.DBus.Introspectable.Introspect”,我们就可以像d-feet一样查看总线上所有连接的所有对象的所有接口的所有方法和信号。
你的想法很好。但有一个问题,我们必须对连接中的对象调用“org.freedesktop.DBus.Introspectable.Introspect”方法。 ListNames只列出了连接名,我们怎么获取连接中的对象路径呢?
答案很简单,如果我们不知道对象路径就从根目录开始吧。连接中的对象是按照树型结构组织的。我们遍历连接的对象树就可以找到所有的对象。调用对象的“org.freedesktop.DBus.Introspectable.Introspect”方法就可以查看对象的所有接口的所有方法和信号。例如:假设我们不知道连接&org.fmddlmyy.Test&里有什么对象,我们可以对根对象&/&执行:
$ dbus-send --session --type=method_call --print-reply --dest=org.fmddlmyy.Test / org.freedesktop.DBus.Introspectable.Introspect
method return sender=:1.22 -& dest=:1.25 reply_serial=2
string &&!DOCTYPE node PUBLIC &-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&
&http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&&
&node name=&TestObj&/&
&org.fmddlmyy.Test&的对象树的根节点只有一个子节点&TestObj&,再查看&/TestObj&:
$ dbus-send --session --type=method_call --print-reply --dest=org.fmddlmyy.Test /TestObj org.freedesktop.DBus.Introspectable.Introspect
method return sender=:1.22 -& dest=:1.26 reply_serial=2
string &&!DOCTYPE node PUBLIC &-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&
&http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&&
&interface name=&org.freedesktop.DBus.Introspectable&&
&method name=&Introspect&&
&arg name=&data& direction=&out& type=&s&/&
&/interface&
&interface name=&org.freedesktop.DBus.Properties&&
&method name=&Get&&
&arg name=&interface& direction=&in& type=&s&/&
&arg name=&propname& direction=&in& type=&s&/&
&arg name=&value& direction=&out& type=&v&/&
&method name=&Set&&
&arg name=&interface& direction=&in& type=&s&/&
&arg name=&propname& direction=&in& type=&s&/&
&arg name=&value& direction=&in& type=&v&/&
&method name=&GetAll&&
&arg name=&interface& direction=&in& type=&s&/&
&arg name=&props& direction=&out& type=&a{sv}&/&
&/interface&
&interface name=&org.fmddlmyy.Test.Basic&&
&method name=&Add&&
&arg name=&arg0& type=&i& direction=&in&/&
&arg name=&arg1& type=&i& direction=&in&/&
&arg name=&ret& type=&i& direction=&out&/&
&/interface&
作为一个练习,让我们来查看系统总线的上的bluez接口。执行:
$ dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListNames
method return sender=org.freedesktop.DBus -& dest=:1.30 reply_serial=2
string &org.freedesktop.DBus&
string &:1.7&
string &:1.8&
string &:1.9&
string &org.freedesktop.SystemToolsBackends&
string &:1.30&
string &org.freedesktop.NetworkManagerInfo&
string &:1.20&
string &org.freedesktop.Avahi&
string &:1.21&
string &org.bluez&
string &:1.22&
string &org.freedesktop.NetworkManager&
string &org.freedesktop.ConsoleKit&
string &:1.23&
string &com.redhat.dhcp&
string &:1.13&
string &:1.0&
string &:1.14&
string &:1.1&
string &:1.15&
string &:1.2&
string &org.freedesktop.Hal&
string &com.redhat.NewPrinterNotification&
string &:1.16&
string &:1.3&
string &:1.17&
string &:1.4&
string &:1.18&
string &:1.5&
string &:1.19&
string &:1.6&
我们看到连接&org.bluez&。查看它的根对象:
$ dbus-send --system --type=method_call --print-reply --dest=org.bluez / org.freedesktop.DBus.Introspectable.Introspect
method return sender=:1.7 -& dest=:1.31 reply_serial=2
string &&!DOCTYPE node PUBLIC &-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&
&http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&&
&node name=&org&/&
接着查对象&/org&:
$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org org.freedesktop.DBus.Introspectable.Introspect
method return sender=:1.7 -& dest=:1.32 reply_serial=2
string &&!DOCTYPE node PUBLIC &-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&
&http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&&
&node name=&bluez&/&
接着查对象&/org/bluez&:
$ dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez org.freedesktop.DBus.Introspectable.Introspect
method return sender=:1.7 -& dest=:1.33 reply_serial=2
string &&!DOCTYPE node PUBLIC &-//freedesktop//DTD D-BUS Object Introspection 1.0//EN&
&http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd&&
&node name=&/org/bluez&&
&interface name=&org.bluez.Manager&&
&method name=&InterfaceVersion&&
&arg type=&u& direction=&out&/&
&method name=&DefaultAdapter&&
&arg type=&s& direction=&out&/&
&method name=&FindAdapter&&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&out&/&
&method name=&ListAdapters&&
&arg type=&as& direction=&out&/&
&method name=&FindService&&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&out&/&
&method name=&ListServices&&
&arg type=&as& direction=&out&/&
&method name=&ActivateService&&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&out&/&
&signal name=&AdapterAdded&&
&arg type=&s&/&
&signal name=&AdapterRemoved&&
&arg type=&s&/&
&signal name=&DefaultAdapterChanged&&
&arg type=&s&/&
&signal name=&ServiceAdded&&
&arg type=&s&/&
&signal name=&ServiceRemoved&&
&arg type=&s&/&
&/interface&
&interface name=&org.bluez.Database&&
&method name=&AddServiceRecord&&
&arg type=&ay& direction=&in&/&
&arg type=&u& direction=&out&/&
&method name=&AddServiceRecordFromXML&&
&arg type=&s& direction=&in&/&
&arg type=&u& direction=&out&/&
&method name=&UpdateServiceRecord&&
&arg type=&u& direction=&in&/&
&arg type=&ay& direction=&in&/&
&method name=&UpdateServiceRecordFromXML&&
&arg type=&u& direction=&in&/&
&arg type=&s& direction=&in&/&
&method name=&RemoveServiceRecord&&
&arg type=&u& direction=&in&/&
&method name=&RegisterService&&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&in&/&
&method name=&UnregisterService&&
&arg type=&s& direction=&in&/&
&method name=&RequestAuthorization&&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&in&/&
&method name=&CancelAuthorizationRequest&&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&in&/&
&/interface&
&interface name=&org.bluez.Security&&
&method name=&RegisterDefaultPasskeyAgent&&
&arg type=&s& direction=&in&/&
&method name=&UnregisterDefaultPasskeyAgent&&
&arg type=&s& direction=&in&/&
&method name=&RegisterPasskeyAgent&&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&in&/&
&method name=&UnregisterPasskeyAgent&&
&arg type=&s& direction=&in&/&
&arg type=&s& direction=&in&/&
&method name=&RegisterDefaultAuthorizationAgent&&
&arg type=&s& direction=&in&/&
&method name=&UnregisterDefaultAuthorizationAgent&&
&arg type=&s& direction=&in&/&
&/interface&
&node name=&service_audio&/&
&node name=&service_input&/&
&node name=&service_network&/&
&node name=&service_serial&/&
我们看到了对象&/org/bluez&的所有接口。对象&/org/bluez&还有子节点&service_audio&、&service_input&、&service_network&和&service_serial&。必要时我们可以接着查下去。d-feet的基本逻辑就是这样。后面我们会自己实现一个dteeth。dteeth是命令行程序,可以遍历指定连接的对象树,列出所有对象的所有接口的方法和信号。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:350804次
积分:4414
积分:4414
排名:第6021名
原创:34篇
转载:390篇
评论:13条

我要回帖

更多关于 dbus send signal 的文章

 

随机推荐