【嵌入式开发基础】 D-Bus入门 - 基础概念

本片文章主要对D-Bus的基础做些讲解,在后续的文章中会持续输出更深入的学习内容

官方学习资料
入门指南
  • D-Bus官方网站 - D-Bus入门指引
  • Python D-Bus 强烈推荐,Python这边对于D-Bus的概念讲解更好理解.
D-Bus API
  • D-Bus 底层接口 - API
  • gio提供的D-Bus API - GDBus
D-Bus 基础概念

D-Bus是一个总线系统,用于Linux进程间的通信

D-Bus不仅可以当作守护进行,用于多个应用间的通信,也可以直接用于两个应用的直接通信而不是通过D-Bus守护进程的方式

D-Bus 主要是用于传递Message,支持publish/subscribe的通信方式

D-Bus 中传递的数据会指出其数据类型,二不仅仅是原始的数据,另外一个特性是”RPC mechanism” - Remote Procedure Calls (RPC)

GLib 提供了C和D-Bus binding的接口.

D-Bus主要由以下两个部分构成:

  • dbus library, 用于两个(多个)application通信的接口,d

  • dbus daemon, 其它的application可以基于它建立通信,是个桥梁

D-Bus的配置通常在/etc/dbus-1/ 目录下

D-Bus 常用名词解释
  • Address
    每一个bus都有一个地址来描述,通常是一个文件名 例如Unix-domain socket-”/tmp/.hiddensocket”, 这取决与你用了什么dbus library,用到的底层通信协议不同

  • Connections
    bus name是指,建立在dbus上连接的名字,而不是bus 的名字.
    命名规则: 已.隔开 例如: “com.acme.Foo” , 另外需要两个或者以上的. 隔开元素. 当连接建立起来是bus会分配队唯一的bus name.

  • Object
    总线上任何交换信息的一端总是一个端点,再D-Bus中被叫做object. 一个Object总是由client发起创建的,并存在于该client到bus的连接的上下文中. object 是client在总线上提供它能力的方式. 一个clinet可以创建多个object.
    dbus 提供了以下三总消息类型:

    1. client发送到object的请求
    2. 响应请求,从一个object返回
    3. 从object发出一个单向消息广播到任何连接到总线的clent(已经监听该object).

    另外Object也是有名字的,通过斜杠‘/’进行分割

  • Proxies
    Object 可以通过一个引用进行访问,称之为proxies(代理),是对访问Object做了些封装. proxiy 是存在于Client的.

  • Methods
    当client发送一个请求到一个object,它将这个请求看作调用对象中的方法, object 被要求执行一个特定的、有名称的操作. 通常当一个client调用一个object上的method,但object未提供时,一般是会报错的.

  • Signals
    Signal 是由object发起的. Client可以注册一个需要接收的signal指定特定的名字. 当object发起Signal,所有注册了的client都会收到对应的Signal. 没有ack.

  • properties
    properties (variables other processes can read/write from/to). 也可也直接理解为类中的成员变量

  • Interfaces
    可以理解为C++中的命名空间

总结

以上内容只是对D-Bus做了简单介绍,后续的文章会补充实际例子和相关的数据类型转换.

对于实际的例子主要会以自己熟悉的Bluez进行展开,Bluez正是基于D-Bus进行跨进程的通信

另外对于D-Bus的学习,建议以Python-DBus入门,更加简单.

你可能感兴趣的:(嵌入式开发基础,Linux,D-Bus,进程间通信,IPC,rpc,linux)