dbus-glib编程2:d-feet的使用
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调用过程中究竟发生了什么?
dbus-glib编程2:d-feet的使用相关推荐
- DBus glib 各数据类型接收与发送详解—C语言(3)
DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...
- DBUS入门与C编程
一.D-Bus简介 1. D-Bus是什么 D-Bus最主要的用途是在 Linux 桌面环境为进程提供通信,同时能将 Linux 桌面环境和 Linux 内核事件作为消息传递到进程.D-Bus(其中D ...
- DBus daemon 启动(三)
前面简单了解一下,DBus的架构和简单的应用编程.那么接下来,就来看看,DBus是怎么启动的,这一往篇不涉及内部实现问题,只是介绍dbus-daemon如何启动及涉及哪里配置 一.编译Dbus库完成之 ...
- D-bus 介绍(一)
1.DBus 是什么 a) DBus 是一种本地进程间通信机制,支持点对点的通信,以及广播/订阅式的通信方式. b) DBus将要传输的的数据结构化为二进制数据.包括不同长度的整数.浮点数.字符串.数 ...
- QDBus和Glib-dbus使用
1.参考内容 https://blog.csdn.net/qq_41673920/article/details/121227229?ops_request_misc=%257B%2522reques ...
- dbus-python指南
菜鸟学dbus-python,翻译dbus-python指南,错误之处请在所难免,请诸位不吝赐教,多多指正!查看英文原版请点这里. 连接总线Connecting to the Bus 方法调用Maki ...
- linux桌面xfce,Xfce 4.14 发布,Linux桌面环境
经过近四年半的开发,Xfce 4.14桌面环境已经发布,并且包含许多新特性和改进. Xfce 4.14是在Xfce 4.12的4年5个月之后发布的,该版本可能包含在几乎所有基于Linux的操作系统的软 ...
- GTK+编程入门(1)—简介与glib库
GTK+编程入门(1)-简介与glib库(2015-7-23) 分类:GTK+ 一:GTK+简介 GTK+是一个软件开发工具包,其设计目的是支持在 X Window系统下开发图形界面的应用程序.G ...
- dbus PHP,DBUS 编程总结
DBUS是个3层架构的进程间通信系统,包括: 1. 函数库libdbus,用于两个应用程序呼叫联系和交互消息. 2. Message bus daemon,总线守护进程可同时与多个应用程序相连 ...
- IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)
文章目录 一.D-Bus简介 1.D-Bus简介 2.不同IPC通信方式比较 3.D-Bus特性 二.D-Bus架构 2.D-Bus接口层 3.D-Bus总线层 测试demo 4.D-Bus封装层 三 ...
最新文章
- TCP/IP详解--第五章
- Ubuntu 16.04下Caffe-SSD的应用(五)——安装VOC数据标注工具LabelImag
- css 剪辑图片_CSS中的clip-path裁剪图片用法
- linux 内核地址随机化,GNU/Linux内核的地址随机化
- 移动表到另一表空间命令
- 打造一款便携版的Sublime Text
- oracle 中sql的分类,Oracle数据库语言分类
- 【Elasticsearch】语言处理系列之打字或拼写错误 模糊匹配 字段纠错 Fuzzy multi_match
- Emacs代码补全之ycmd
- CentOS 7 设置 DNS
- token什么意思中文在C语言中,token是什么意思?
- unity3D 没有影子
- 80004005错误代码_80004005错误代码怎么回事_安装软件错误代码0×80004005如何解决...
- SAP Down Payment的设置和使用
- 关于视频编码I P B帧存储,编码,解码,显示顺序的理解
- 计算机读不出来u盘装系统,细说电脑重装系统u盘读不出怎么办
- 8脚 tja1050t_高速光耦:CAN总线通信硬件原理图(采用TJA1050T CAN总线驱
- 电脑桌面计算机文件打不开怎么办,教大家电脑桌面上的文件都打不开怎么办
- 监控系统相关的常见面试问题
- 485通讯的校验和_组态王与西门子S71200PLC无线Modbus通讯