dbus-glib编程2:d-feet的使用

论坛 期权论坛 脚本     
匿名技术用户   2021-1-4 23:38   794   0

dbus调试主要用d-feet, dbus-send,dbus-monitor工具;

1、支持dbus的系统都有两个标准的消息总线:系统总线和会话总线。系统总线用于系统与应用的通信。会话总线用于应用之间的通信。 网上有一个叫d-feet的python程序,我们可以用它来观察系统中的dbus世界。

debian系统cinnamon桌面环境调试DBus的锁屏接口。

d-feet上面有系统总线和回话总线两部分组成,在回话总线中可以找到org.cinnamon.Screensaver的bus name,

右侧中的名称就是Well knoew name,服务端向bus daemon申请的名字 org.cinnamon.ScreenSaver。这个也是连接名

唯一名称 :1.154 就是daemon给服务端程序分配的唯一名字。

依次选择右侧的lock函数并双击。

这个窗口会显示出 method,bus name的连接名, 对象路径,interface 接口名

Lock( String message )所以在方法输入中写入"hello 123!"

点击运行系统就会锁屏。并会显示 hello 123!信息。

2、使用dbus-send之前先重复一下相关定义,理解这个很重要。

2.2.1、Bus Name

可以把Bus Name理解为连接的名称,一个Bus Name总是代表一个应用和消息总线的连接。 有两种作用不同的Bus Name,一个叫公共名(well-known names),还有一个叫唯一名(Unique Connection Name)。

2.2.1.1、可能有多个备选连接的公共名

公共名提供众所周知的服务。其他应用通过这个名称来使用名称对应的服务。可能有多个连接要求提供同个公共名的服务,即多个应用连接到消息总线,要求提供同个公共名的服务。 消息总线会把这些连接排在链表中,并选择一个连接提供公共名代表的服务。可以说这个提供服务的连接拥有了这个公共名。 如果这个连接退出了,消息总线会从链表中选择下一个连接提供服务。公共名是由一些圆点分隔的多个小写标志符组成的,例如“org.cinnamon.ScreenSaver”、“org.bluez”。

2.2.1.2、每个连接都有一个唯一名

当应用连接到消息总线时,消息总线会给每个应用分配一个唯一名。唯一名以“:”开头,“:”后面通常是圆点分隔的两个数字,例如“:1.0”。 每个连接都有一个唯一名。在一个消息总线的生命期内,不会有两个连接有相同的唯一名。 拥有公众名的连接同样有唯一名,例如在前面的图中,“org.cinnamon.ScreenSaver”的唯一名是“:1.154”。

有的连接只有唯一名,没有公众名。可以把这些名称称为私有连接,因为它们没有提供可以通过公共名访问的服务。 d-feet界面上有个“Hide Private”按钮,可以用来隐藏私有连接。

2.2.2、Object Paths

Bus Name确定了一个应用到消息总线的连接。在一个应用中可以有多个提供服务的对象。这些对象按照树状结构组织起来。 每个对象都有一个唯一的路径(Object Paths)。或者说,在一个应用中,一个对象路径标志着一个唯一的对象。

“org.cinnamon.ScreenSaver”只有一个叫作“/org/cinnamon/ScreenSaver”的对象。图1中的“org.bluez”有多个对象路径。

2.2.3、Interfaces

通过对象路径,我们找到应用中的一个对象。每个对象可以实现多个接口。例如:“org.cinnamon.ScreenSaver”的“/org/cinnamon/ScreenSaver”实现了以下接口:

  • org.cinnamon.ScreenSaver
  • org.freedesktop.DBus.Introspectable
  • org.freedesktop.DBus.Peer
  • org.freedesktop.DBus.Properties

代码中其实只实现了“org.cinnamon.ScreenSaver”这个接口。 接口“org.freedesktop.DBus.Introspectable”和“org.freedesktop.DBus.Properties”等是消息总线提供的标准接口。

2.2.4、Methods和Signals

接口包括方法和信号。例如“org.cinnamon.ScreenSaver”的“/org/cinnamon/ScreenSaver”对象的“org.cinnamon.ScreenSaver”接口有一个Lock方法。 后面的例子中我们会介绍信号。

标准接口“org.freedesktop.DBus.Introspectable”的Introspect方法是个很有用的方法。 类似于Java的反射接口,调用Introspect方法可以返回接口的xml描述。我们双击 “org.cinnamon.ScreenSaver”->“/org/cinnamon/ScreenSaver”->“org.cinnamon.ScreenSaver”->“org.freedesktop.DBus.Introspectable”的Introspect方法。 这个方法没有输入参数,我们直接点击“Execute”按钮,你在“Output”窗口看到了什么?

后面我们会用另一种方式调用Introspect方法。

2.3 小结

“org.cinnamon.ScreenSaver”->“/org/cinnamon/ScreenSaver”->“org.freedesktop.DBus.Introspectable”的Introspect方法, 这个描述是不是很麻烦。其实前面还要加上“session bus”。

后面在看客户端的C代码时,我们会看到同样的过程:用dbus_g_bus_get得到到session bus的连接。 在这个连接上用dbus_g_proxy_new_for_name函数获得到拥有指定公共名的连接的指定对象的指定接口的代理。 最后,用dbus_g_proxy_call函数通过接口代理调用接口提供的方法。

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP