基本概念
可以参考下面链接.或者是官方的教程.
1. linux,dbus示例 Knowing some basic things by example, 推荐:
http://laokaddk.blog.51cto.com/368606/943133
http://laokaddk.blog.51cto.com/368606/943148/
2. Documents Reference D-Bus Specification would give some basic overview of the concepts
https://dbus.freedesktop.org/doc/dbus-specification.html
DBUS可以完成1对1的IPC, 多对多的IPC, 多对多需要daemon,和android中的service_manger类似,如同router.
DBus的组成
DBus = 对象+消息+link+DbusDaemon
对象
特征
- 其中对象是一个处理消息的实体, 因此其实是服务端server
- 对象中有一个或者多个接口
- 每个interface有一个或者多个method
- 每个method都是对具体消息的处理
所以最终落实到消息, 消息共有四种,包括了signal,见下面的说明. 对象的寻址用路径表示
路径
在多对多的IPC中,使用路径来表明一个对象的位置, 这个路径和router中的路由很类似. 都是寻址.
消息的传递变成了先到Daemon中转,然后由DBus Daemon转发.
消息
消息传输
- 双向传输:这样子就可以在调用一个method接收返回值
- 传输方式:同步+异步
消息的类型
- 调用消息
- 结果返回消息
- 错误消息
- 信号消息
Dbus Daemon
可以有多个,一般一个系统中至少有两个,一个是system,一个是session, 这个Linux中的OS的组成有关,想象一下,我们使用Remote Desktop,同一个账号,分两个,登陆到Linux中,分别使用的Desktop environment分别为gnome和KDE, 这两个Desktop Env各种两套不同的NetworkManger, 两套Software Updater, 此时就需要相互通讯, 同时管理这两个或者多个Desktop Env/Session的是X Window Manager, 这个WM也需要管理和给这两个不同的Desktop Env/Session发送消息, 因此就出现了:
- DBUS_BUS_SYSTEM: 系统相关的,例如将update消息发送到session中
- DBUS_BUS_SESSION: 在同一个DE环境下的不同Application的通讯
这两种daemon. 且两者管理的内容不一样.
DBus的使用
这个过程和使用路由器来连接不同的电脑非常类似. 可以认为是3步:
- DBus Daemon的启动
- 对象Server的注册
- 客户端使用服务,即IPC通讯
下面是详细的说明.
对象Server的注册与连接
对于多对多的IPC通讯, 首先需要有一个DBus Daemon, 然后各个对象(即Server)到Daemon中注册并建立连接, 这个过程如同在路由器中分配了一个IP地址, 此时其他电脑才可能能够通过这个IP来访问这台电脑, "IP"就是前面的路径.
其中这里面的注册和连接也是使用代理(想象一下, 其实这个时候Server对象其实也是DBus Daemon的client, 所以和下面的客户端使用服务是类似的), 通过接口dbus_g_object_type_install_info, 将安装信息(对象的信息), 传递给DBus Daemon, 然后使用Daemon的Proxy调用RequestName来注意个对象的名字/路径.
其中安装信息由XML文件,通过dbus-binding-tool转换成对象的头文件。参考:
客户端使用服务
建立与DBus Daemon的连接
创建对象的代理(Proxy),就如同如果想和某个公司沟通,那么可以找到他们的服务部的代表人员
然后通过Proxy来完成所有的操作, 如同和公司的业务部门人员洽谈买芯片.
这里的操作都是使用Msg来传递的, 看前面message的种类. 同时这些Message的发送接收可以是同步也可以是异步
消息的组成
消息= Msg Header + Msg Content
Msg Header
由固定的字段来组成,这样子的约定才能让Dbus Daemon可以解析
Msg Content
由string组成, 开头需要为8Byte对齐
参考
http://linoxide.com/how-tos/d-bus-ipc-mechanism-linux/
来源:CSDN
作者:TonyHo
链接:https://blog.csdn.net/sy373466062/article/details/52472646