2010-11-19 10 views
2

J'ai une application XMPP où deux clients interagissent (1) un bot programmé avec Smack (Scala/Java) et (2) un client de chat GUI programmé en strophe (Javascript).meilleur moyen d'échanger des éléments XML personnalisés dans XMPP?

L'application a besoin d'échanger XML personnalisés (par exemple, comme indiqué ci-dessous)

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

Quelle est la meilleure façon d'échanger des données? Voici ce que je pouvais venir avec:

1) coutume XMPP strophes

2) Incorporer mon XML en strophes actuellement définis (par exemple, dans un message ou iq)

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

n ° 3) est exclue car elle nécessite que les deux clients comprennent les objets Java et utilisent la même bibliothèque (Smack).

Veuillez me diriger vers d'autres questions traitant du même problème. Après avoir fait quelques recherches, j'ai trouvé que Dataforms (XEP-0004) est le moyen le plus facile de le faire, à condition que votre bibliothèque le supporte.

+2

Envoyez des données XML personnalisées à partir de votre client à l'aide de l'élément enfant dans les strings XMPP respectifs avec votre propre espace de noms. Par exemple. .... Cette strophe sera à son tour reçue par votre client bot sans aucun autre besoin de configuration. –

+0

Merci pour le commentaire. J'ai finalement décidé d'utiliser l'élément enfant avec des formes de données. – Jus12

+0

J'ai trouvé à la dure que les données (XEP-004) ne sont pas complètement complètes dans smack. Il est préférable d'utiliser un codage personnalisé (par exemple, JSON dans une strophe de message). C'est ce que nous avons fini par faire partout. – Jus12

Répondre

3

Cela dépend en grande partie de la façon dont les données vont être utilisées. Ma règle de base est que si je ne fais que passer autour de paires clé-valeur (données simples) alors je voudrais aller à la fonctionnalité de propriété dans Smack. Mais la propriété ne peut être utilisée que dans Message. Pour une raison quelconque, l'extension de propriété n'utilise pas l'architecture du fournisseur de Smack, mais elle est codée en dur dans les classes Packet et PacketParserUtils. Donc, si vous ne pouvez pas le réutiliser dans les paquets IQ ou Presence.

Si vous souhaitez utiliser autre chose qu'une paire valeur/clé, vous devez écrire un fournisseur pour votre section personnalisée. C'est un peu de travail mais une fois que vous avez implémenté le marshalling/unmarshalling, votre strophe personnalisée fonctionne à peu près partout dans le framework Smack. Voir Smacks provider architecture pour plus de détails.

J'ai écrit un blog sur le fournisseur d'écriture dans l'un de mes post. Ce n'est pas la confiance principale de la poste, mais j'espère que vous trouverez également utile.

+0

Merci pour la réponse. Je pense que la fonction de propriété Smack est limitée au code Smack-only, donc ce n'est pas une bonne option. Je vais vérifier l'architecture du fournisseur pour implémenter ses propres strophes. L'entrée de blog est utile. – Jus12

Questions connexes