2017-09-21 5 views
1

Ich schrieb einen einfachen DBus-Server in Linux mit Qt QDBus. Es ist eine sehr kleine Menge an Code und der Kern ist es hier:QDBus arbeitet mit meinem Server als Client aber nicht GDbus

InterfaceDescription::InterfaceDescription() 
{ 

    new ifadapter(this); // Cleans itself up 

    qDebug() << "Creating"; 

    QDBusConnection dbus = QDBusConnection::sessionBus(); // Use session bus 

    dbus.registerObject("/mygatt",this); // Register object on the bus 

    dbus.registerService("com.my.gatt.interface"); // Expose interface to others 

    qDebug() << "Done creating"; 

} 

QByteArray InterfaceDescription::read() { 

    qDebug() << "CALLING READ"; 

    return QByteArray("HELLO"); 

} 

ich dann ein kleines DBus-Client unter Linux schrieb auch Qt qdbus verwenden. Es funktioniert gut und ich kann erfolgreich von diesem Client zu meinem Server kommunizieren. Client-Code:

#include <QCoreApplication> 

#include "clientIf.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    clientIf* client = new clientIf("com.my.gatt.interface", "/mygatt", QDBusConnection::sessionBus(), 0); 

    qDebug() << "Sending Read() command over Dbus to server..."; 

    client->read(); 

    qDebug() << "Done sending read command..."; 

    return a.exec(); 
} 

Nein Ich versuche, GDBus zu verwenden, um den Client zu implementieren. Bisher habe ich dies:

#include <stdbool.h> 
#include <stdio.h> 
#include <glib/gprintf.h> 
#include <gio/gio.h> 

void test_Echo(GDBusProxy *proxy) 
{ 
    GVariant *result; 
    GError *error = NULL; 
    const gchar *str; 

    g_printf("Calling read...\n"); 
    result = g_dbus_proxy_call_sync(proxy, 
        "read", 
        NULL, 
        G_DBUS_CALL_FLAGS_NONE, 
        -1, 
        NULL, 
        &error); 
    g_assert_no_error(error); 
    g_variant_get(result, "(&s)", &str); 
    g_printf("The server answered: '%s'\n", str); 
    g_variant_unref(result); 
} 

void test_Quit(GDBusProxy *proxy) 
{ 
    GVariant *result; 
    GError *error = NULL; 

    g_printf("Calling method Quit()...\n"); 
    result = g_dbus_proxy_call_sync(proxy, 
        "Quit", 
        NULL, 
        G_DBUS_CALL_FLAGS_NONE, 
        -1, 
        NULL, 
        &error); 
    g_assert_no_error(error); 
    g_variant_unref(result); 
} 


int main(void) 
{ 
    GDBusProxy *proxy; 
    GDBusConnection *conn; 
    GError *error = NULL; 
    const char *version; 
    GVariant *variant; 

    conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); 
    g_assert_no_error(error); 

    proxy = g_dbus_proxy_new_sync(conn, 
         G_DBUS_PROXY_FLAGS_NONE, 
         NULL,    /* GDBusInterfaceInfo */ 
         "com.my.gatt.interface",  /* name */ 
         "/mygatt", /* object path */ 
         "com.my.gatt.interface", /* interface */ 
         NULL,    /* GCancellable */ 
         &error); 
    g_assert_no_error(error); 

    /* Test all server methods */ 
    test_Echo(proxy); 
    test_Quit(proxy); 

    g_object_unref(proxy); 
    g_object_unref(conn); 
    return 0; 
} 

Wenn ich diesen Code ausführen, funktioniert es nicht wie die qdbus tut, es Fehler mit dem folgenden Fehler:

ERROR:../dbustester/main.cpp:29:void test_Echo(GDBusProxy*): assertion failed (error == NULL): GDBus.Error:org.freedesktop.DBus.Error.UnknownInterface: No such interface 'com.my.gatt.interface' at object path '/mygatt' (g-dbus-error-quark, 42) 
Calling read... 
Aborted 

So qdbus arbeitet mit dem Server, aber GDBus nicht. Was mache ich falsch? Vielen Dank.

Antwort

0

Es wurde herausgefunden .. QDBus erzeugt die Schnittstelle mit einem seltsamen Namen, so dass mein Interface Name falsch angegeben wurde. Ich habe das "gdbus" Tool verwendet, um das herauszufinden.

Verwandte Themen