Pergunta

Gostaria de criar um cliente XMPP simples em Java que compartilha sua localização (XEP-0080) com outros clientes. Eu já sei que posso usar a biblioteca Smack para XMPP e que ele suporta o PEP, necessário para o XEP-0080. Alguém tem um exemplo de como implementar este ou quaisquer indicadores, não encontro nada usando o Google.

desde já, obrigado.

Foi útil?

Solução

O direito de Kristof, os médicos são escassos - mas estão melhorando. Há um conjunto bom, embora difícil de encontrar, de documentos em extensões. O pubsub um está em http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html.

Depois de seguir a rota do provedor de QI personalizada do Scratch com uma extensão, achei mais fácil fazê -lo usando os gerentes o máximo possível. Os desenvolvedores que escreveram os gerentes abstraíram muitos pontos problemáticos.

Exemplo (versão modificada para o geoloc de um rcollier escreveu no fórum 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);

Ou pelo menos essa é a maneira mais difícil :). Acabei de lembrar que há um Pepmanager agora ...

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

Você precisaria escrever as classes GeolocProvider e Geoloc.

Outras dicas

Cobri uma abordagem pura baseada em PEP como um método alternativo em detalhes para o Android aqui: https://stackoverflow.com/a/26719158/406920.

Isso será muito próximo do que você precisaria fazer com o Smack regular.

Dê uma olhada no código existente para implementações de outras extensões. Este será o seu melhor exemplo de como desenvolver com a biblioteca atual. Infelizmente, não existe um guia de desenvolvedores que eu conheço, então eu apenas cutuquei para entender alguns básicos até me sentir confortável com o meio ambiente. Dica: use a instalação de extensão dos provedores para adicionar provedores personalizados para as estrofes específicas da extensão.

Você pode fazer perguntas sobre o fórum de desenvolvedores Para dar um tapa e contribuir com seu código de volta para o projeto daqui também. Se você produzir uma implementação dessa extensão, poderá potencialmente obter privilégios de compromisso, se quiser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top