应用程序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。
其实对dbus的了解一直来都只知道这是个消息总线用来在不通进程之间传递消息的,但由于深度桌面开机挂载系统其他分区的机制,比较好奇我看了一下,对技术支持或者运维人员来说,dbus本身就上面这一段话就足够了,毕竟不需要搞开发,只需要懂个原理就行。
至于深度桌面里如何实现开机登陆后挂载除fstab文件表里面其他分区的,大概看了下应该是
dde(封装了部分gio接口函数) -> gio接口(通过dbus调用)–>udisks2(实际挂载的程序) 这样一个顺序。
至于dbus ,可以安装一个d-feet的程序,可以浏览系统或者用户总线下的接口名和下面的对象以及对象的方法,双击还可以打开传递参数过去,并得到返回结果。
下面这个连接,还提供了一个demo程序供演示,通过dbus调用服务程序的一个加法method.
https://blog.csdn.net/gangyanliang/article/details/44064267
2021-10-13 更新
这些东西,写完如果不遇到问题应用,是会忘记的.
今天遇到一个需求,就是通过命令显示和隐藏onboard屏幕键盘的。
最后搜了一下,发现可以用
dbus-send --type=method_call --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.Show
dbus-send --type=method_call --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.Hide
这两条命令来切换,弄完自己再来拆解下这个命令
dbus-send 是用于向dbus总线发送消息的工具,图形界面可以用d-feet浏览或搜索到对应的总线,然后点开对象的路径,点开借口后选择方法双击可以执行。但命令行下就只能用这个工具来执行差不多的操作,最主要命令行可以写到代码或者脚本里面去。
同样dbus还提供了dbus-monitor来查看总线上都有哪些消息(方法调用,方法返回,信号,错误)被发送。
dbus-monitor "type='method_call',interface='org.onboard.Onboard.Keyboard'"
dbus-send --type=method_call --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.Show
这条命令,–type= 指定了是方法调用,–dest=指定了要发送到的连接名(程序向dbus总线注册的时候分配的连接名), /org/onboard/Onboard/Keyboard 对象路径,org.onboard.Onboard.Keyboard.Show 接口.方法 org.onboard.Onboard.Keyboard 是接口,Show是方法。
这个命令后面还可以跟需要发送的数据。
下次再研究研究如果通过dbus去让udisk2做各种操作以及获取数据,这样dbus的使用就学习全了。
这个地址的文章非常详细的描述了。有精力的可以去折腾。
QT程序提供了qdbus来发送dbus信号,例如:
qdbus --literal com.deepin.WMSwitcher /com/deepin/WMSwitcher
com.deepin.WMSwitcher.CurrentWM
可以调用com.deepin.WMSwitcher 这个连接(service)的com.deepin.WMSwitcher接口下的 CurrentWM方法
dbus在系统中除了用于进程通信外,还用于可以按需启动服务程序,在客户端访问到服务(service/连接)的时候,如果服务程序没启动,dbus会自动将服务程序““按需”启动起来。
一般系统中在 /usr/share/dbus-1/services/ 目录下定义服务名和服务启动命令的对应关系都在这些.service文件里。