Расположение пользователя XEP-0080 в библиотеке Smack - PullRequest
7 голосов
/ 05 марта 2010

Я хотел бы создать простой клиент XMPP в Java, который делит свое местоположение (XEP-0080) с другими клиентами. Я уже знаю, что могу использовать библиотеку smack для XMPP и что она поддерживает PEP, который необходим для XEP-0080. У кого-нибудь есть пример, как реализовать этот или любые указатели, я не нахожу ничего с помощью Google.

спасибо заранее.

Ответы [ 3 ]

8 голосов
/ 10 марта 2010

Кристоф прав, документы скудны, но они становятся лучше. Тем не менее, есть хороший, хотя трудно найти, набор документов по расширениям. PubSub один находится в http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html.

Пройдя с нуля маршрут собственного провайдера IQ с расширением, я обнаружил, что это проще сделать с помощью менеджеров, насколько это возможно. Разработчики, которые написали менеджеры, абстрагировались от множества болевых точек.

Пример (модифицированная для geoloc версия одного rcollier, написанного на форуме 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);

Или, по крайней мере, это трудный путь :). Только что вспомнил, что сейчас есть PEPManager ...

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

Вам нужно написать классы GeoLocProvider и GeoLoc.

1 голос
/ 03 ноября 2014

Я подробно описал подход, основанный исключительно на PEP, как альтернативный метод для Android: https://stackoverflow.com/a/26719158/406920.

Это будет очень близко к тому, что вам нужно делать с обычным Smack.

0 голосов
/ 05 марта 2010

Взгляните на существующий код для реализации других расширений.Это будет вашим лучшим примером того, как развиваться с текущей библиотекой.К сожалению, я не знаю ни одного руководства для разработчиков, поэтому я просто начал разбираться с некоторыми основами, пока не почувствовал себя комфортно в этой среде.Подсказка: используйте средство расширения провайдеров для добавления пользовательских провайдеров для отдельных разделов расширения.

Вы можете задавать вопросы на форуме разработчиков для Smack и добавлять свой код обратно в проект здесьтакже.Если вы создадите реализацию этого расширения, вы можете получить привилегии коммитов самостоятельно, если захотите.

...