2010-03-05 21 views
7

我想在java中創建一個簡單的XMPP客戶端,與其他客戶端共享其位置(XEP-0080)。 我已經知道我可以使用XMPP的smack庫,並且它支持XEP-0080所需的PEP。 有沒有人有一個例子如何實現這個或任何指針,我沒有發現任何使用谷歌。XEP-0080 Smack Library中的用戶位置

在此先感謝。

回答

7

克里斯托夫的權利,文件是稀疏的 - 但他們正在變得更好。儘管很難找到一套很好的擴展文檔。 PubSub之一在http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html

在從頭開始自定義IQ提供程序路由和擴展後,我發現使用管理器儘可能簡單地執行它。寫這些經理的開發人員已經將很多痛苦點都抽象出來了。

例(一個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類。

+0

我可以在哪裏找到這個'TuneProvider'和'Tune'類的單詞或asmack? – Hunt 2012-07-31 05:25:21

+1

該示例來自smack文檔。不知道他們提到的XEP-0118的實施方式,因爲Smack仍然有一個開放的bug來添加XEP-0118支持,最後更新於2011年5月。 我已經拼湊了我自己的版本進行實驗,但沒有有了代碼了。我會再次把它放在一起,但沒有時間。現在有一個很好的例子來創建你自己的PEPItem的擴展並在這裏發佈一個項目:http://oneminutedistraction.wordpress.com/2010/08/26/。這只是離開了解析部分(在TuneProvider中,一個PEPProvider)。 – 2012-08-04 16:04:29

+0

我正在使用smack 4.2.0,我無法找到PEPProvider? – umerk44 2017-09-13 10:27:57

0

查看其他擴展實現的現有代碼。這將是您如何與當前圖書館共同開發的最佳範例。不幸的是,我沒有任何開發者指南,所以我只是自己去了解一些基本知識,直到我對環境感到滿意爲止。提示:使用提供商擴展工具爲擴展特定部分添加自定義提供商。

您可以在developer forum上提問Smack的問題,並將代碼返回到此處的項目中。如果你生成了這個擴展的實現,那麼你可以自己獲得提交權限,如果你想要的話。

+0

首先,感謝您的快速回答。你是否也知道我可以在哪裏找到這樣的實現? – Kristof 2010-03-05 16:39:17

+0

它們都是現有Smack代碼庫的一部分(用於svn訪問)svn co http://svn.igniterealtime.org/svn/repos/smack/trunk smack或者您可以在這裏在線瀏覽http://www.igniterealtime .org/fisheye/viewrep/svn-org/smack – Robin 2010-03-05 18:13:20