【问题标题】:XEP-0080 User Location in Smack LibraryXEP-0080 Smack 库中的用户位置
【发布时间】:2011-01-24 03:28:55
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: java xmpp smack pep user-location


    【解决方案1】:

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

    【讨论】:

    • 在哪里可以找到这个 TuneProvider 和 Tune 在 smack 或 asmack 中的类?
    • 示例来自 smack 文档。不确定他们也指的是 XEP-0118 的哪个实现,因为 Smack 仍然有一个开放的错误来添加 XEP-0118 支持,最后一次更新是在 2011 年 5 月。我拼凑了自己的版本进行实验,但没有代码了。我会再把它放在一起,但没有时间。现在有一个很好的例子来创建您自己的 PEPItem 扩展并在此处发布项目:oneminutedistraction.wordpress.com/2010/08/26。剩下的就是解析部分(在 TuneProvider 中,一个 PEPProvider)。
    • 我正在使用 smack 4.2.0,但我找不到 PEPProvider ?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      猜你喜欢
      • 2012-07-25
      • 2015-05-30
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 2016-04-21
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多