2017-11-03 26 views
0

C++ 코드 스 니펫을 사용하여 dbus 인터페이스에서 속성을 가져 오는 방법/코드 스 니펫을 알고 싶습니다.C++ gdbus - gdbus 라이브러리를 사용하여 인터페이스의 등록 정보를 가져 오는 방법은 무엇입니까?

다음과 같은 방법으로 오류가 발생했습니다.

접근 # 1 g_dbus_proxy_get_cached_property 를 사용하고 있지만 항상 반환 널

ifproxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
             flags, 
             NULL, 
             "org.freedesktop.NetworkManager", 
             "org/freedesktop/NetworkManager/Device/0", 
             "org.freedesktop.NetworkManager.Device", 
             NULL, 
             &error); 
ret = g_dbus_proxy_get_cached_property(ifproxy, "State") 

접근 # 2 g_dbus_proxy_call_sync한다 - 이 하나가 말한다 "org.freedesktop.networkmanager"내보낼 수 없습니다 (또는 존재하지 않을 수도 있음), "인터페이스"속성에 액세스 할 수 없습니다.

ifproxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
              G_DBUS_PROXY_FLAGS_NONE, 
              NULL, 
              "org.freedesktop.NetworkManager", 
              "org/freedesktop/NetworkManager/Device/0", 
              "org.freedesktop.DBus.Properties", 
              NULL, NULL); 
    g_assert (ifproxy); 

    /* Get the object path of the Connection details */ 
    ret = g_dbus_proxy_call_sync (ifproxy, 
            "Get", 
            g_variant_new ("(ss)", 
               "org/freedesktop/NetworkManager/Device/0", 
               "Interface"), 
            G_DBUS_CALL_FLAGS_NONE, -1, 
            NULL, &error); 
    if (!ret) { 
     g_dbus_error_strip_remote_error (error); 
     g_warning ("Failed to get property: %s\n", 
        error->message); 
     g_error_free (error); 
     return; 
    } 

    name = g_variant_get_string(ret, NULL); 

    //g_assert(ret != NULL); 

    g_variant_get (ret, "s", &name); 
    g_variant_unref (ret); 

답변

0

고맙습니다. @jku.

인코딩 문제를 해결할 수있었습니다. 아래 작업 코드를 다른 사람들과 공유하고 있습니다.

static void 
list_connections (GDBusProxy *proxy) 
{ 
    int i; 
    GError *error = NULL; 
    GVariant *ret, *ret1; 
    char **paths; 
    gchar *name; 
    GDBusProxy *ifproxy; 
    GDBusProxyFlags flags; 

    /* Call ListConnections D-Bus method */ 
    ret = g_dbus_proxy_call_sync (proxy, 
            "GetDevices", 
            NULL, 
            G_DBUS_CALL_FLAGS_NONE, -1, 
            NULL, &error); 
    if (!ret) { 
     g_dbus_error_strip_remote_error (error); 
     g_print ("ListConnections failed: %s\n", error->message); 
     g_error_free (error); 
     return; 
    } 

    g_variant_get (ret, "(^ao)", &paths); 
    g_variant_unref (ret); 

    flags = static_cast<GDBusProxyFlags> (G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START); 

    for (i = 0; paths[i]; i++) 
    { 
     g_print ("%s\n", paths[i]); 
     /*ifproxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
              flags, 
              NULL, 
              "org.freedesktop.NetworkManager", 
              paths[i],//"/org/freedesktop/NetworkManager/Devices/0" 
              "org.freedesktop.NetworkManager.Device", 
              NULL, 
              &error); 

     //name = g_dbus_proxy_get_interface_name(ifproxy); 
     ret = g_dbus_proxy_get_cached_property(ifproxy, "FirmwareVersion");*/ 

     ifproxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
               G_DBUS_PROXY_FLAGS_NONE, 
               NULL, 
               "org.freedesktop.NetworkManager", 
               "/org/freedesktop/NetworkManager/Devices/0", 
               "org.freedesktop.DBus.Properties", 
               NULL, NULL); 
     g_assert (ifproxy); 

     ret = g_dbus_proxy_call_sync (ifproxy, 
             "Get", 
             g_variant_new ("(ss)", 
                "org.freedesktop.NetworkManager.Device", 
                "Interface"), 
             G_DBUS_CALL_FLAGS_NONE, -1, 
             NULL, &error); 
     if (!ret) { 
      g_dbus_error_strip_remote_error (error); 
      g_warning ("Failed to get property: %s\n", 
         error->message); 
      g_error_free (error); 
      return; 
     } 

     g_print("\nType String of Variant:- %s\n", g_variant_get_type_string (ret)); 

     g_variant_get (ret, "(v)", &ret1); 
     g_variant_unref (ret); 

     g_print("\nType String of Variant:- %s\n", g_variant_get_type_string (ret1)); 
     g_variant_get (ret1, "s", &name); 
     g_variant_unref (ret1); 


     g_print ("Interface name:- %s\n", name); 
    } 
    g_strfreev (paths); 
} 

int 
main (int argc, char *argv[]) 
{ 
    GDBusProxy *proxy; 
    GDBusProxyFlags flags; 
    GError *error = NULL; 
    flags = static_cast<GDBusProxyFlags> (G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START); 

#if !GLIB_CHECK_VERSION (2, 35, 0) 
    /* Initialize GType system */ 
    g_type_init(); 
#endif 

    proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
              flags, 
              NULL, /* GDBusInterfaceInfo */ 
              "org.freedesktop.NetworkManager", 
              "/org/freedesktop/NetworkManager", 
              "org.freedesktop.NetworkManager", 
              NULL, /* GCancellable */ 
              &error); 
    g_assert (proxy != NULL); 

    /* List connections of system settings service */ 
    list_connections (proxy); 

    g_object_unref (proxy); 

    return 0; 
} 
1

적어도 첫 번째 양식이 작동해야합니다 (실제 코드에서 오류를 처리한다고 가정). 그러나 D-Bus 오브젝트 경로에 문제가 있습니다.

먼저 유효한 객체 경로는 '/'로 시작하므로 /org/freedesktop/NetworkManager/Device/0 ... NetworkManager가 사용하는 경로가 아닌 것 같습니다.

API 참조를 보면 실제로는 /org/freedesktop/NetworkManager/Devices/N (복수의 '기기'에 유의하십시오.)하지만 경로의 마지막 부분 (N)을 알 수는 없습니다. 적절한 코드에서는 org.freedesktop.NetworkManager에서 장치 개체 경로를 얻어야하지만 디버깅을 위해 d-feet와 같은 도구를 사용하여 사용 가능한 개체 경로를 찾고 사용하는 것이 좋습니다.

+0

입력 해 주셔서 감사합니다. :). "Devices/0"의 prpoerty "Interface"에 대한 일부 출력을 얻고 있습니다. 출력은 인터페이스 이름입니다. - 1 \ xedI \ x89 \ xd1^H \ x89 \ xe2H \ x83 \ xe4 \ xf0PTI \ xc7 \ xc0. 나는이 문자열이 무엇을 나타내는 지 모르겠다. (그것은 나를위한 헥사 - 십진수로 보이지 않는다.) 이것을 ASCII 문자열로 변환하는 것을 도와주세요. –