D-Bus三层架构

D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信。它是个3层架构的IPC 系统,包括:

1、函数库libdbus ,用于两个应用程序互相联系和交互消息。

2、一个基于libdbus构造的消息总线守护进程,可同时与多个应用程序相连,并能把来自一个应用程序的消息路由到0或者多个其他程序。

3、基于特定应用程序框架的封装库或捆绑(wrapper libraries or bindings )。例如,libdbus-glib和libdbus-qt,还有绑定在其他语言,例如Python的。大多数开发者都是使用这些封装库的API,因为它们简化了D-Bus编程细节。libdbus被有意设计成为更高层次绑定的底层后端(low-levelbackend )。大部分libdbus的 API仅仅是为了用来实现绑定。

D-Bus进程通信简单框架


DBUS中消息分为四类:

1.  Methodcall消息:将触发一个函数调用 ;

2.  Methodreturn消息:触发函数调用返回的结果;

3.  Error消息:触发的函数调用返回一个异常 ;

4.  Signal消息:通知,可以看作为事件消息。


2.2 连接到总线
     进程间通信前,需要连接到总线。调用dbus_bus_get函数连接进程到总线,建立进程和总线之间的连接(DBusConnection)。建立连接后,需要为这个连接注册名称,方便后面对这个连接进行操作,调用dbus_bus_request_name函数对连接进行注册名称。

建立连接和注册名称是在程序开始时执行,程序结束时,调用dbus_connection_close函数关闭一个连接。函数接口声明如程序清单 2‑1所示。

程序清单 2-1 建立、注册名称和关闭连接

DBusConnection  *dbus_bus_get  (DBusBusType  type,  DBusError   *error)             /*  建立和总线的连接  */

int  dbus_bus_request_name  (DBusConnection   *connection,
                              const char         *name,
                              unsigned int        flags,
                              DBusError        *error)                                   /*  注册连接名称      */

void  dbus_connection_close  (DBusConnection  *connection)                           /*  关闭连接          */

2.3 信号发送与接收

2.3.1 信号发送
     DBUS中信号是一种广播的消息,当发出一个信号,所有连接到 DBUS 总线上并注册了接受对应信号的进程,都会收到该信号。

进程发出一个信号前,需要创建一个 DBusMessage 对象来代表信号,然后追加上一些需要发出的参数,就可以发向总线了。发完之后需要释放消息对象。信号发送的函数声明如程序清单 2‑2所示。

程序清单2-2  信号发送接口

DBusMessage  *dbus_message_new_signal  (const  char  *path,
                                        const  char  *iface,
                                        const  char  *name)                       /*  创建信号类型消息      */
 

void  dbus_message_iter_init_append  ( DBusMessage     *message,
                            DBusMessageIter  *iter)                /*  加入参数到信号        */
 

dbus_bool_t  dbus_connection_send  ( DBusConnection  *connection,
                                      DBusMessage    *message,
                                      dbus_uint32_t    *serial)                       /*  发送信号到总线        */
 

void  dbus_message_unref  (DBusMessage *message)                                 /*  释放消息              */

2.3.2 信号接收
     进程接收信号时,需先告知总线进程感兴趣的消息,然后等待接收消息。信号接收函数声明如程序清单 2‑3所示。

程序清单 2-3 信号接收接口

void  dbus_bus_add_match  ( DBusConnection  *connection,
                             const char        *rule,
                             DBusError       *error)                                 /*  告知总线感兴趣的消息   */
 

DBusMessage  *dbus_connection_pop_message  ( DBusConnection  *connection)         /*  接收消息               */
 

dbus_bool_t  dbus_message_is_signal  (DBusMessage  *message,
                                       const char      *iface,
                                       const char     *signal_name)                      /*  判断消息是否为信号     */

2.4 函数调用和提供函数调用

2.4.1 函数调用
      调用一个远程函数与发送一个信号原理类似,需要先创建一个消息(DBusMessage),然后通过注册在 DBUS上的名称指定发送的对象。然后追加相应的参数,调用方法分为两种,一种是阻塞式的,另一种为异步调用。异步调用的时候会得到一个“DBusMessage *” 类型的返回消息,从这个返回消息中可以获取一些返回的参数。

函数调用的函数声明如程序清单 2‑4所示。

程序清单 2-4 函数调用接口

DBusMessage  *dbus_message_new_method_call  (const char  *destination,
                                              const char  *path,
                                              const char  *iface,
                                              const char  *method)                    /*  创建一个函数调用消息    */

void  dbus_message_iter_init_append  (DBusMessage     *message,
                           DBusMessageIter  *iter)                     /*  为消息添加参数           */
 

dbus_bool_t  dbus_connection_send_with_reply  (DBusConnection   *connection,
                                                DBusMessage      *message,
                                                DBusPendingCall  **pending_return,
                                                int            timeout_milliseconds)       /*  发送消息                */
 

void  dbus_pending_call_block  (DBusPendingCall  *pending)                           /*  阻塞等待返回值           */
 

DBusMessage  *dbus_pending_call_steal_reply  (DBusPendingCall  *pending)             /*  获得返回消息            */
  

dbus_bool_t  dbus_message_iter_init  (DBusMessage     *message,
                           DBusMessageIter  *iter)                     /*  获取参数                */

2.4.2 接收函数调用
     提供远程函数调用,首先需告知总线进程感兴趣的消息,其次从总线获取消息并判定消息是方法调用。然后从消息中获取参数进行函数执行,最后创建返回消息,并发送消息至总线,由总线转发至调用的进程。函数声明如程序清单 2‑5所示。

