没有合适的资源?快使用搜索试试~ 我知道了~
首页linux DBUS 实例讲解
资源详情
资源评论
资源推荐
dbus 实例讲解(一):初次见面
1、dbus 是什么东西?
“网上有一篇叫 D-Bus Tutorial”的文章,流传较广。不少介绍 dbus 的资料,都引用了其中的段落。其实相
“对于这篇文章,我建议大家直接读 D-Bus Specification”,篇幅不算长,文字也不算枯燥。
D-Bus 是针对桌面环境优化的 IPC(interprocess communication )机制,用于进程间的通信或进程与内
核的通信。最基本的 D-Bus 协议是一对一的通信协议。但在很多情况下,通信的一方是消息总线。消息
总线是一个特殊的应用,它同时与多个应用通信,并在应用之间传递消息。下面我们会在实例中观察消
息总线的作用。消息总线的角色有点类似与 X 系统中的窗口管理器,窗口管理器既是 X 客户,又负责管
理窗口。
支持 dbus 的系统都有两个标准的消息总线:系统总线和会话总线。系统总线用于系统与应用的通信。会
话总线用于应用之间的通信。网上有一个叫 d-feet 的 python 程序,我们可以用它来观察系统中的 dbus
世界。
图 1、由 d-feet 观察到的 D-Bus 世界
D-Bus 是一个程序。它提供了 API。但我们一般不会直接使用 dbus 的接口。dbus-glib 是 GTK 版本的
dbus 接口封装。本文假设读者安装了 dbus-glib,我安装的是 dbus-glib-0.76。后面还会看到,通过
python 操纵 dbus 是多么简单。
2、D-Bus 的基本概念
2.1、从例子开始
我写了一个最简单的 dbus 服务器,它通过 dbus 提供了一个加法的接口。大家可以下载这个例子。这是
一个 autotool 工程,大家解包后,执行:
./autogen.sh ./configure make
然后在 src 目录运行:
./example-service
这时再运行 d-feet,连接 session bus “,在 Bus Name” “窗口会看到一个叫 org.fmddlmyy.Test”连接名。
图 2、提供 D-Bus 服务的 org.fmddlmyy.Test
“选择 org.fmddlmyy.Test” “,在右侧窗口点击展开 Object Paths”->“/TestObj”->“Interfaces”-
>“org.fmddlmyy.Test.Basic”->“Methods”,可以看到一个 Add 方法。双击 Add 方法,弹出下面这个对话框:
图 3、通过 D-Bus 接口计算 1+2=3
在 Parameters “窗口输入 1,2” “,点击 Execute” “按钮,然后在 Output”窗口我们看到了输出结果。我们刚刚
创建了一个 dbus 服务并调用了它。
2.2、名词
我们来解释一下 d-feet 中出现的名词。
2.2.1、Bus Name
可以把 Bus Name 理解为连接的名称,一个 Bus Name 总是代表一个应用和消息总线的连接。有两种作
用不同的 Bus Name,一个叫公共名(well-known names),还有一个叫唯一名(Unique Connection
Name)。
2.2.1.1、可能有多个备选连接的公共名
公共名提供众所周知的服务。其他应用通过这个名称来使用名称对应的服务。可能有多个连接要求提供
同个公共名的服务,即多个应用连接到消息总线,要求提供同个公共名的服务。消息总线会把这些连接
排在链表中,并选择一个连接提供公共名代表的服务。可以说这个提供服务的连接拥有了这个公共名。
如果这个连接退出了,消息总线会从链表中选择下一个连接提供服务。公共名是由一些圆点分隔的多个
“小写标志符组成的,例如 org.fmddlmyy.Test” “、 org.bluez”。
2.2.1.2、每个连接都有一个唯一名
“当应用连接到消息总线时,消息总线会给每个应用分配一个唯一名。唯一名以 :” “开头, :”后面通常是圆点
“分隔的两个数字,例如 :1.0”。每个连接都有一个唯一名。在一个消息总线的生命期内,不会有两个连接
“有相同的唯一名。拥有公众名的连接同样有唯一名,例如在前面的图中, org.fmddlmyy.Test”的唯一名是
“:1.17”。
有的连接只有唯一名,没有公众名。可以把这些名称称为私有连接,因为它们没有提供可以通过公共名
访问的服务。 d-feet “界面上有个 Hide Private”按钮,可以用来隐藏私有连接。
2.2.2、Object Paths
Bus Name 确定了一个应用到消息总线的连接。在一个应用中可以有多个提供服务的对象。这些对象按照
树状结构组织起来。每个对象都有一个唯一的路径(Object Paths)。或者说,在一个应用中,一个对象
路径标志着一个唯一的对象。
“org.fmddlmyy.Test” “只有一个叫作 /TestObj”的对象。图 1 “中的 org.bluez”有多个对象路径。
2.2.3、Interfaces
“通过对象路径,我们找到应用中的一个对象。每个对象可以实现多个接口。例如: org.fmddlmyy.Test”的
“/TestObj”实现了以下接口:
• org.fmddlmyy.Test.Basic
• org.freedesktop.DBus.Introspectable
• org.freedesktop.DBus.Properties
“后面讲代码时会看到,我们在代码中其实只实现了 org.fmddlmyy.Test.Basic”这个接口。接口
“org.freedesktop.DBus.Introspectable” “和 org.freedesktop.DBus.Properties”是消息总线提供的标准接口。
2.2.4、Methods 和 Signals
“接口包括方法和信号。例如 org.fmddlmyy.Test” “的 /TestObj” “对象的 org.fmddlmyy.Test.Basic”接口有一个
Add 方法。后面的例子中我们会介绍信号。
“标准接口 org.freedesktop.DBus.Introspectable”的 Introspect 方法是个很有用的方法。类似于 Java 的反
射接口,调用 Introspect 方法可以返回接口的 xml “描述。我们双击 org.fmddlmyy.Test”->“/TestObj”-
>“org.fmddlmyy.Test.Basic”->“org.freedesktop.DBus.Introspectable”的 Introspect 方法。这个方法没有输
“入参数,我们直接点击 Execute” “按钮,你在 Output”窗口看到了什么?
图 4、调用 Introspect 方法
后面我们会用另一种方式调用 Introspect 方法。
2.3 小结
“org.fmddlmyy.Test”->“/TestObj”->“org.fmddlmyy.Test.Basic”->“org.freedesktop.DBus.Introspectable”的
Introspect “方法,这个描述是不是很麻烦。其实前面还要加上 session bus”。
后面在看客户端的 C 代码时,我们会看到同样的过程:用 dbus_g_bus_get 得到到 session bus 的连接。
在这个连接上用 dbus_g_proxy_new_for_name 函数获得到拥有指定公共名的连接的指定对象的指定接口
的代理。最后,用 dbus_g_proxy_call 函数通过接口代理调用接口提供的方法。
dbus 实例讲解(二上):消息和消息总线
应用程序 A 和消息总线连接,这个连接获取了一个众所周知的公共名(记作连接 A)。应用程序 A 中有
对象 A1 提供了接口 I1,接口 I1 有方法 M1。应用程序 B 和消息总线连接,要求调用连接 A 上对象 A1 的
接口 I1 的方法 M1。
剩余40页未读,继续阅读
hellobaobao
- 粉丝: 8
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论13