Localização do usuário XEP-0080 na biblioteca Smack
-
24-09-2019 - |
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.
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.