一、DBus是什么?
DBus是一套针对桌面环境优化设计的IPC(进程间通信机制),用于进程间的通信或进程与内核的通信。但在很多情况下,通信的一方是消息总线。消息总线是一个特殊的应用,它同时与多个应用通信,并在应用之间传递消息。
二、DBus的工作方式
DBus将有一个持久的 系统总线(system bus),它在 引导时就会启动。这个总线由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序 不能欺骗系统事件。还将有很多 会话总线(session buses),这些总线当用户登录后启动,属于那个用户私有。它是用户的应用程序用来通信的一个会话总线。当然,如果一个应用程序需要接收来自系统总线的消息,它不如直接连接到系统总线 —— 不过,它可以发送的消息将是受限的。
一旦应用程序连接到了一个总线,它们就必须通过添加 匹配器(matchers) 来声明它们希望 收到哪种消息。匹配器为可以基于接口、对象路径和方法进行接收的消息指定一组规则(见后)。 这样就使得应用程序可以集中精力去处理它们想处理的内容,以实现消息的高效路由,并保持总线 上消息的预期数量,以使得不会因为这些消息导致所有应用程序的性能下降并变得很慢。
三、DBus中涉及的基本概念
1、总线名称(Bus Name)
我们可以把Bus Name理解为连接的名称,一个Bus Name总是代表一个应用和消息总线的连接。有两种作用不同的Bus Name,一个叫公共名(well-known names)由用户提供必须遵循一定的规则,其他应用通过公共名来查询该应用并进行相应的交互。这样就会存在一个问题,当有多个应用想要获取同一个公共名服务的时候,系统会把这些请求排队,一次只给一个应用请求,当这个应用退出再为下一个应用提供服务器。还有一个叫唯一名(Unique Connection Name)由系统自动分配,唯一名由":"开始多个数字分开标识,顾名思义,唯一名是单个应用唯一的,不会存在相同的唯一名,系统中的应用可以没有公共名(私有连接)但一定会有唯一名。
2、对象路径(Obj Path)
总线名称确定应用到总线的连接,一个应用(总线名称)下面可以有多个对象路径,而对象路径指定唯一的对象,对象下面可以有若干个接口,接口下面可以有若干个Siganl和Mehod。
3、对象(Object)
DBus在消息传递过程都有一个源对象和一个目的对象。个人理解对象是DBus消息管理基本单元。
4、消息(Message)
D-BUS 中有四种类型的消息:方法调用(method calls)、方法返回(method returns)、信号(signals) 和错误(errors)。要执行 D-BUS 对象的方法,您需要向对象发送一个方法调用消息。它将完成一些处理并返回 一个方法返回消息或者错误消息。信号的不同之处在于它们不返回任何内容:既没有“信号返回”消息,也没有 任何类型的错误消息。
5、接口(Interface)
通过对象路径,我们找到应用中的一个对象。每个对象可以实现多个接口。消息总线有几个标准的接口,org.freedesktop.DBus.Introspectable”和“org.freedesktop.DBus.Properties。我们在与系统总线建立连接的时候需要用到这些标准接口下面的method来申请名称等一些操作。
四、DBus通信框图
DBus 本身是构建在 Socket 机制之上。真正的通信还是由 Socket 来完成的。DBus 则是在这之上,制定了一些通信的协议,并提供了更高一层的接口,以更方便应用程序之间进行数据的交互。在DBus的体系中,有一个常驻的进程 Daemon,所有进程间的交互都通过它来进行分发和管理。所有希望使用 DBus 进行通信的进程,都必须事先连上 Daemon,并将自己的名字注册到 Daemon 上,之后,Daemon会根据需要把消息以及数据发到相应的进程中。