我正在尝试在 linux 上用 C++ 实现一个简单的 dbus 本地 IPC 示例。现在我想简单地处理一个在总线上发出的信号:
gdbus emit --system --object-path /com/wp/sink --signal com.wp.sink.MessageReceived
为了处理这个信号,我按照以下示例实现了一个简单的 dbus 应用程序:
https://github.com/GNOME/glibmm:
~/repos/glibmm/examples/dbus/client_bus_listnames.cc
这是应用程序源代码:
#include "giomm/asyncresult.h"
#include "glibmm/refptr.h"
#include "glibmm/ustring.h"
#include "sigc++/functors/ptr_fun.h"
#include <iostream>
using std::cout;
using gstr = Glib::ustring;
namespace gl = Glib;
// =================================
using str = std::string;
// =================================
#include <glibmm.h>
#include <giomm.h>
namespace gd = Gio::DBus;
class DBob : public gd::Proxy
{
public:
DBob(gd::BusType bus_type,
const Glib::ustring& busname,
const Glib::ustring& object_path,
const Glib::ustring& interface_name
): gd::Proxy (
bus_type, busname, object_path, interface_name
)
{ }
protected:
void on_signal(const Glib::ustring& sender_name,
const Glib::ustring& signal_name,
const Glib::VariantContainerBase& parameters) override
{
std::cout <<"on_signal\n";
}
};
// =================================
str busname {"com.wp.sink"};
gd::BusType bustype = gd::BUS_TYPE_SYSTEM;
str objectpath {"/com/wp/sink"};
str ifname {busname};
// =================================
#include <memory>
template <typename T>
using uptr = std::unique_ptr<T>;
uptr<DBob> dbus_object{nullptr};
// main loop.
Glib::RefPtr<Glib::MainLoop> loop;
void run()
{
dbus_object = std::make_unique<DBob>( bustype, busname, objectpath, ifname );
std::cout << "running\n";
loop->run();
}
void gioinit()
{
Gio::init();
loop = Glib::MainLoop::create();
}
int main()
{
gioinit();
run();
return 0;
}
- 你可以从这里找到/克隆/构建应用程序: https ://github.com/ortymd/wp-mesh
我的主要问题是当 gdbus发出信号时应用程序不会触发on_signal回调:
gdbus emit --system --object-path /com/wp/sink --signal com.wp.sink.MessageReceived
- 以下是应用程序使用的 dbus 连接的详细信息:
str busname {"com.wp.sink"};
gd::BusType bustype = gd::BUS_TYPE_SYSTEM;
str objectpath {"/com/wp/sink"};
str ifname {busname};
我有点困惑gdbus emit不包含 busname 的参数,但我希望这可以工作,并且我正在尝试找到丢失的部分。
我会很感激任何建议。