Метод "GetManagedObjects" с подписью "" на интерфейсе "org.freedesktop.DBus.ObjectManager" не существует - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь получить управляемые объекты из диспетчера объектов 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

Что я делаю неправильно?Я что-то упустил?

...