程序清单 2-5 接收函数调用接口

void  dbus_bus_add_match  ( DBusConnection  *connection,
                             const char        *rule,
                             DBusError       *error)                                   /*  请求获取调用消息       */
 

DBusMessage  *dbus_connection_pop_message  ( DBusConnection  *connection)           /*  从总线获取消息         */
 

dbus_bool_t  dbus_message_is_method_call (DBusMessage  *message,
                                           const char     *iface,
                                           const char     *method)                       /*  判定消息是方法调用     */
  

dbus_bool_t  dbus_message_iter_init  (DBusMessage     *message,
                           DBusMessageIter  *iter)                    /*  获取参数               */
 

DBusMessage  *dbus_message_new_method_return  (DBusMessage *method_call)            /*  创建返回消息           */
 

void  dbus_message_iter_init_append  ( DBusMessage     *message,
                            DBusMessageIter  *iter)                   /*  在消息中填入参数       */
 

dbus_bool_t  dbus_connection_send  ( DBusConnection   *connection,
                                      DBusMessage     *message,
                                      dbus_uint32_t     *serial)                        /*  发送返回消息          */


参考资料:

http://blog.csdn.net/eastmoon502136/article/details/10044993

https://blog.csdn.net/mr_wangning/article/details/60324291

https://www.cnblogs.com/liyiwen/archive/2012/12/02/2798876.html

D-Bus的更多相关文章

  1. 设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)

    关于关于驱动设备模型相关概念请参考<Linux Device Drivers>等相关书籍,和内核源码目录...\Documentation\driver-model 简单来说总线(bus) ...

  2. Matlab中使用脚本和xml文件自动生成bus模块

    帮一个老师写的小工具 在一个大工程中需要很多bus来组织信号,而为了规范接口,需要定义很多BusObject,用Matlab语言手写这些BusObject比较费工夫 所以用xml配置文件来写,也便于更 ...

  3. bzoj 1537: [POI2005]Aut- The Bus 线段树

    bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...

  4. linux下bus、devices和platform的基础模型

    转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核 ...

  5. ACE bus

    ACE bus增加的内容: 1):5状态的cache model 2):关于coherency的additional signal 3):两个cache master访问shared cache的ad ...

  6. 利用Service bus中的queue中转消息

    有需求就有对策就有市场. 由于公司global的policy,导致对公司外发邮件的service必须要绑定到固定的ip地址,所以别的程序需要调用发邮件程序时,问题就来了,如何在azure上跨servi ...

  7. c程序中出现segment error 和 bus error 的原因

    在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...

  8. Azure Service Bus 中的身份验证方式 Shared Access Signature

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  9. Windows Azure Service Bus Topics实现系统松散耦合

    前言 Windows Azure中的服务总线(Service Bus)提供了多种功能, 包括队列(Queue), 主题(Topic),中继(Relay),和通知中心(Notification Hub) ...

  10. Windows Azure Service Bus Notification Hub推送通知

    前言 随着Windows Azure 在中国的正式落地,相信越来越多的人会体验到Windows Azure带来的强大和便利.在上一篇文章中, 我们介绍了如何利用Windows Azure中的Servi ...

随机推荐

  1. 从VisualStudio资源文件看.NET资源处理

    c# 工程里面,经常会添加资源文件. 作用: 一处文本多个地方的UI使用,最好把文本抽成资源,多处调用使用一处资源. 多语言版本支持,一份代码支持多国语言.配置多国语言的资源文件,调用处引用资源. 例 ...

  2. java基本程序设计结构总结

    学习一门语言:(1)掌握它的表现形式(2)这些语言什么应用. 1.1关键字 1.关键字是被赋予了特殊含义的单词. 2.关键字特点:关键字所有字母都小写. 3.类名的每一个单词开头必须大写. 1.2标识 ...

  3. 前端vue项目js中怎么保证链式调用后台接口

    在一个for循环中对同一接口调用多次,如何保证逐步执行,同步执行. html部分 <DcFileUpload v-for="(item, index) of fileLengthLis ...

  4. postgresql 相关函数总结

    1.获取当前日期的年份 select to_char(t.detect_date,'YYYY') select extract(year from now())为double precision 格式 ...

  5. 智能家居-1.基于esp8266的语音控制系统(开篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) apache-apollo安 ...

  6. 3 测试使用和LogCat日志

    测试概念: 1.根据是否知道源代码分: 黑盒测试:功能测试 白盒测试:编写代码进行测试 2.测试力度划分: 方法测试: 单元测试: 集成测试: 系统测试: 3.暴力程度划分: 压力测试: 冒烟测试:压 ...

  7. bat脚本弹出消息示例(msg命令详细解释)

    弹出消息的bat,其实就是通过批处理调用msg命令,msg是系统自在的一个可以发送信息的命令. 示例: @echo off rem 测试MSG msg * "ok" rem 测试M ...

  8. Java并行程序基础。

    并发,就是用多个执行器(线程)来完成一个任务(大任务)来处理业务(提高效率)的方法.而在这个过程中,会涉及到一些问题,所以学的就是解决这些问题的方法. 线程的基本操作: 1.创建线程:只需要new一个 ...

  9. Django forms 主要的标签介绍

    修改 forms.py from django import forms as DForms from django.forms import fields from django.forms imp ...

  10. JMETER 审批任务实战

    业务场景 我们需要对流程任务进行审批,这个和流程发起是不一样的,因为在流程发起时,只需要用户登录后,指定固定的流程方案和数据就可以发起流程了. 流程任务是需要获取任务ID再做任务审批的. 实现思路 1 ...