谁能解释一下这个命令

标签 c bluetooth embedded dbus

这里我想简单了解一下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)。 然后在不同的对象路径注册不同的接口(interface),每个接口(interface)都包含一些方法调用/信号供用户使用。

就您而言:

  • Dbus 守护进程(dbus-daemon --system)已启动。

  • Bluez 守护进程启动并向 dbus-daemon 询问“org.bluez”服务地址

  • Bluez 守护进程在/org/bluez/{process pid}/{bluetoothcontroller name} 注册一些接口(interface)(查看 doc 目录中的 bluez 源代码)

  • 当调用 dbus-send 命令时,命令行工具将连接到 dbus-daemon,发送服务地址(-dest)、对象路径(/org/bluez/1536/hci0)、接口(interface)名称、你调用的方法( org.bluez.Adapter.RemoveDevice)和参数。

  • Dbus-daemon 将其重新发送到 bluez

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

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

然后,DBus 守护进程将向目标服务进程发送一个包含 obj-path、接口(interface)/方法名称和参数的数据包(通过 unix 本地套接字文件)。

目标服务进程然后解包数据包,获取对象路径、接口(interface)等,决定它应该做什么。这不会自动完成,您需要编写自己的代码来处理它(方法调度等),或者使用一些库,例如 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;
}

您注册接口(interface) ADAPTER_INTERFACE("org.bluez.Adapter") 及其所有方法和信号。

然后所有底层的 dbus 事件监视器和方法调度将由 gdbus 处理(在 src/main.c 中初始化 dbus 连接和事件处理之后)。当某些客户端调用 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 接口(interface)从 3.XX 到 4.XX 发生了很大变化,因此请检查正确的版本。

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

相关文章:

Java蓝牙套接字重新启动后不接受连接

java - Android BLE onCharacteristicChanged 未触发

assembly - ARM 汇编 - 分支指令

c - C 中指针赋值有什么区别?

c - zbar库中使用的算法

c - 如何理解ACC_MODE这个宏?

c - 通过套接字发送整数和字符

ios - 初始化 AVAudioSession 时保持蓝牙声音

c - 解析循环缓冲区

c - 多对一网守任务同步