您需要查看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