在这里我想简要了解一下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-reply选项和所有其他选项,但是它与我不知道的源文件如何一起工作。

因此,任何人都可以向我解释该命令的调用方式以及如何使用C源文件中的函数。

最佳答案

您需要签出dbus文档,并且还有很长的路要走。

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

你到底想要什么?编写dbus服务还是客户端?

必须使用C编写,因为python是更好的选择。
http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html

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

首先,dbus服务连接到dbus-daemon并询问服务地址(在您的情况下为org.bluez)。
然后,它在不同的对象路径上注册不同的接口,每个接口都包含一些方法调用/信号供用户使用。

在您的情况下:


Dbus守护进程(dbus-daemon --system)已启动。
Bluez守护程序进程启动,并向dbus-daemon询问“ org.bluez”服务地址
Bluez守护进程在/ org / bluez / {process pid} / {bluetooth控制器名称}中注册一些接口(检查doc目录中的bluez源代码)
当您调用dbus-send命令时,命令行工具将连接到dbus-daemon,发送服务地址(-dest),对象路径(/ org / bluez / 1536 / hci0),接口名称,您调用的方法(
org.bluez.Adapter.RemoveDevice)和参数。
Dbus-daemon重新发送给bluez


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

Dbus守护程序无法获取服务地址或方法调用。
告诉您服务地址和方法调用名称的是您或客户进程。

然后,DBus守护程序将以自己的格式(通过Unix本地套接字文件)向目标服务进程发送包含obj-path,接口/方法名称和参数的数据包。

然后目标服务进程将数据包解包,获取对象路径,接口等,然后决定应该做什么。这不是自动完成的,您需要编写自己的代码来处理它(方法调度等),或使用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处理(在drc连接和src / main.c中的事件处理之后)。当某些客户端调用org.bluez.Adapter.CreateDevice时,它最终进入src / adapter.c第1468行的create_device函数。

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,所以请检查正确的版本。

关于c - 谁能解释这个命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8892016/

10-12 23:49