QtDBus编程详解(二)

简介:

                                                           QtDBus编程详解(二)

 

我在上一篇博客QtDBus编程详解(一)中主要讲述了与QtDBus以及DBus相关的基本概念,这一章节,我将重点讲述关于QtDBus通信。

 

QtDBus通信,就必须有服务端和客户端(关键是弄清楚哪一端是server,哪一端是client)。

我们先来看看,QtDBus通信,server和client需要做些什么工作。

 

server:

1.申请一个总线连接,连接到system dbus或者是session dbus。

2.在总线上挂在服务,使得其他进程可以请求和查询服务。

QtDBus编程详解(一)中已经提到,service服务,相当于hostname,当我发送消息的时候,我们需要确定发送到哪一个host。只有跟总线注册了service之后,外部进程才可以查询和发送消息。

 

3.在挂载的服务上注册一个执行服务的对象。

对于Qt来说,是面向对象的。那么,QtDBus或者是进程通信,实际上背后还是两个对象在通信。那么同样,我们需要为该host提供一个可执行服务的对象(即可以发送接收消息以及做其他的相关处理的对象)。

 

上面的3已经说得很清楚了。通信不管有没有DBus,通信的背后始终是两个对象在对话。普通的Qt的对象是无法实现与DBus的通信的。出于方便和安全考虑,QtDBus有一个DBsu适配器adaptor的概念,该DBus adaptor的目的是实现消息的转发。适配器,是可以加载也可以卸载的,而且是附着在Qt普通对象上的,当普通的Qt对象想要和DBus总线通信的时候,只需要告诉这个附着在它身上的DBus adaptor,让这个适配器去转发或者代替他接收消息。这就是QDBusAbstractAdaptor类的工作,这个类就是用来创建dbus 适配器的。只有server才需要适配器,client不需要适配器,需要但是需要另一种接口,在本章节后面将做详细讲解。

 

现在就编写代码来说明以上几个步骤:

 

Car *car = new Car(); //... new CarInterfaceAdaptor(car); QDBusConnection connection = QDBusConnection::sessionBus(); connection.registerObject("/Car", car); connection.registerService("com.trolltect.CarExample");

以上代码就完成了以上的所有步骤,让我们来看看上述代码究竟做了些什么。

Car就是需要和DBus通信的server Qt的普通对象(不具有DBus功能)。

 

/** 为通信server对象car安装一个DBus adaptor适配器,从而使得具有DBus功能 */ new CarInterfaceAdaptor(car)

其中CarInterfaceAdaptor是一个派生与QDBusAbstractAdaptor的一个类。关于派生与QDBusAbstractAdaptor的类是写法我将在下一篇博客中详细讲述。

 

/** 创建一个连接到session总线上的链接connection */ QDBusConnection connection = QDBusConnection::sessionBus(); /** 注册com.trolltech.CarExample这个service */ connection.registerService("com.trolltech.CarExample"); /** 注册一个可执行的对象。这个对象就是我们所说的已经安装了DBus适配器的Qt普通对象。不过这个Qt对象已经具备了DBus功能 */ connection.registerObject("/Car", car);

 

注册service成功之后,你就可以使用D-Feet这个工具观察到你已经连接到session上了,并有一个com.trolltech.CarExample服务了

Qt自带的工具qdbusviewer也可以观察到,但是我个人不太喜欢使用qdbusviewer,D-Feet比它更加强大。

 

到此为止,server创建相关工作已经完成。下面来看看client创建以及相关工作。

 

Client:

 

1.申请一个总线连接,连接到system dbus或者是session dbus上。

2.创建一个接口,连接到要请求的服务上。(这个service,在上面部分和QtDBus编程详解(一)都有详细的阐述)。

上面已经提到了。Server需要一个适配器,而Client则需要一个接口。

3.发送请求。

 

在Client中,接口是派生与QDBusAbstractInterface的一个类。这个类使得Client具有和远端的Server具有通信能力。

Client和Server之间进行DBus通信,很大程度上是Client去调用Server提供的一些method和signals(method和signals已经在QtDBus编程详解(一)讲述了)。那么这个接口其实就是一个proxy代理。让你操作remote的Server上的method和signals就像操作本地函数一样。这也就是QDBusAbstractInterface派生类的主要作用。

 

同样,下面我将结合代码来具体的讲述:

 

CarInterface *car; car = new CarInterface("com.trolltech.CarExample", "/Car", QDBusConnection::sessionBus(), this);

 

 

 

 

 


 版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/12/26/6099087.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言

 

目录
相关文章
|
1月前
|
C++ 开发者 Python
物理光学的编程
物理光学的编程
46 0
|
1月前
编程题小练
编程题小练
29 0
|
11月前
|
C语言 C++
编程萌新的内心独白
编程萌新的内心独白
|
11月前
编程求1+2+3+…+1000的结果。
编程求1+2+3+…+1000的结果。
|
JavaScript 前端开发 Java
编程题
7.一个采用查询方式输出数据的 I/O 接口中,8 位数据端口地址为 2000H,1 位 状态端口地址为 2002H,外设状态位用 D0 传送,高电平表示数据准备好。设 1000 个字节数据存在内存 BUFFER 为首地址的缓冲区中,写出查询方式输出 1000 个 字节数据的程序段。 LEA SI,BUFFER MOV CX,1000 P: MOV DX,2002H L: IN AL,DX TEST AL,01H JZ L MOV DX,2000H MOV AL,[SI] OUT DX,AL INC SI LOOP P HLT 8.编写完整程序,将键盘输入的小写字母转换成大写字母并输出显示,直
142 0
|
Web App开发 移动开发 前端开发
Day 26: TogetherJS —— 让我们一起来编程!
今天的《30天学习30种新技术》挑战,我打算学习一个源自Mozilla的很酷的JavaScript库——TogetherJS。几个月前,我写过一个面向Java 8的在线Java编辑器。今天我将学习如何使用TogetherJS来给这个应用增加协作功能。
188 0
Day 26: TogetherJS —— 让我们一起来编程!
|
存储
编程
编程
194 0
|
Python
pychon 开始编程
1 IDE 运行python 新建项目 新建hello.py文件 输入: print('hello world') image.png 运行hello.
1358 0
|
Java 程序员
我似乎理解了编程的意义
编程的意义是什么,我又为什么要编程呢? 这是一个不时会浮现在我脑海中的问题,它来得并不频繁,但每次却都伴随着对自己职业生涯或人生目标的质疑而产生,令我感到些许困惑和不安。而在这十几年的职业生涯中,我也似乎总能在每个阶段为自己找到一个继续热爱编程的理由,直到它已无法解答再一次疑惑的产生。
1074 0