Wie erstelle ich einen D-Bus-Service, der dynamisch mehrere Objekte erstellt werden?

StackOverflow https://stackoverflow.com/questions/667760

  •  21-08-2019
  •  | 
  •  

Frage

Ich bin neu in D-Bus (und Python, Doppelschlag!) Und ich versuche, die beste Möglichkeit, um herauszufinden, etwas zu tun, die im Tutorial besprochen wurden.

  

Allerdings ist ein Texteditor   so leicht mehrere Busnamen besitzen könnte   (Beispielsweise in org.kde.KWrite   Zusätzlich zu den allgemeinen Texteditor), haben   mehrere Objekte (vielleicht   / Org / kde / documents / 4352, wo die   Nummer ändert sich entsprechend der   Dokument), und jedes Objekt konnte   implementieren mehrere Schnittstellen, wie zB   org.freedesktop.DBus.Introspectable,   org.freedesktop.BasicTextField,   org.kde.RichTextDocument.

Zum Beispiel, sagen, ich will einen Wrapper um flickrapi zu schaffen, so dass der Dienst eine Handvoll von Flickr-API-Methoden aussetzen kann (zum Beispiel urls_lookupGroup()). Dies ist relativ einfach, wenn ich, dass der Dienst zu übernehmen will, wird immer den gleichen API-Schlüssel werden spezifiziert und die Auth-Informationen werden für alle gleich mit dem Service sein.

Besonders im letzteren Fall kann ich nicht wirklich davon ausgehen, das wahr sein wird.

Auf der Grundlage der Dokumentation oben zitierte, ich gehe davon aus es so etwas wie das sein sollte:

# Get the connection proxy object.
flickrConnectionService = bus.get_object("com.example.FlickrService",
                                         "/Connection")

# Ask the connection object to connect, the return value would be
# maybe something like "/connection/5512" ...
flickrObjectPath = flickrConnectionService.connect("MY_APP_API_KEY",
                                                   "MY_APP_API_SECRET",
                                                   flickrUsername)

# Get the service proxy object.
flickrService = bus.get_object("com.example.FlickrService",
                               flickrObjectPath);

# As the flickr service object to get group information.
groupInfo = flickrService.getFlickrGroupInfo('s3a-belltown')

Also, meine Fragen:

1) Ist dies, wie diese behandelt werden sollte?

2) Wenn ja, wie wird der Dienst wissen, wann der Kunde fertig ist? Gibt es eine Möglichkeit zu erkennen, ob die aktuelle Client-Verbindung, so dass der Dienst Bereinigung seiner dynamisch erstellte Objekte gebrochen hat? Auch, wie würde ich die einzelne Objekte in erster Linie erstellen?

3) Ist dies nicht der Fall ist, wie diese behandelt werden soll, was einige andere Vorschläge zur Durchführung etwas ähnliches?

Ich habe durch eine Reihe von D-Bus-Tutorials und verschiedener Dokumentation lesen und über die am nächsten bin ich gekommen, um zu sehen, was ich suche ist das, was ich oben zitiert. Doch keines der Beispiele schauen, um wirklich etwas zu tun, wie diese so bin ich nicht sicher, wie es weitergehen.

War es hilfreich?

Lösung

1) Meistens ja, ich würde nur eine Sache, in der Verbindungsmethode ändern, wie ich in 2) zu erklären.

2) D-Bus-Verbindungen sind nicht persistent, alles mit Request / Response-Nachrichten erfolgt, wird kein Verbindungszustand, wenn Sie diese in der dritten Objekt implementieren gespeichert, wie Sie mit Ihrem flickerObject tun. Die d-Bus-Objekte in Python-Bindungen sind meist Proxies, die abstrakt die entfernten Objekte, als ob Sie mit ihnen „verbunden“ waren, aber es ist wirklich was tut, sind Nachrichten auf Informationen, die Sie geben bauen basierend auf D-Bus Objektinstanziierung (Objektpfad , Schnittstelle usw.). So kann der Dienst nicht wissen, wann der Client ausgeführt wird, wenn der Client nicht angekündigt mit anderen expliziten Aufruf.

Um unerwartete Client Finalisierung behandeln können Sie ein D-Bus-Objekt in dem Client erstellen und den Objektpfad an den Dienst senden, wenn Anschluss Ihre connect Methode auch einen ObjectPath Parameter akzeptieren ändern. Der Dienst kann hören NameOwnerChanged Signal zu wissen, ob ein Kunde gestorben ist.

Um das einzelne Objekt zu erstellen, müssen Sie nur ein Objekt in dem gleichen Dienst instantiiert, wie Sie mit Ihrer „/ Connection“ zu tun, aber Sie müssen sicher sein, dass Sie einen nicht existierenden Namen verwenden. Sie könnten einen "/ Verbindung / Manager" haben, und verschiedene "/ Verbindung / 1", "/ Verbindung / 2" ...

3) Wenn Sie den Verbindungszustand speichern müssen, haben Sie so etwas zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top