閱讀57 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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);

 

 

 

 

 


 版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/12/26/6099087.aspx

並請聯係譚海燕本人或者前往譚海燕個人主頁留言

 

最後更新:2017-04-02 06:51:33

  上一篇:go magento -- 推薦插件 -- 頁麵布局分析插件 -- Layout Analyzer
  下一篇:go 定時任務時間與當前時間比較的方法