我有一种情况,我有一个ObServer对象和一组客户端。 通过D-BUS(IPC)连接的ObServer和客户端。 ObServer具有所有客户端的通用接口。但是,ObServer需要时常通知客户有关某些事件。客户端侦听ObServer通用接口信号OnNotify()。从ObServer发出的选择性D-BUS信号(单播信号)
问题: 如何从ObServer发出D-BUS信号(OnNotify())到指定的客户端(而不是广播给所有人)?
p.s
Qt D-BUS用于包装,但任何方法都欢迎。
我有一种情况,我有一个ObServer对象和一组客户端。 通过D-BUS(IPC)连接的ObServer和客户端。 ObServer具有所有客户端的通用接口。但是,ObServer需要时常通知客户有关某些事件。客户端侦听ObServer通用接口信号OnNotify()。从ObServer发出的选择性D-BUS信号(单播信号)
问题: 如何从ObServer发出D-BUS信号(OnNotify())到指定的客户端(而不是广播给所有人)?
p.s
Qt D-BUS用于包装,但任何方法都欢迎。
你不行。所有在DBus接口上注册该信号的客户端都会收到信号。
您可以向OnNotify
信号添加一个参数,并在客户端处理它,或为每个客户端创建单独的信号。但是,如果您希望此组件是动态的(在运行时添加客户端),则必须采用第一种方法(参数为OnNotify
)。
编辑:
在的DBus信号由一个单独的消息,由一个过程发送到任何数目的其他过程的:对信号
的信号被定义如下的详细信息。也就是说,信号是单向广播。该信号可能包含参数(数据有效载荷),但由于它是广播,它永远不会有“返回值”。将其与方法调用(参见“调用方法 - 幕后”一节)进行对比,方法调用消息具有匹配的方法回复消息。
信号的发射器(aka发送器)不知道信号接收者。收件人向总线守护进程注册以接收基于“匹配规则”的信号 - 这些规则通常包括发送者和信号名称。总线守护进程仅将每个信号发送给表示对该信号感兴趣的收件人。
编辑:根据德米特里的评论更新答案。
过滤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在你的项目,那么你可能做这样的动作:)。
在OnNotify参数的情况下,我需要处理它的每一个客户。例如,我在等待文件系统中的某个文件的OnNotify(此功能提供了ObServer),但是,每个客户端只想接收指定目录的通知。在这种方法中,每个客户端都会收到所有通知,并需要根据指定的目录进行过滤性能原因不方便的方法。 – Dmitry
单播信号怎么样? – Dmitry
修订版0.18 http://dbus.freedesktop.org/doc/dbus-specification.html 应用程序可能会将单播消息发送到特定收件人或消息总线本身,或将消息广播到所有感兴趣的收件人。有关详细信息,请参阅“消息总线消息路由”一节。 – Dmitry