2012-06-13 37 views
2

我有一种情况,我有一个ObServer对象和一组客户端。 通过D-BUS(IPC)连接的ObServer和客户端。 ObServer具有所有客户端的通用接口。但是,ObServer需要时常通知客户有关某些事件。客户端侦听ObServer通用接口信号OnNotify()。从ObServer发出的选择性D-BUS信号(单播信号)

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

p.s

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

回答

2

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

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

编辑:

在的DBus信号由一个单独的消息,由一个过程发送到任何数目的其他过程的:对信号

的信号被定义如下的详细信息。也就是说,信号是单向广播。该信号可能包含参数(数据有效载荷),但由于它是广播,它永远不会有“返回值”。将其与方法调用(参见“调用方法 - 幕后”一节)进行对比,方法调用消息具有匹配的方法回复消息。

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

Original source

编辑:根据德米特里的评论更新答案。

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

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

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

在QT绑定的情况下,必须修改绑定如下:qdbusmessage.cpp在对此案分支DBUS_MESSAGE_TYPE_SIGNAL你需要拨打电话到q_dbus_message_set_destination方法

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

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

如果你能够修改绑定QT在你的项目,那么你可能做这样的动作:)。

+0

在OnNotify参数的情况下,我需要处理它的每一个客户。例如,我在等待文件系统中的某个文件的OnNotify(此功能提供了ObServer),但是,每个客户端只想接收指定目录的通知。在这种方法中,每个客户端都会收到所有通知,并需要根据指定的目录进行过滤性能原因不方便的方法。 – Dmitry

+1

单播信号怎么样? – Dmitry

+2

修订版0.18 http://dbus.freedesktop.org/doc/dbus-specification.html 应用程序可能会将单播消息发送到特定收件人或消息总线本身,或将消息广播到所有感兴趣的收件人。有关详细信息,请参阅“消息总线消息路由”一节。 – Dmitry