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函数通过接口代理调用接口提供的方法。

3 下集预告

d-feet虽然很方便,但它使用了python的gtk模块,在一些嵌入式环境可能使用不了。后面会看到,用一个叫dbus-send的命令行工具,或者写几行python脚本都可以完成同样的工作。我们还会用一个叫dbus-monitor的命令行工具观察dbus调用过程中究竟发生了什么?

发表于 @ 2009年12月24日 11:38:00 | 评论( 0 ) | 编辑| 举报| 收藏

旧一篇:Dbus组成和原理 | 新一篇:dbus实例讲解2

查看最新精华文章 请访问博客首页相关文章

天道筹勤,今天给自己D-bus进行基本接口扫盲与Dbus相关的文章(抄写别人)与Dbus相关的文章,完成两个简单的收发程序。D-Bus 体系dbus实例讲解(一):初次见面dbus实例讲解(二下):消息和消息总线16.2.1 D-Bus的基本概念dbus实例讲解3

bluez python dbus_dbus实例讲解1相关推荐

  1. python爬虫进阶案例,Python进阶(二十)-Python爬虫实例讲解

    #Python进阶(二十)-Python爬虫实例讲解 本篇博文主要讲解Python爬虫实例,重点包括爬虫技术架构,组成爬虫的关键模块:URL管理器.HTML下载器和HTML解析器. ##爬虫简单架构 ...

  2. python程序实例讲解_Python编程之属性和方法实例详解

    本文实例讲述了Python编程中属性和方法使用技巧.分享给大家供大家参考.具体分析如下: 一.属性 在python中,属性分为公有属性和私有属性,公有属性可以在类的外部调用,私有属性不能在类的外部调用 ...

  3. python程序实例讲解_python入门编程实例 python入门编程实例解析

    python入门编程实例 python入门编程实例解析 python入门编程实例及解析: 题目:有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十 ...

  4. python中zerodivisionerror是什么意思-Python异常处理实例讲解

    目录: 一.什么是异常? 二.异常的总结 三.课时32课后习题及答案 ******************* 一.什么是异常? ******************* 程序出现逻辑错误或者用户输入不合 ...

  5. 初学python100例-案例34 单词转字母并排序 少儿编程python编程实例讲解

    目录 python单词转字母并排序 一.题目要求 1.编程实现 2.输入输出

  6. 初学python100例-案例36 季节判断器 少儿编程python编程实例讲解

    目录 python季节判断器 一.题目要求 1.编程实现 2.输入输出 3.评分标准

  7. 初学python100例-案例35 数字反转 少儿编程python编程实例讲解

    目录 python数字反转 一.题目要求 1.编程实现 2.输入输出 3.评分标准

  8. python简易版实例_Python3之简单搭建自带服务器的实例讲解

    WEB开发,我们先从搭建一个简单的服务器开始,Python自带服务模块,且python3相比于python2有很大不同, 在Python2.6版本里,/usr/bin/lib/python2.6/ 目 ...

  9. 【Python基础】手把手教你数据可视化!(附实例讲解)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:CrescentAI,华南理工大学,Datawhale优秀学 ...

最新文章

  1. arp 项删除失败: 请求的操作需要提升。_ccna必懂篇-arp协议工作原理详解。
  2. 进腾讯了!(实习面经分享)
  3. mybatis-config.xml
  4. C# message简单实现窗口间信息接收与发送
  5. [转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理
  6. 小米全新5G旗舰手机即将登场 售价必将再创新高
  7. 平面图案素材|时尚民族印花的魔力
  8. 基于Pairwise排序学习的因子分解推荐算法
  9. 使用JMH做Java微基准测试(三)测试参数状态State
  10. 学习笔记-Rabin-Karp哈希
  11. 代码积累与编程能力哪个更重要
  12. 微型计算机外观分为,2015计算机应用基础单选练习题1.1
  13. 面试题之MyBatis缓存
  14. python编写程序、一个富翁与陌生人做交易_智慧职教云课堂Python程序设计(常州工业职业技术学院)题目答案...
  15. 20201228攻防世界WEB模块入门级别全详解通关记录
  16. linux 下安装mantis
  17. python idle界面_3.7 IDLE 用户界面
  18. java 临时文件_Java临时文件
  19. python扫雷 高级算法_Python玩转算法—扫雷
  20. 国产智能AI对话:技术狂潮之下,要有梦元宇宙正在改变世界

热门文章

  1. Docker部署携程Apollo
  2. SCS【16】从肿瘤单细胞RNA-Seq数据中推断拷贝数变化 (inferCNV)
  3. nginx日志切割配置
  4. 圣诞街头场景登场 《TOUCH》辣舞平安夜狂欢
  5. Hive函数05_细说CAST函数(数据类型转化)
  6. ASUS华硕笔记本电脑天选2_FX506HEB11400 3050Ti原装出厂系统恢复原厂系统11
  7. 成功的项目经理5大关键能力
  8. 华为投的华海诚科上市:年营收3亿同比降12% 市值51亿
  9. js弹窗的3种方式:alert、confirm、prompt
  10. C++ 单冒号与双冒号用法