我想在Java中创建一个简单的XMPP客户端,与其他客户端共享他的位置(XEP-0080)。
我已经知道我可以将smack库用于XMPP,并且它支持XEP-0080所需的PEP。
有没有人有一个例子,如何实现这一点或任何指针,我没有找到任何使用谷歌。

提前致谢。

最佳答案

克里斯托夫(Kristof)的权利,博士的人很少-但他们越来越好。尽管有很多关于扩展的文档,但是很难找到。 PubSub一个位于http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html

从头开始使用带有扩展名的自定义IQ Provider路由后,我发现使用管理器可以更轻松地完成此任务。编写经理的开发人员已经消除了很多痛苦点。

示例(在Smack论坛上写的一个rcollier的针对地球的修改版本):

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类。

10-08 05:42
查看更多