3

単一の ObServer オブジェクトと一連のクライアントがある状況があります。D-BUS (IPC) を介して接続された ObServer とクライアント。ObServer には、すべてのクライアント用の汎用インターフェースがあります。ただし、時々、ObServer はいくつかのイベントについてクライアントに通知する必要があります。クライアントは、ObServer Generic インタフェース シグナル OnNotify() をリッスンします。

質問: ObServer から指定されたクライアントに (すべてにブロードキャストする代わりに) D-BUS シグナル (OnNotify()) を発信する方法は?

ps

Qt D-BUS はラッピングに使用されますが、どのアプローチも歓迎されます。

4

1 に答える 1

3

できません。信号は、DBusインターフェイスでその信号に登録されているすべてのクライアントによって受信されます。

シグナルにパラメーターを追加OnNotifyしてクライアントで処理するか、クライアントごとに個別のシグナルを作成することができます。ただし、このコンポーネントを動的にする(実行時にクライアントを追加する)場合は、最初のアプローチ(パラメーターto OnNotify)を使用する必要があります。

編集:信号に関する詳細情報

信号は次のように定義されます。

DBusのシグナルは、1つのプロセスから他の任意の数のプロセスに送信される単一のメッセージで構成されます。つまり、信号は単方向ブロードキャストです。シグナルには引数(データペイロード)が含まれている場合がありますが、ブロードキャストであるため、「戻り値」はありません。これをメソッド呼び出し(「メソッドの呼び出し-舞台裏」というセクションを参照)と比較してください。メソッド呼び出しメッセージには、一致するメソッド応答メッセージがあります。

信号の発信者(別名送信者)は、信号の受信者についての知識を持っていません。受信者はバスデーモンに登録して、「一致ルール」に基づいてシグナルを受信します。これらのルールには通常、送信者とシグナル名が含まれます。バスデーモンは、各信号を、その信号に関心を示した受信者にのみ送信します。

元のソース

編集:ドミトリーのコメントに照らして回答を更新しました。

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バインディングを変更できる場合は、そのような操作を行うことができます:)。

于 2012-06-13T19:59:09.527 に答える