2010-03-05 16 views
7

Vorrei creare un semplice client XMPP in java che condivida la sua posizione (XEP-0080) con altri client. So già che posso usare la libreria smack per XMPP e che supporta PEP, che è necessaria per XEP-0080. Qualcuno ha un esempio su come implementare questo o altri puntatori, non trovo nulla usando google.XEP-0080 Posizione utente nella Libreria Smack

grazie in anticipo.

risposta

7

Kristof ha ragione, i documenti sono scarsi, ma stanno migliorando. Però c'è un buon, anche se difficile da trovare, un insieme di documenti sulle estensioni. Il PubSub è http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html.

Dopo aver eseguito il percorso del provider IQ personalizzato da zero con un'estensione, ho scoperto che era più semplice farlo utilizzando i gestori il più possibile. Gli sviluppatori che hanno scritto i responsabili hanno sottratto un sacco di punti dolenti.

Esempio (versione modificata-per-geoloc di uno rcollier ha scritto sul 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); 

O almeno questo è il modo più duro :). Appena ricordato c'è un PEPManager ora ...

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); 

Avresti bisogno di scrivere le classi GeoLocProvider e GEOLOC.

+0

dove posso trovare questa classe 'TuneProvider' e' Tune' in smack o asmack? – Hunt

+1

L'esempio è dalla documentazione di smack. Non sono sicuro di quale implementazione di XEP-0118 si riferiscano anche loro, dato che Smack ha ancora un bug aperto per aggiungere il supporto XEP-0118, l'ultimo aggiornamento a maggio 2011. Ho messo insieme la mia versione per un esperimento, ma non lo faccio avere il codice più Lo butterei di nuovo insieme ma non ho tempo. Esiste ora un buon esempio di creazione della propria estensione di PEPItem e pubblicazione di un elemento qui: http://oneminutedistraction.wordpress.com/2010/08/26/. Questo lascia solo la parte di parsing (nel TuneProvider, un PEPProvider). –

+0

Sto usando smack 4.2.0 e non riesco a trovare PEPProvider? – umerk44

0

Dai un'occhiata al codice esistente per le implementazioni di altre estensioni. Questo sarà il tuo miglior esempio di come sviluppare con la libreria corrente. Sfortunatamente, non c'è una guida per gli sviluppatori che io conosca, quindi mi sono solo spinto a capire alcune delle nozioni di base fino a quando non mi sono sentito a mio agio con l'ambiente. Suggerimento: utilizzare la funzione di estensione dei provider per aggiungere provider personalizzati per le stanze specifiche dell'estensione.

È possibile porre domande sullo developer forum per Smack e inviare nuovamente il codice al progetto da qui. Se produci un'implementazione di questa estensione, potresti potenzialmente ottenere i privilegi di commit da soli se lo desideri.

+0

Prima di tutto, grazie per questa risposta rapida. Sai anche dove posso trovare tali implementazioni? – Kristof

+0

Sono tutti parte della base di codici Smack esistente qui (per l'accesso svn) svn co http://svn.igniterealtime.org/svn/repos/smack/trunk smack oppure puoi navigare online qui http: //www.igniterealtime .org/fisheye/viewrep/svn-org/smack – Robin