我开始在C中创建一个与bluez接口的dbus应用程序。我是dbus的新手,我对如何使用dbus正确构建应用程序感到困惑。
第一个问题与dbus中的服务,接口和对象路径有关。 Bluez Adapter API具有org.bluez服务,org.bluez.Adapter1接口以及许多方法和属性。如果我想调用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指针并检查每一个?有没有回调?
由于
答案 0 :(得分:2)
我确实基于dbus监视和超时机制创建了an example showing the non-blocking call,以响应SO问题dbus watch and timeout examples。基本上你运行一个unix select()循环,然后在它周围调度所有东西。
我没有触及多个待处理的待处理部分。我假设有一种方法是检查每个待处理呼叫,以查看收到监视事件时是否完成。检查挂起的完成是非阻塞的。如果您保留少量未完成的待处理呼叫,则应该没问题,但如果数量变大则不是有效的解决方案。
看起来根据API文档,更好的解决方案是使用dbus_pending_call_set_notify()
注册回拨到挂起的调用。
答案 1 :(得分:1)
因此,当通过dbus与bluez交谈时,似乎需要对象路径和接口。
// create a new method call for the adapter
msg = dbus_message_new_method_call("org.bluez",
"/org/bluez/hci0", // object to call on
"org.bluez.Adapter1", // interface to call on
"StopDiscovery"); // method name
// create a new method call for a characteristic on
// a given service
msg = dbus_message_new_method_call("org.bluez",
"/org/bluez/hci0/dev_12_34_56_78_9A_BC/service0010/char0011",
"org.bluez.GattCharacteristic1",
"StartNotify");
用于挂起的Unix套接字选择看起来像一个可靠的,可扩展的方式,我会在应用程序增长时考虑这个架构