2012-01-17 136 views
0

在這裏,我想了解的dbus-send命令我想知道我們怎麼能這樣和如何命令調用的其他C文件自動功能使用。誰能解釋一下這個命令

這裏我舉了一個用於藍牙配對和解除配對的例子。請給我解釋一下

dbus-send --system --print-reply --dest=org.bluez $BT_ADAPTER org.bluez.Adapter.RemoveDevice objpath:$BT_ADAPTER/dev_$BD_ADDR_XX 

這裏BT_ADAPTER是藍色的適配器,如:/org/bluez/1536/hci0 BD_ADDR_XX是藍牙地址:XX_XX_XX_XX_XX_XX

在這裏,我知道--system --print-回覆選項和所有其他選項,但它是如何工作與源文件,我不知道。

所以任何人都可以解釋我看到這個命令調用並使用C源文件中的函數。

回答

2

您需要查看dbus文檔,還有很長的路要走。

http://www.freedesktop.org/wiki/IntroductionToDBus

你到底要什麼?寫一個dbus服務或客戶端?

你必須用C編寫,因爲python會是一個更好的選擇。 http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html

============================

首先,DBUS服務連接到DBUS守護進程,並要求爲一個服務地址(在你的情況org.bluez)。 然後它在不同的對象路徑上註冊不同的接口,每個接口都包含一些方法調用/信號供用戶使用。

你的情況:

  • 烏思守護進程(DBUS守護--system)開始。

  • 配合bluez啓動的守護進程,並要求DBUS守護進程的 「org.bluez」 服務地址

  • 配合bluez守護進程在註冊/組織/ bluez的/ {進程PID}/{藍牙控制器名}一些接口(檢查bluez源代碼,在doc目錄中)

  • 當您調用dbus-send命令時,命令行工具將連接到dbus-daemon,發送服務地址(-dest),對象路徑(/ org/bluez/1536/hci0),接口名稱,您調用的方法( org.bluez.Adapter.RemoveDevice)和參數。

  • 烏思守護進程重新發送它的bluez

============================

Dbus守護進程不會獲得服務地址或方法調用。 這是你或客戶進程告訴它的服務地址和方法調用名稱。

DBus守護進程會發送目標服務進程一個數據包包含obj-path,接口/方法名和參數以自己的格式(通過一個unix本地套接字文件)。

目標服務進程然後解包數據包,獲取對象路徑,接口等,決定它應該做什麼。這不會自動完成,您需要編寫自己的代碼來處理它(方法調度等),或使用一些庫,如dbus-glib/gdbus。

============================

我檢查配合bluez-4.98的源代碼。它使用gdbus進行方法調度。

以「CreateDevice」爲例。

在SRC/adapter.c,有這樣一個結構

static GDBusMethodTable adapter_methods[] = { 
{ "GetProperties", "", "a{sv}",get_properties  }, 
{ "SetProperty", "sv", "", set_property, 
        G_DBUS_METHOD_FLAG_ASYNC}, 
{ "RequestSession", "", "", request_session, 
        G_DBUS_METHOD_FLAG_ASYNC}, 
{ "ReleaseSession", "", "", release_session  }, 
{ "StartDiscovery", "", "", adapter_start_discovery }, 
{ "StopDiscovery", "", "", adapter_stop_discovery, 
        G_DBUS_METHOD_FLAG_ASYNC}, 
{ "ListDevices", "", "ao", list_devices, 
        G_DBUS_METHOD_FLAG_DEPRECATED}, 
{ "CreateDevice", "s", "o", create_device, 
        G_DBUS_METHOD_FLAG_ASYNC}, 
{ "CreatePairedDevice", "sos", "o", create_paired_device, 
        G_DBUS_METHOD_FLAG_ASYNC}, 
{ "CancelDeviceCreation","s", "", cancel_device_creation, 
        G_DBUS_METHOD_FLAG_ASYNC}, 
{ "RemoveDevice", "o", "", remove_device, 
        G_DBUS_METHOD_FLAG_ASYNC}, 
{ "FindDevice",  "s", "o", find_device  }, 
{ "RegisterAgent", "os", "", register_agent  }, 
{ "UnregisterAgent", "o", "", unregister_agent }, 
{ } 
}; 

這意味着CreateDevice的方法調用最終會調用create_device功能。

並且符合2418

if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE, 
       adapter_methods, adapter_signals, NULL, 
       adapter, adapter_free)) { 
    error("Adapter interface init failed on path %s", path); 
    adapter_free(adapter); 
    return NULL; 
} 

你與它的所有方法和信號註冊界面ADAPTER_INTERFACE( 「org.bluez.Adapter」)。

然後,所有基礎的dbus事件監視器和方法分派將由gdbus(在src/main.c中的init dbus連接和事件處理之後)處理。當一些客戶端調用org.bluez.Adapter.CreateDevice,它最終進入在SRC/adapter.c線功能create_device 1468

static DBusMessage *create_device(DBusConnection *conn, 
       DBusMessage *msg, void *data) 
{ 
struct btd_adapter *adapter = data; 
struct btd_device *device; 
const gchar *address; 
DBusMessage *reply; 
int err; 

if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address, 
        DBUS_TYPE_INVALID) == FALSE) 
    return btd_error_invalid_args(msg); 

if (check_address(address) < 0) 
    return btd_error_invalid_args(msg); 

if (!adapter->up) 
    return btd_error_not_ready(msg); 

if (adapter_find_device(adapter, address)) 
    return btd_error_already_exists(msg); 

DBG("%s", address); 
...... 

我不熟悉gdbus,如果你想更深入我建議你檢查的官方網站:http://developer.gnome.org/gio/stable/gdbus-convenience.html

============================

然後你只需要查看bluez源代碼的'test'目錄。

有python和C的例子。

此外,bluez dbus接口從3.XX改爲4.XX,因此請檢查正確的版本。

+0

我想知道如何調用它的對象路徑和目的地選項。我想在上面的例子中知道如何org.bluez.Adapter.RemoveDevice調用? – user1089679 2012-01-17 09:25:39

+0

@ I2y3n2 - 在你的 – user1089679 2012-01-17 09:38:42

+0

首先,一個dbus服務連接到dbus-daemon並請求一個地址(在你的情況下org.bluez)。 – l2y3n2 2012-01-18 00:42:24