D-Bus学习
概念
D-Bus是在Linus上桌面系统中各应用程序之间通信(IPC)和远程过程调用(RPC)的机制,实现了多个程序在计算机上同时通信。
D-Bus将原本一对一的通信过程出抽象出一个软件总线,应用程序链接到这个总线,不关心总线的实现细节,通过这个介质来交换信息,从而简化通信网络。
D-Bus规范
连接名称(Bus Name)
唯一名(unique name)::1.1553
(冒号后面的字符没有特定含义),唯一标识一个进程到D-Bus的连接。只有唯一名而没有公共名叫做私有连接,因为它们没有提供可以通过公共名访问的服务。
公共名(well-know name):org.freedesktop.NetworkManager
。是进程又额外申请的总线名称,用来提供众所周知的服务,其他进程可以通过这个名称来使用对应的服务。
面向对象
在 D-Bus 中,进程A通过公开「对象」 来提供服务。这些对象具有可以调用的「方法」,以及该对象可以发出的「信号」。两者统称为对象的「成员」。进程B就可以调用进程A公布的这些对象的方法来与进程A进行交互,也可以监听相关的信号。接收到消息的D-Bus连线会被转送到一个特定的对象,而非进程。因此,客户端只知道它们是与对象交互,但并不知道另一侧是否真的有对象。
对象路径(Object path)
object path就像是一个文件路径,可以叫做/org/kde/kspread/sheets/3/cells/4/5等。路径下面有一些对象。
接口(Interface)
在每个Object Paths下都包含有多个接口(Interfaces),一个接口就是多个方法和信号的集合。
使用 D-Feet 浏览 D-Bus 总线中现有的总线名称、对象、接口、方法和信号
通信模型
数据传输
D-Bus 规范没有规定使用哪些特定的 IPC 传输机制,可以使用Unix域套接字也可以用TCP套接字,具体实现要看底层的通信库。
每个 D-Bus 消息均由标头和正文组成。标头由几个字段组成,这些字段标识消息类型、发送者以及将消息传递给接收者所需的信息(目标总线名称、对象路径、方法或信号名称、接口名称等)。 )。正文包含接收器进程解释的数据有效负载,例如输入或输出参数。
所有数据都以众所周知的二进制格式(称为有线格式(wire format))进行编码。
总线类型:
- 单一的系统总线(System bus),在引导时就会启动,它由操作系统和后台进程使用
- 每个用户的会话总线(Session bus),普通进程创建,可同时存在多条。会话总线属于某个进程私有,它用于进程间传递消息。
一个进程可以连接到任意数量的总线,只要它已被授予对该总线的访问权限。
大多数的系统会实现一个具较高权限的系统频道,连同给每一个已登录的用户的专用频道,这就可以让D-Bus中可用的登录信息受到限制。因此,D-Bus服务同时包含了系统守护进程(给像是“新增硬件设备”或是“打印机队列变更”等事件使用)以及一个给每个用户的登录会话(给这个用户启动的进程间的一般通信使用)使用的独有守护进程。
总线支持两种在客户端和服务进程之间交换消息的模式[5]:
- 一对一的请求-响应:这是客户端调用对象方法的方式。客户端向导出对象的服务进程发送一条消息,而服务又将一条消息回复给客户端进程。[17]客户端发送的消息必须包含对象路径、调用方法的名称(以及可选的接口名称)以及对象所选接口定义的输入参数值(如果有)。回复消息携带请求的结果,包括对象方法调用返回的输出参数的值,或者出现错误时的异常信息。[5] [17]
- 发布/订阅:这是对象向感兴趣的各方宣布信号发生的方式。对象的服务进程广播总线仅传递给订阅该对象信号的连接客户端的消息。[17]消息携带对象路径、信号名称、信号所属接口以及信号参数值(如果有)。该通信是单向的:任何客户端进程都不会响应原始消息,因为发送方既不知道接收方的身份,也不知道接收方的数量。