D-Bus是原产于Linux的一种跨平台的高级的进程间通信机制。D-Bus的主要概念为总线,注册后的进程可通过总线接收或传递消息。D-Bus是低延迟而且低开销的,设计得小而高效,以便最小化传送的往返时间。D-Bus协议是二进制的,而不是文本的,因而效率也得到了保证。

1.D-Bus总线分类

D-Bus总线分为系统总线(system bus)和用户会话总线(session bus)。 系统总线在引导时就会启动,是持久的,一直存在于系统中。 可以和操作系统内核,以及系统守护进程的通信。如:新插入一个USB设备。
会话总线是与当前登陆用户紧密联系的,属于用户私有的,用户可以通过Session总线传递消息。

2.通信类型

2.1方法

方法(Method):处理比较复杂或比较大量的数据。通过Dbus调用另一个进程的方法,当方法执行完毕时会通过回调函数(Callback)来通知调用进程,调用进程可以在回调函数内处理返回的数据。

2.2信号

信号(Signal),最常用的通信方式。一个进程可以发送一个或多个信号给另一个进程(或多个进程),发送进程指定Dbus接口(interface)和信号(member),接收进程通过监听相应的接口和成员来接收信号。

3.使用流程

3.1接收信号流程

1.调用dbus_bus_register进行Dbus总线注册(也可以使用dbus_bus_get和dbus_bus_request_name在session、system总线上分配一条)。注册dbus的进程需要设定一个dbus name用来在总线上标识自己,注册完成后会创建一个DBusConnection,相当于该进程与dbus总线的连接点。 2.调用dbus_bus_add_match()添加信号匹配条件,一般是以字符串列表(包含interface和member)的形式添加。告诉dbus总线该进程想要接收信号对应的接口和信号名,当dbus总线接收到对应的信号时就会发送给添加条件的进程。 3.调用dbus_connection_add_filter(conn, function, NULL, NULL)添加接收到消息时的处理函数。当进程接收到dbus总线通知的消息时会进入到该函数,在该函数内可以根据不同接口收到的信号分别进行处理。

3.2发送信号流程

1.第一步和接收信号流程的第一步一样,需要先进行注册,为dubs连接取名,创建一个发送信号的通道。 2.调用dbus_message_new_signal(obj_path,interface,member)创建要发送的接口名和信号名。 3.调用dbus_message_append_args 设置发送消息的相关参数 4.调用dbus_connection_send(connection,msg) 把消息发送到指定的dubs连接 5.调用dbus_connection_flush(connection) 冲刷dbus连接,此时消息就会发送到dbus总线上。