c - C中的Dbus结构体和方法调用

标签 c methods architecture dbus bluez

我开始用 C 创建一个 dbus 应用程序来与 bluez 交互。我是 dbus 的新手,对于如何使用 dbus 正确构建我的应用程序有点困惑。

第一个问题与 dbus 中的 Service、Interface 和 Object 路径有关。 Bluez Adapter API具有 org.bluez 服务、org.bluez.Adapter1 接口(interface)以及许多方法和属性。如果我想调用 void StopDiscovery() 方法,以下调用是否正确?

DBusPendingCall * pending;
// create a new method call and check for errors
msg = dbus_message_new_method_call("org.bluez",
    "/", // object to call on
    "org.bluez.Adapter1", // interface to call on
    "StopDiscovery"); // method name
// send message and get a handle for a reply
if (!dbus_connection_send_with_reply (m_dbus_conn, msg, &pending, -1))
{
     //err
}

如果是这种情况,对象路径何时发挥作用?

接下来是如何从 dbus 接收返回的信息。我见过一些带有 DBusPendingCall * 的示例,但是该函数具有 dbus_pending_call_block(),因此该函数会阻塞,直到返回数据。如果我想进行多个调用而不是阻塞,我需要创建一个 DBPendingCall 指针列表并检查每个指针?有回调吗?

谢谢

最佳答案

我确实创建了an example showing the non-blocking call基于dbus watch和超时机制,回应SO问题dbus watch and timeout examples 。基本上,您运行一个 unix select() 循环,所有内容都围绕它调度。

而且我没有触及多个未完成的待处理调用部分。我假设一种方法是检查每个挂起的调用,以查看在收到监视的事件时它是否已完成。检查挂起的完成是非阻塞的。如果您保留少量未完成的待处理调用,那应该没问题,但如果数量变大,这不是一个有效的解决方案。

根据 API 文档,更好的解决方案是使用 dbus_pending_call_set_notify() 来注册待处理调用的回调。

关于c - C中的Dbus结构体和方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35663294/

相关文章:

c - MXE 和 SDL2 出现多个 "Undefined reference"错误

c - 如何从 C 中的函数返回一个数组?

function - Raku 中的方法/子绑定(bind)

c# - VS.NET 应用程序图

reactjs - 如何在 js 网络应用程序中保持身份验证 token 的安全?

c - 是否可以根据是否在 C 中定义头文件来添加某些代码部分?

java - 迭代数组并测试每个值的正则表达式 (Java)

c# - 在 C# 中退出方法

ruby-on-rails - 实现票务系统的答案建议

c - 了解 C 预处理器宏的输出与行代码