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