Местоположение пользователя XEP-0080 в библиотеке Smack

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

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


person Kristof    schedule 05.03.2010    source источник


Ответы (3)


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

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

Пример (модифицированная для 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.

person Bill Barnhill    schedule 10.03.2010
comment
где я могу найти этот класс TuneProvider и Tune в smack или asmack? - person Hunt; 31.07.2012
comment
Пример взят из smack-документации. Не уверен, какую реализацию XEP-0118 они также имеют в виду, поскольку в Smack все еще есть открытая ошибка для добавления поддержки XEP-0118, последнее обновление в мае 2011 года. Я собрал свою собственную версию для эксперимента, но у меня нет код больше. Собрал бы еще раз, но нет времени. Вот хороший пример создания собственного расширения PEPItem и публикации элемента здесь: oneminutedistraction. wordpress.com/2010/08/26 . Это просто оставляет часть синтаксического анализа (в TuneProvider, PEPProvider). - person Bill Barnhill; 04.08.2012
comment
Я использую smack 4.2.0 и не могу найти PEPProvider? - person umerk44; 13.09.2017

Я подробно описал подход, основанный на чистом PEP, в качестве альтернативного метода для Android здесь: .

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

person dbotha    schedule 03.11.2014

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

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

person Robin    schedule 05.03.2010
comment
Прежде всего, спасибо за этот быстрый ответ. Вы также знаете, где я могу найти такие реализации? - person Kristof; 05.03.2010
comment
Все они являются частью существующей кодовой базы Smack здесь (для доступа svn) svn co svn. igniterealtime.org/svn/repos/smack/trunk smack или вы можете просматривать онлайн здесь igniterealtime.org/fisheye/viewrep/svn-org/smack - person Robin; 05.03.2010