D Bus學習(六) Method的收發小例子

2021-08-31 10:06:25 字數 3967 閱讀 2715

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

我們繼續學習d-bus,參考相關的api介面reference參考從底層,即libdbus學習如何傳送method以及如何等待應答,在上上次學習中,給出了同步的方式,這是更為高層的處理方式,建議使用。監聽method和監聽signal的方式非常相似。在給出例子之前,我希望和上次學習一樣給出乙個示意圖,更好地了解d-bus的各個概念。

監聽method call訊息,並返回method reply訊息

method的監聽和signal的監聽的處理時一樣,但是訊號是不需要答覆,而method需要。在下面的例子中,我們將學習如何在訊息中加入多個引數(在d-bus學習(四)中,我們加入了乙個引數)的情況。

#include

#include

#include

#include

#include

#include

/*讀取訊息的引數,並且返回兩個引數,乙個是bool值stat,乙個是整數level*/

void reply_to_method_call(dbusmessage * msg, dbusconnection * conn)

dbus_connection_flush(conn);

dbus_message_unref(reply);

}/* 監聽d-bus訊息,我們在上次的例子中進行修改 */

void listen_dbus()

if(connection == null)

return;

//設定乙個bus name:test.wei.dest

ret = dbus_bus_request_name(connection,"test.wei.dest",dbus_name_flag_replace_existing,&err);

if(dbus_error_is_set(&err))

if(ret != dbus_request_name_reply_primary_owner)

return;

//要求監聽某個singal:來自介面test.signal.type的訊號

dbus_bus_add_match(connection,"type='signal',inte***ce='test.signal.type'",&err);

dbus_connection_flush(connection);

if(dbus_error_is_set(&err))

while(true)

if(dbus_message_is_signal(msg,"test.signal.type","test"))else if(dbus_message_is_method_call(msg,"test.method.type","method"))

dbus_message_unref(msg);}}

int main( int argc , char ** argv)

傳送method call訊息,並等待method reply訊息下面的例子在上次學習訊號傳送的例子上進行修改。如下:

#include

#include

#include

#include

#include

#include

//建立與session d-bus daemo的連線,並設定連線的名字,相關的**已經多次使用過了

dbusconnection *  connect_dbus()

if(connection == null)

return null;

//step 2: 設定bus name,也即連線的名字。

ret = dbus_bus_request_name(connection,"test.wei.source",dbus_name_flag_replace_existing,&err);

if(dbus_error_is_set(&err))

if(ret != dbus_request_name_reply_primary_owner)

return null;

return connection;   

}void send_a_method_call(dbusconnection * connection,char * param)

if(pending == null)

dbus_connection_flush(connection);

dbus_message_unref(msg);

//waiting a reply,在傳送的時候,已經獲取了method reply的handle,型別為dbuspendingcall。

// block until we recieve a reply,block until the pending call is completed. 

dbus_pending_call_block(pending);

// get the reply message,gets the reply, or returns null if none has been received yet.

msg = dbus_pending_call_steal_reply(pending);

if (msg == null)

// free the pending message handle

dbus_pending_call_unref(pending);

// read the parameters

if (!dbus_message_iter_init(msg, &arg))

fprintf(stderr, "message has no arguments!/n");

else if (dbus_message_iter_get_arg_type(&arg) != dbus_type_boolean)

fprintf(stderr, "argument is not boolean!/n");

else

dbus_message_iter_get_basic(&arg, &stat);

if (!dbus_message_iter_next(&arg))

fprintf(stderr, "message has too few arguments!/n");

else if (dbus_message_iter_get_arg_type(&arg) != dbus_type_uint32 )

fprintf(stderr, "argument is not int!/n");

else

dbus_message_iter_get_basic(&arg, &level);

printf("got reply: %d, %d/n", stat, level);

dbus_message_unref(msg);

}int main( int argc , char ** argv)

給我老師的人工智慧教程打call!

linux下dbus的理解學習

最近在設計乙個linux桌面程式。而程序間的互動準備使用dbus來解決。介紹 有那麼個組織叫freedesktop,它是專門為linux桌面制定標準的。什麼kde,gnome都是按他的標準來的。而dbus是其中的桌面訊息機制的乙個標準。dbus是乙個ipc的管理系統,其實就底層來說就是本地socke...

QuickServer的學習研究(六)

在啟動quickserver的同時如果你想在服務啟動的前後,服務關閉前後執行特定的操作,那麼必須實現相關的serverhook介面。實現相關的的方法。用於控制quickserver的生命週期的各種資訊。serverhook的源 如下 package org.quickserver.net impor...

我的shader學習之六

今天覆習一下基礎,寫個光照的讀書筆記 先寫個blinn phong的光照模型 upgrade note replaced object2world with unity objecttoworld upgrade note replaced world2object with unity world...