7

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

提前致谢。

4

3 回答 3

8

Kristof 是对的,医生很少 - 但他们正在变得更好。尽管很难找到,但有一组关于扩展的很好的文档。PubSub 位于http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html

在使用扩展从头开始定制 IQ Provider 路线后,我发现尽可能使用管理器更容易做到这一点。编写管理器的开发人员已经抽象出很多痛点。

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

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

于 2010-03-10T17:02:46.337 回答
1

我在这里详细介绍了一种基于 PEP 的纯 PEP 方法作为 Android 的替代方法:https ://stackoverflow.com/a/26719158/406920 。

这将非常接近您需要使用常规 Smack 执行的操作。

于 2014-11-03T17:11:47.593 回答
0

查看现有代码以实现其他扩展。这将是您如何使用当前库进行开发的最佳示例。不幸的是,没有我所知道的开发人员指南,所以我只是自己摸索了解一些基础知识,直到我对环境感到满意为止。提示:使用提供者扩展工具为扩展特定节添加自定义提供者。

您可以在 Smack 的开发者论坛上提问,也可以从这里将您的代码回馈给项目。如果您生成此扩展的实现,那么如果您愿意,您可能会自己获得提交权限。

于 2010-03-05T15:24:13.773 回答