QDBus 与我的服务器一起用作客户端,但不适用于 GDbus

Posted

技术标签:

【中文标题】QDBus 与我的服务器一起用作客户端,但不适用于 GDbus【英文标题】:QDBus Works with my Server as Client but not GDbus 【发布时间】:2018-03-03 01:38:25 【问题描述】:

我使用 Qt 的 QDBus 在 Linux 中编写了一个简单的 DBus 服务器。代码量很少,核心在这里:

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");


然后我在 Linux 中也使用 Qt 的 QDBus 编写了一个小型 DBus 客户端。 效果很好,我可以成功地从这个客户端与我的服务器通信。客户端代码:

#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();

不,我正在尝试使用 GDBus 来实现客户端。到目前为止,我有这个:

#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;

当我运行这段代码时,它不像 QDBus 那样工作,它会出现以下错误:

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

所以 QDBus 与服务器一起工作,但 GDBus 不。我究竟做错了什么?谢谢。

【问题讨论】:

【参考方案1】:

想通了,QDBus 生成的接口名称很奇怪,所以我的接口名称指定错误。我使用了gdbus 工具来解决这个问题。

【讨论】:

以上是关于QDBus 与我的服务器一起用作客户端,但不适用于 GDbus的主要内容,如果未能解决你的问题,请参考以下文章

Api 与 Postman 一起工作,但不适用于 android 应用程序

mpifort -DMPI 编译错误:派生类型“mpi_status”用作实际参数。适用于英特尔 Fortran,但不适用于 GNU Fortran

SelectNodes 不适用于 *** 提要

Dio(Dart 的 Http 客户端)获取请求不适用于拦截器

函数适用于双引号,但不适用于单引号

加载 JSON 适用于 XMLHttpRequest 但不适用于 jQuery