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

时间:2012-06-13 16:12:15

标签: qt observer-pattern dbus

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

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

P.S

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

1 个答案:

答案 0 :(得分:2)

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

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

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

信号定义如下:

  

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

     

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

Original source

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

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

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

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绑定,那么您可以进行这样的操作:)。