2016-02-26 64 views
2

我開始在C中創建一個dbus應用程序來與bluez接口。我是dbus的新手,我有點困惑,因爲如何用dbus正確構建我的應用程序。Dbus結構和方法調用C

第一個問題與dbus中的服務,接口和對象路徑有關。 Bluez Adapter API有org.bluez服務,一個org.bluez.Adapter1接口,以及一些方法和屬性。如果我想調用無效的StopDiscovery()方法,下面的調用是否正確?

DBusPendingCall * pending; 
// create a new method call and check for errors 
msg = dbus_message_new_method_call("org.bluez", 
    "/", // object to call on 
    "org.bluez.Adapter1", // interface to call on 
    "StopDiscovery"); // method name 
// send message and get a handle for a reply 
if (!dbus_connection_send_with_reply (m_dbus_conn, msg, &pending, -1)) 
{ 
    //err 
} 

如果是這種情況,對象路徑何時起作用?

接下來就是如何去從dbus接收信息。我已經看到了一些使用DBusPendingCall的例子,但是函數有dbus_pending_call_block(),所以函數會阻塞,直到返回數據。如果我想要做多個調用而不是阻塞,我需要創建一個DBPendingCall指針列表並檢查每個指針?有沒有回調?

感謝

回答

1

因此,當通過dbus與bluez通話時,似乎需要對象路徑和接口。

// create a new method call for the adapter 
msg = dbus_message_new_method_call("org.bluez", 
"/org/bluez/hci0", // object to call on 
"org.bluez.Adapter1", // interface to call on 
"StopDiscovery"); // method name 


// create a new method call for a characteristic on 
// a given service 
msg = dbus_message_new_method_call("org.bluez", 
"/org/bluez/hci0/dev_12_34_56_78_9A_BC/service0010/char0011", 
"org.bluez.GattCharacteristic1", 
"StartNotify"); 

未決看起來像一個堅實的,可擴展的路要走Unix套接字上的選擇,隨着應用的增長

我會考慮這個架構
2

我沒有創建一個基於DBUS手錶和超時機制an example showing the non-blocking call,響應SO質疑dbus watch and timeout examples。基本上你運行一個unix select()循環,並且所有東西都在其周圍調度。

而我沒有碰到多個未決的掛起呼叫部分。我假設一種方法是檢查每個掛起的呼叫,看看它是否在收到觀看事件時完成。檢查掛起完成是非阻塞的。如果您保留少量未決未決呼叫,則應該沒問題,但如果數量變大,那麼這不是一個有效的解決方案。

它看起來像根據API文檔,更好的解決方案是使用dbus_pending_call_set_notify()來註冊一個回調掛起的呼叫。