从 ObServer 发出的选择性 D-BUS 信号(单播信号)

Posted

技术标签:

【中文标题】从 ObServer 发出的选择性 D-BUS 信号(单播信号)【英文标题】:selective D-BUS signal emitting from ObServer (unicast signal) 【发布时间】:2012-06-16 15:45:53 【问题描述】:

我有一种情况,我有一个 ObServer 对象和一组客户端。 ObServer 和客户端通过 D-BUS (IPC) 连接。 ObServer 具有适用于所有客户端的通用接口。但是,有时 ObServer 需要通知客户端一些事件。客户端监听 ObServer 通用接口信号 OnNotify()。

问题: 如何从 ObServer 向指定的客户端发出 D-BUS 信号(OnNotify())(而不是向所有客户端广播)?

附言

Qt D-BUS 用于包装,但欢迎使用任何方法。

【问题讨论】:

【参考方案1】:

你不能。所有在 DBus 接口上注册了该信号的客户端都会收到信号。

您可以为OnNotify 信号添加一个参数,并在客户端中处理它,或者为每个客户端创建单独的信号。但是,如果您希望此组件是动态的(在运行时添加客户端),则必须使用第一种方法(参数为 OnNotify)。

编辑:有关信号的更多信息

一个信号定义如下:

DBus 中的信号由单个消息组成,由一个进程发送到任意数量的其他进程。也就是说,信号是单向广播。信号可能包含参数(数据负载),但因为它是广播,所以它永远不会有“返回值”。将此与方法调用(参见“调用方法 - 幕后”一节)进行对比,其中方法调用消息具有匹配的方法回复消息。

信号的发射器(也称为发送器)不知道信号接收器。接收者向总线守护程序注册以根据“匹配规则”接收信号——这些规则通常包括发送者和信号名称。总线守护程序仅将每个信号发送给对该信号表示感兴趣的接收者。

Original source.

编辑:根据 Dmitry 的 cmets 更新答案。

过滤 dbus 信号不适用于任何当前可用的绑定(没有检查所有绑定,只有 2 个(dbus-cpp 和 qt),因此任何人都可以跟进)。

但是,可以使用 dbus 接口 (dbus-message.h) 中可用的函数在 dbus 消息的标头中设置 DESTINATION 字段:

dbus_bool_t dbus_message_set_destination (DBusMessage  *message, const char *destination)

如果是QT绑定,你必须修改绑定如下:在qdbusmessage.cpp方法中

DBusMessage *QDBusMessagePrivate::toDBusMessage(const QDBusMessage &message, QDBusError *error)

在案例分支DBUS_MESSAGE_TYPE_SIGNAL 上,您需要致电q_dbus_message_set_destination

此外,目的地必须可从上层获得。最简单的方法是扩展 QDBusMessage 类以保留目的地,然后将其传递到下面的 dbus 层。

如果您能够修改项目中的 QT 绑定,那么您可能会这样做:)。

【讨论】:

如果 OnNotify 中有参数,我需要在每个客户端中处理它。例如,我等待文件系统中某个文件的 OnNotify(此功能提供 ObServer),但是,每个客户端都希望仅接收指定目录的通知。在这种方法中,每个客户端都会收到所有通知,并且需要根据指定的目录对其进行过滤。出于性能原因,这种方法不方便。 Revision 0.18 dbus.freedesktop.org/doc/dbus-specification.html 应用程序可以将单播消息发送给特定的接收者或消息总线本身,或者将消息广播给所有感兴趣的接收者。有关详细信息,请参阅名为“消息总线消息路由”的部分。 哦,不知道。这很有趣。我想知道绑定是否支持这样的事情。您使用的是 QT 绑定,对吗? 好的,我对 QT 绑定做了一些研究,并且可以做到这一点。只是你必须修改源代码。感谢规范中的提示,我没有阅读那部分,或者它没有粘住我。我现在可以修改我自己的绑定以包含这个漂亮的功能:)。 感谢您的帮助和调查,我会在一天后回到这个问题并报告结果。

以上是关于从 ObServer 发出的选择性 D-BUS 信号(单播信号)的主要内容,如果未能解决你的问题,请参考以下文章

在发出 dbus-send 命令后,如何使用 C 调用方法?

微信发出去的图片怎么删除

D-Bus 是不是保证消息传递?

飞溅问题(d-bus、QSslSocket、libpng)

检测 D-Bus 上的禁止关闭

望正接收器用微信啥小程序