2010-03-05 5 views
7

Ich möchte einen einfachen XMPP-Client in Java erstellen, der seinen Standort (XEP-0080) mit anderen Clients teilt. Ich weiß bereits, dass ich die Smack-Bibliothek für XMPP verwenden kann und dass es PEP unterstützt, das für XEP-0080 benötigt wird. Hat jemand ein Beispiel, wie man diesen oder irgendwelche Zeiger implementiert, finde ich nichts, das google verwendet.XEP-0080 User Location in Smack Bibliothek

danke im voraus.

Antwort

7

Kristof hat recht, die Docs sind spärlich - aber sie werden besser. Es gibt eine gute, wenn auch schwer zu findende Zusammenstellung von Dokumenten zu Erweiterungen. Der PubSub ist unter http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html.

Nachdem ich die benutzerdefinierte IQ-Provider-Route von Anfang an mit einer Erweiterung durchlaufen hatte, stellte ich fest, dass es einfacher war, die Manager so oft wie möglich zu verwenden. Die Entwickler, die den Managern geschrieben haben, haben viele der Schmerzpunkte abstrahiert.

Beispiel (modifizierte-for-Geoloc Version eines rcollier schrieb am Forum Smack):

ConfigureForm form = new ConfigureForm(FormType.submit); 
form.setPersistentItems(false); 
form.setDeliverPayloads(true); 
form.setAccessModel(AccessModel.open); 

PubSubManager manager 
     = new PubSubManager(connection, "pubsub.communitivity.com"); 
Node myNode = manager.createNode("http://jabber.org/protocol/geoloc", form); 

StringBuilder body = new StringBuilder(); //ws for readability 
body.append("<geoloc xmlns='http://jabber.org/protocol/geoloc' xml:lang='en'>"); 
body.append(" <country>Italy</country>"); 
body.append(" <lat>45.44</lat>"); 
body.append(" <locality>Venice</locality>"); 
body.append(" <lon>12.33</lon>"); 
body.append(" <accuracy>20</accuracy>"); 
body.append("</geoloc>"); 

SimplePayload payload = new SimplePayload(
           "geoloc", 
           "http://jabber.org/protocol/geoloc", 
           body.toString()); 
String itemId = "zz234"; 
Item<SimplePayload> item = new Item<SimplePayload>(itemId, payload); 

// Required to recieve the events being published 
myNode.addItemEventListener(myEventHandler); 

// Publish item 
myNode.publish(item); 

Oder zumindest, dass die harte Art und Weise ist :). Nur in Erinnerung gibt es jetzt einen PEPManager ...

PEPProvider pepProvider = new PEPProvider(); 
pepProvider.registerPEPParserExtension(
    "http://jabber.org/protocol/tune", new TuneProvider()); 
ProviderManager.getInstance().addExtensionProvider(
    "event", 
    "http://jabber.org/protocol/pubsub#event", pepProvider); 
Tune tune = new Tune("jeff", "1", "CD", "My Title", "My Track"); 
pepManager.publish(tune); 

Sie müssen die GeoLocProvider und Geoloc Klassen schreiben.

+0

Wo finde ich diese 'TuneProvider'- und' Tune'-Klasse in Smack oder Asmack? – Hunt

+1

Das Beispiel stammt aus der Smack-Dokumentation. Nicht sicher, welche Implementierung von XEP-0118 sie auch beziehen, da Smack immer noch einen offenen Fehler hat, XEP-0118 Unterstützung hinzuzufügen, letzte Aktualisierung im Mai 2011. Ich hatte meine eigene Version für ein Experiment zusammengeschustert, aber nicht Habe den Code mehr. Ich würde es wieder zusammenwerfen, aber ich habe keine Zeit. Es gibt jetzt ein gutes Beispiel für das Erstellen einer eigenen Erweiterung von PEPItem und das Veröffentlichen eines Elements hier: http://oneminutedistraction.wordpress.com/2010/08/26/. Damit bleibt nur der Parsing-Teil (im TuneProvider, ein PEPProvider). –

+0

Ich verwende Smack 4.2.0 und kann PEPProvider nicht finden? – umerk44

0

Werfen Sie einen Blick auf den vorhandenen Code für Implementierungen anderer Erweiterungen. Dies ist Ihr bestes Beispiel für die Entwicklung mit der aktuellen Bibliothek. Leider gibt es keinen Leitfaden für Entwickler, den ich kenne, also habe ich nur herumgestöbert, um einige der Grundlagen selbst zu verstehen, bis ich mich mit der Umgebung wohl fühlte. Tipp: Verwenden Sie die Providererweiterungsfunktion, um benutzerdefinierte Provider für die erweiterungsspezifischen Zeilengruppen hinzuzufügen.

Sie können Fragen zu der developer forum für Smack stellen und Ihren Code von hier aus zurück zum Projekt beitragen. Wenn Sie eine Implementierung dieser Erweiterung erstellen, können Sie möglicherweise selbst Commit-Berechtigungen erhalten, wenn Sie dies wünschen.

+0

Zunächst einmal, danke für diese schnelle Antwort. Weißt du auch, wo ich solche Implementierungen finden kann? – Kristof

+0

Sie sind alle Teil der vorhandenen Smack Codebase hier (für svn Zugriff) svn http://svn.igniterealtime.org/svn/repos/smack/trunk smack oder Sie können online hier http suchen: http://www.igniterealtime .org/fisheye/viewrep/svn-org/smack – Robin

Verwandte Themen