2012-01-17 139 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