Pregunta

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 admite PEP, que es necesario para XEP-0080. ¿Alguien tiene un ejemplo de cómo implementar este o cualquier consejo? No encuentro nada usando Google.

gracias de antemano.

¿Fue útil?

Solución

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

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

Ejemplo (versión modificada por-geoloc de un 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 manera difícil :). Acabo de recordar que hay un 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);

Necesitaría escribir las clases GeolocProvider y Geoloc.

Otros consejos

Cubrí un enfoque basado en PEP puro como un método alternativo en detalle para Android aquí: https://stackoverflow.com/a/26719158/406920.

Esto estará muy cerca de lo que necesitaría hacer con un golpe regular.

Eche un vistazo al código existente para las 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 conozca, por lo que simplemente me burlé para comprender algunos de los conceptos básicos hasta que me sentí cómodo con el medio ambiente. Sugerencia: use la instalación de extensión de los proveedores para agregar proveedores personalizados para las estrofas específicas de la extensión.

Puedes hacer preguntas en el Foro de desarrolladores Para Smack, y contribuya con su código al proyecto desde aquí también. Si produce una implementación de esta extensión, entonces podría obtener privilegios de cometido usted mismo si lo desea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top