Я пытаюсь получить управляемые объекты из диспетчера объектов bluez, используя libdbus-cpp .В Python я могу сделать это следующим образом:
import dbus
bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object("org.bluez", "/"), "org.freedesktop.DBus.ObjectManager")
objects = manager.GetManagedObjects()
У меня нет большого опыта работы с dbus в целом.Чтобы создать класс ManagedObject, я имитирую класс в /include/core/dbus/interfaces/object_manager.h в источнике dbus-cpp.Это код, который я написал до сих пор в C ++:
#include <core/dbus/bus.h>
#include <core/dbus/object.h>
#include <core/dbus/service.h>
#include <core/dbus/types/variant.h>
#include <core/dbus/types/object_path.h>
namespace dbus = core::dbus;
class ObjectManager {
public:
ObjectManager(const dbus::Bus::Ptr& bus)
: service(dbus::Service::use_service(bus, "org.bluez")) {}
virtual ~ObjectManager() = default;
using get_managed_objects_return_type = std::map<dbus::types::ObjectPath,
std::map<std::string,
std::map<std::string, dbus::types::Variant>>>;
get_managed_objects_return_type get_managed_objects() {
return service->root_object()->invoke_method_synchronously<GetManagedObjects,
get_managed_objects_return_type>().value();
}
private:
struct GetManagedObjects {
using Interface = ObjectManager;
inline static std::string name() {
return "GetManagedObjects";
}
static const bool call_synchronously = true;
inline static const std::chrono::milliseconds default_timeout() {
return std::chrono::seconds{1};
}
};
dbus::Service::Ptr service;
};
namespace core {
namespace dbus {
namespace traits {
template<>
struct Service<ObjectManager> {
inline static const std::string& interface_name() {
static const std::string s {
"org.freedesktop.DBus.ObjectManager"
};
return s;
}
};
} // namespace traits
} // namespace dbus
} // namespace core
int main() {
auto bus = std::make_shared<dbus::Bus>(dbus::WellKnownBus::system);
auto manager= std::make_shared<ObjectManager>(bus);
auto objects = manager->get_managed_objects();
return EXIT_SUCCESS;
}
Но при запуске я получаю эту ошибку:
terminate called after throwing an instance of 'std::runtime_error'
what(): org.freedesktop.DBus.Error.UnknownMethod: Method "GetManagedObjects" with signature "" on interface "org.freedesktop.DBus.ObjectManager" doesn't exist
Что я делаю неправильно?Я что-то упустил?