使用 D-Bus 发送消息

Posted

技术标签:

【中文标题】使用 D-Bus 发送消息【英文标题】:Send a message using D-Bus 【发布时间】:2018-01-15 00:45:39 【问题描述】:

我想,但出现错误:

process 30860: arguments to dbus_message_new_signal() were incorrect, assertion "_dbus_check_is_valid_path (path)" failed in file ../../../dbus/dbus-message.c line 1456.
This is normally a bug in some application using the D-Bus library.
Message is null!

我的代码:

#include <stdio.h>
#include <dbus/dbus.h>


int main()
    DBusConnection *conn;
    DBusError err;
    dbus_error_init(&err);
    conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
    if(!conn)
        fprintf(stderr, "DBus error %s: %s\n", err.name, err.message);
        return(1);
    
    dbus_bus_request_name(conn, "org.test", DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
    if(dbus_error_is_set(&err))
        fprintf(stderr, "DBus error %s: %s\n", err.name, err.message);
        dbus_connection_close(conn);
        return(1);
    
    DBusMessage *msg;
    msg = dbus_message_new_signal("org/test/mon/data", "org.test.mon.data", "Data");
    if(msg == NULL)
        fprintf(stderr, "Message is null!\n");
        return(1);
    
    dbus_message_append_args(msg, DBUS_TYPE_STRING, "My message", DBUS_TYPE_INVALID);
    if(!dbus_connection_send(conn, msg, NULL)) fprintf(stderr, "Error sending message!\n");
    dbus_message_unref(msg);
    dbus_connection_flush(conn);
    dbus_connection_close(conn);

我尝试学习几十个教程和示例,但我想我错过了一些东西。

我只需要发送一条带有文本的消息。

【问题讨论】:

【参考方案1】:

除了按照 jku 的建议修复代码之外,建议你不要使用 libdbus 连接 D-Bus:它的设计已经过时,正确使用很痛苦。

使用更现代的高级 API 更容易,例如 GDBus。

【讨论】:

完全同意这一点,如果我有选择,我永远不会再使用libdbus。【参考方案2】:

dbus_message_new_signal() 的第一个参数是 D-Bus 路径,规范说明了路径:

路径必须以 ASCII '/'(整数 47)字符开头

【讨论】:

谢谢!多么愚蠢的错误……

以上是关于使用 D-Bus 发送消息的主要内容,如果未能解决你的问题,请参考以下文章

远程启动应用程序时在 Linux 上共享 D-BUS 消息总线

蓝牙问题使用 D-Bus (qdbus) 发送 AVRCP 卷更改发送与 org.bluez.MediaTransport1

使用 GDBus 通过 D-Bus 发送字节数组(类型为 `ay`)

如何回复 D-Bus 消息

D-Bus D-Feet 发送字符串字典,Python 语法变体

如何根据反应发送消息,然后根据用户消息发送另一个消息?使用 JDA