Вызов dbus в C из оболочки dbus-send

У меня есть вызов dbus-send: dbus-send --system --print-reply --dest=org.freedesktop.ModemManager1 "/org/freedesktop/ModemManager1/Modem/0" org.freedesktop.DBus.Properties.Get string:org.freedesktop.ModemManager1.Modem string:"SignalQuality"

И я хотел бы написать простой C-код, который делает то же самое, ну C-способом.

Я не могу найти достаточно информации или чего-либо, что имеет смысл для меня, чтобы понять, что мне нужно, чтобы преобразовать это в C.

Я пробовал вызовы g_dbus_proxy с ограниченным успехом.

Я пытался:

#define MM_DBUS_SERVICE "org.freedesktop.ModemManager1"
#define MM_DBUS_PATH "/org/freedesktop/ModemManager1/Modem/0"
#define MM_DBUS_GET_PROPERTIES  "org.freedesktop.DBus.Properties.Get"

proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
                                           G_DBUS_PROXY_FLAGS_NONE,
                                           NULL,
                                           MM_DBUS_SERVICE,
                                           MM_DBUS_PATH,
                                           MM_DBUS_GET_PROPERTIES,
                                           NULL, NULL);
    ret = g_dbus_proxy_call_sync (proxy,
                                  "SignalQuality",
                                  NULL,
                                  G_DBUS_CALL_FLAGS_NONE, -1,
                                  NULL, &error);
    if (!ret) {
            g_dbus_error_strip_remote_error (error);
            g_print ("failed: %s\n", error->message);
            g_error_free (error);
            return;
    }

Но он постоянно завершается с ошибкой: нет такого интерфейса `org.freedesktop.DBus.Properties.Get'для объекта по пути / org / freedesktop / ModemManager1 / Modem / 0

Есть идеи, как это сделать?

1 ответ

Решение

Я думаю, что имя_интерфейса должно быть "org.freedesktop.DBus.Properties", когда вы вызываете g_dbus_proxy_new_for_bus_sync (..), поэтому попробуйте

#define MM_DBUS_GET_PROPERTIES  "org.freedesktop.DBus.Properties"

и имя_метода должно быть "org.freedesktop.DBus.Properties.Get" при вызове g_dbus_proxy_call_sync (), поэтому попробуйте:

ret = g_dbus_proxy_call_sync (proxy,
                              "org.freedesktop.DBus.Properties.Get",
                              g_variant_new ("(ss)",
                                          "org.freedesktop.ModemManager1.Modem",
                                          "SignalQuality"),
                              G_DBUS_CALL_FLAGS_NONE, -1,
                              NULL, &error);
Другие вопросы по тегам