您需要查看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,因此請檢查正確的版本。
我想知道如何調用它的對象路徑和目的地選項。我想在上面的例子中知道如何org.bluez.Adapter.RemoveDevice調用? – user1089679 2012-01-17 09:25:39
@ I2y3n2 - 在你的 – user1089679 2012-01-17 09:38:42
首先,一個dbus服務連接到dbus-daemon並請求一個地址(在你的情況下org.bluez)。 – l2y3n2 2012-01-18 00:42:24