2010-11-19 43 views
2

我有一個XMPP應用程序,其中兩個客戶端交互(1)用Smack(Scala/Java)編程的bot和(2)在strophe(Javascript)中編程的GUI聊天客戶端。在XMPP中交換自定義XML元素的最佳方式?

應用程式需要更換自定義XML(例如,如下圖所示)

<myPacket> 
    <response type='sensorData'> 
     <temperature units='Kelvin'> 
     234 
     </temperature> 
    </response> 
</myPacket> 

什麼是交換數據的最佳方式?以下是我能想出:

1)編寫自定義XMPP節

2)嵌入我的XML在當前定義的節(例如,在消息或IQ)

3)嫌, use the Message.get(set)Property to read/write custom data

No. 3)被排除,因爲它要求兩個客戶端都理解Java對象並使用相同的庫(Smack)。

請指點我解決同一問題的任何其他問題。

[編輯:]在做了一些研究後,我發現Dataforms(XEP-0004)是最簡單的方法,只要你的庫支持它。

+2

使用您自己的名稱空間在各個XMPP節中使用子元素,從客戶端發送自定義xml數據。例如。 ...。這樣的節將反過來被你的客戶端機器人接收而沒有任何其他配置需求。 – 2010-11-19 07:05:24

+0

感謝您的評論。我最終決定使用帶有數據表單的子元素。 – Jus12 2010-12-14 19:21:46

+0

我發現數據表單(XEP-004)在smack中並不完全完整。最好使用自定義編碼(例如,消息節中的JSON)。這就是我們到處都在做的事情。 – Jus12 2012-09-20 00:50:10

回答

3

這在很大程度上取決於數據將如何使用。我的經驗法則是,如果我只傳遞鍵值對(簡單數據),那麼我會去Smack中的屬性功能。但屬性功能只能用於消息。由於某些原因,該屬性擴展程序不使用Smack的提供程序架構,但其硬編碼爲PacketPacketParserUtils類。所以如果你不能在IQ或Presence數據包中重用它。

如果您打算使用更多的鍵值對,那麼您應該爲您的自定義節編寫一個提供程序。這是一項工作,但是一旦你實現了編組/解編,那麼你的自定義節在Smack框架中的任何地方都可以工作。細節見Smacks provider architecture

我的博客寫作提供者在我的post之一。這不是帖子的主要信任,但希望你也發現它有幫助。

+0

感謝您的回答。我認爲Smack屬性功能僅限於Smack-only代碼,所以這不是一個好的選擇。我將檢查提供者架構以實現自己的節。博客條目很有用。 – Jus12 2010-11-23 17:42:51

相關問題