2010-11-19 3 views
2

Ich habe eine XMPP-Anwendung, wo zwei Clients interagieren (1) ein Bot mit Smack programmiert (Scala/Java) und (2) ein GUI-Chat-Client in strophe programmiert (Javascript).beste Möglichkeit, benutzerdefinierte XML-Elemente in XMPP auszutauschen?

Die App muss benutzerdefinierten XML austauschen (zum Beispiel wie unten dargestellt)

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

Was ist der beste Weg, um Daten auszutauschen? Im Folgenden sind, was ich tun konnte mit:

1) individuelle XMPP Strophen

2) Einbetten meine XML in derzeit definierten Strophen (zB in Mitteilung oder iq)

3) Für klatschen sie, use the Message.get(set)Property to read/write custom data.

Nr. 3) ist ausgeschlossen, weil es erfordert, dass beide Clients Java-Objekte verstehen und die gleiche Bibliothek (Smack) verwenden.

Bitte weisen Sie mich auf andere Fragen zu dem gleichen Thema.

[EDIT:] Nach einigen Recherchen fand ich, dass Dataforms (XEP-0004) der einfachste Weg ist, es zu tun, sofern Ihre Bibliothek es unterstützt.

+2

Senden Sie benutzerdefinierte XML-Daten von Ihrem Client mit dem untergeordneten Element in den jeweiligen XMPP-Zeilengruppen mit Ihrem eigenen Namespace. Z.B. .... Solche Strophen werden wiederum von Ihrem Client-Bot ohne weitere Konfigurationsanforderungen empfangen. –

+0

Danke für den Kommentar. Ich entschied mich schließlich, das untergeordnete Element mit Datenformularen zu verwenden. – Jus12

+0

Ich fand den harten Weg, dass Datenformate (XEP-004) nicht vollständig in Smack ist. Es ist besser, eine benutzerdefinierte Codierung zu verwenden (z. B. JSON in einer Nachrichtenzeilengruppe). Das haben wir überall gemacht. – Jus12

Antwort

3

Das hängt weitgehend davon ab, wie die Daten verwendet werden. Meine Faustregel ist, dass wenn ich Schlüssel-Wert-Paare (einfache Daten) nur umherließe, würde ich für die Eigenschaft-Funktion in Smack gehen. Die Eigenschaftenfunktion kann jedoch nur in Nachricht verwendet werden. Aus irgendeinem Grund verwendet die Eigenschaftserweiterung nicht die Smack-Provider-Architektur, sondern ihre in Packet und PacketParserUtils fest codierte Klasse. Also wenn Sie es nicht in IQ- oder Presence-Paketen wiederverwenden können.

Wenn Sie mehr als ein Schlüssel/Wert-Paar verwenden möchten, sollten Sie einen Anbieter für Ihre benutzerdefinierte Zeilengruppe schreiben. Es ist ein wenig Arbeit, aber sobald Sie das Marshalling/Unmarshalling implementiert haben, funktioniert Ihre benutzerdefinierte Zeilengruppe praktisch überall im Smack-Framework. Siehe Smacks provider architecture für Details.

Ich habe Blog über Schreiben Anbieter in einem meiner post. Es ist nicht das Hauptvertrauen des Posts, aber ich hoffe, es ist auch hilfreich für Sie.

+0

Danke für die Antwort. Ich denke, die Smack-Eigenschaft ist auf nur Smack-Code beschränkt, also ist das keine gute Option. Ich überprüfe die Provider-Architektur für die Implementierung eigener Zeilengruppen. Der Blogeintrag ist nützlich. – Jus12

Verwandte Themen