Вопрос по dbus, observer-pattern, qt – избирательный сигнал D-BUS, исходящий от ObServer (одноадресный сигнал)

2

У меня есть ситуация, когда у меня есть один объект ObServer и набор клиентов. ObServer и клиенты подключены через D-BUS (IPC). ObServer имеет универсальный интерфейс для всех клиентов. Но время от времени ObServer должен уведомлять клиентов о некоторых событиях. Клиенты прослушивают общий интерфейс ObServer для сигнала OnNotify ().

Вопрос: Как передать сигнал D-BUS (OnNotify ()) от ObServer указанному клиенту (вместо широковещания всем)?

p.s

Qt D-BUS используется для упаковки, но любой подход приветствуется.

Ваш Ответ

1   ответ
2

которые зарегистрировались для этого сигнала на интерфейсе DBus.

Вы можете добавить параметр вOnNotify сигнал и обработать его в клиенте, или создать отдельные сигналы для каждого клиента. Однако, если вы хотите, чтобы этот компонент был динамическим (добавьте клиентов во время выполнения), вы должны использовать первый подход (параметрOnNotify).

РЕДАКТИРОВАТЬ: больше информации о сигналах

Сигнал определяется следующим образом:

A signal in DBus consists of a single message, sent by one process to any number of other processes. That is, a signal is a unidirectional broadcast. The signal may contain arguments (a data payload), but because it is a broadcast, it never has a "return value." Contrast this with a method call (see the section called “Calling a Method - Behind the Scenes”) where the method call message has a matching method reply message.

The emitter (aka sender) of a signal has no knowledge of the signal recipients. Recipients register with the bus daemon to receive signals based on "match rules" - these rules would typically include the sender and the signal name. The bus daemon sends each signal only to recipients who have expressed interest in that signal.

Первоначальный источник.

РЕДАКТИРОВАТЬ: обновленный ответ в свете комментариев Дмитрия.

Фильтрация сигналов 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 в методе

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

на ветке делаDBUS_MESSAGE_TYPE_SIGNAL вам нужно позвонитьq_dbus_message_set_destination.

Также пункт назначения должен быть доступен с верхних слоев. Проще всего было бы продлитьQDBusMessage Класс, чтобы сохранить место назначения, а затем передать его ниже на уровень dbus.

Если вы можете изменить привязки QT в своем проекте, то вы можете сделать такой маневр :).

Хорошо, я провел небольшое исследование привязок QT, и это возможно. Просто вы должны изменить исходный код. Спасибо за подсказку в спецификации, я не читал эту часть, или она не прилипала ко мне. Теперь я могу изменить свои собственные привязки, чтобы включить эту отличную функцию :).
Редакция 0.18dbus.freedesktop.org/doc/dbus-specification.html  Приложения могут отправлять одноадресные сообщения конкретному получателю или на саму шину сообщений, или рассылать сообщения всем заинтересованным получателям. См. Раздел & # x201C; Маршрутизация сообщений на шине сообщений & # x201D; для деталей. Dmitry
Спасибо за эту помощь и расследование, я вернусь к этому вопросу через некоторое время и сообщу о результатах. Dmitry
А как насчет одноадресного сигнала? Dmitry
Очень хорошо, я тоже попробую патч;) Dmitry

Похожие вопросы