2010-03-05 9 views
7

Me gustaría crear un cliente XMPP simple en Java que comparta su ubicación (XEP-0080) con otros clientes. Ya sé que puedo usar la biblioteca smack para XMPP y que es compatible con PEP, que es necesaria para XEP-0080. ¿Alguien tiene un ejemplo de cómo implementar este o cualquier punteros, no encuentro nada usando Google.XEP-0080 Ubicación del usuario en la Biblioteca Smack

gracias de antemano.

Respuesta

7

Kristof tiene razón, los documentos son escasos, pero están mejorando. Sin embargo, hay un conjunto bueno, pero difícil de encontrar, de extensiones. El PubSub uno está en http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html.

Después de ir desde cero a la ruta del proveedor de IQ personalizado con una extensión, encontré que era más fácil hacerlo usando los gerentes tanto como sea posible. Los desarrolladores que escribieron los gerentes han abstraído muchos de los puntos de dolor.

Ejemplo (versión modificada para la geoloc de uno rcollier escribió en el foro 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 al menos esa es la forma más dura :). Acaba de recordar que hay una PEPManager ahora ...

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

Se necesitaría para escribir las clases GeoLocProvider y geoloc.

+0

¿dónde puedo encontrar esta clase 'TuneProvider' y' Tune' en smack o asmack? – Hunt

+1

El ejemplo es de la documentación de smack. No estoy seguro de qué implementación de XEP-0118 también se están refiriendo, ya que Smack aún tiene un error abierto para agregar compatibilidad con XEP-0118, última actualización en mayo de 2011. Había improvisado mi propia versión para un experimento, pero no tener el código más. Lo lanzaría de nuevo, pero no tengo tiempo. Ahora hay un buen ejemplo de cómo crear su propia extensión de PEPItem y publicar un elemento aquí: http://oneminutedistraction.wordpress.com/2010/08/26/. Eso simplemente deja la parte de análisis sintáctico (en TuneProvider, un proveedor de PEP). –

+0

Estoy usando smack 4.2.0 y no puedo encontrar PEPProvider? – umerk44

0

Eche un vistazo al código existente para implementaciones de otras extensiones. Este será su mejor ejemplo de cómo desarrollarse con la biblioteca actual. Desafortunadamente, no hay una guía de desarrolladores que yo sepa, así que solo busqué entender algunos de los conceptos básicos hasta que me sentí cómodo con el medio ambiente. Sugerencia: use la función de extensión de proveedores para agregar proveedores personalizados para las stanzas específicas de extensión.

Puede hacer preguntas en el developer forum para Smack, y contribuya con su código al proyecto desde aquí también. Si produces una implementación de esta extensión, entonces podrías obtener privilegios de commit tú mismo si lo deseas.

+0

Antes que nada, gracias por la respuesta rápida. ¿Sabes también dónde puedo encontrar tales implementaciones? – Kristof

+0

Todos son parte de la base de código Smack existente aquí (para el acceso svn) svn co http://svn.igniterealtime.org/svn/repos/smack/trunk smack o puede navegar en línea aquí http: //www.igniterealtime .org/fisheye/viewrep/svn-org/smack – Robin

Cuestiones relacionadas