XAP et UDP

Bonjour, après de longue recherche, j'ai trouvé une librairie pour envoyer des messages UDP. J'en ai besoin pour envoyer l'état de l'arduino par message XAP sur le réseau.
Ca marche! mais pas longtemps... :-/
L'arduino envoi 13 messages puis silence complet. Après un reset il repart pour 13 messages. Si je diminue le message à envoyer j'arrive à envoyer 14 messages.
Je pense à un problème de mémoire qui se remplit mais je ne sais pas comment afficher la quantité de mémoire utilisée.
Je précise tout de même qu'il s'agit de mon premier projet donc c'est sans doute une broutille.
Voici le code:

#include <Ethernet.h>
#include <UdpString.h>
#include <WString.h>

/* UdpSendString.pde: Example how to send packets over UDP using the String library 
 * to check for received packets on Unix-ish setup, execute:
 * sudo tcpdump -A -ien0 "udp port 8000"
 * bjoern@cs.stanford.edu 12/30/2008 */

/* ETHERNET CONFIGURATION 
 * ARDUINO: set MAC, IP address of Ethernet shield, its gateway,
 * and local port to listen on for incoming packets */
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //MAC address to use
byte ip[] = { 192, 168, 10, 177 }; // Arduino's IP address
byte gw[] = { 192, 168, 10, 139 };   // Gateway IP address
int localPort = 8888; //local port to listen on

/* TARGET: set this to IP/Port of computer that will receive
 * UDP messages from Arduino */
byte targetIp[] = { 192, 168, 10, 78};
int targetPort = 3639;

/* Strings hold the packets we want to send */
String asciiString;


void setup() {
  Ethernet.begin(mac,ip,gw);
  UdpString.begin(localPort);
  
  asciiString = "xap-hbeat\n{\nv=13\nhop=1\nuid=FF.3C05:00\nclass=xap-hbeat.alive\nsource=laser.arduino.first\ninterval=60\nport=32772\n}\n";
}



void loop() {
  // send a normal, zero-terminated string.
  UdpString.sendPacket(asciiString,targetIp,targetPort);
  delay(3000);
  
}

Merci de votre aide.

salut,

peux-tu fournir un lien pour récupérer la lib, que je puisse tester chez moi ?
qu'as tu derrière pour récupérer les messages UDP ?

Gromain

Salut, content de trouver ici un membre de "toute la domotique".

Voici ou on peu télécharger la lib:
http://bitbucket.org/bjoern/arduino_osc/src/14667490521f/libraries/
Hier soir j'ai testé avec la commande UdpRaw au lieu de Udp string en envoyant quelques bits au lieu d'une longue chaine et même au bout de 1000 envois ça ne bug pas. Le problème vient sans doute de la fonction UdpString. Je voudrais pourtant envoyer une chaine de caractère.

Le but étant de récupérer les messages d'état des entrées de l'arduino dans le hubXap qui redispatch aux différentes applications domotique. Je suis sur que le problème vient de l'arduino car après 1" envois, la led Tx ne clignote plus.
Je n'y suis pas loin, et je suis persuadé que ce code fini pourrait intéresser beaucoup de monde.

Pour l'instant je ne suis pas assez calé pour décortiquer la lib et trouver ce qui bouffe la mémoire.

Pour installer la lib, il faut simplement ajouter les fichiers nécessaires dans la lib ethernet officielle. (enfin, c'est ce que j'ai compris)

Youpi, j'ai trouvé la réponse sur un site. Il s'agit bien d'un bug de la librairie.
Dans le fichier Wstring.h il faut rajouter une ligne de code:

String(const int length = 16);
String(const char* bytes);
String(const String &str);
~String() { free(_array); } // <--- add this line

Ca permet de libérer la mémoire à chaque utilisation de la class.
Et ça marche!
Je vais pouvoir continuer mon développement.

A+

cool, je met à jour de mon côté également.

j'étais en train de tester chez moi, j'avais le même phénomène.
Pour info, j'ai utilisé Wireshark pour snifer les trames udp.

L'UDP m'intéresse pour faire communiquer plusieurs arduino entre elles. Reste à voir si c'est possible de faire du multicast...

Gromain

Laser.

quel shield ethernet utilises-tu ?
un shield officiel (ou équivalent) qui gère en hardware le tcp/ip, ou un shield nécessitant une lib pour gérer le tcp/ip ?

Gromain

Je pense que c'est l'officiel. Il est à base de W5100.
Dessus c'est écrit DFRduino DFROBOT www.DFRobot.com

Salut,

Si je ne me trompe pas, il est conseillé d'avoir un hubXAP sur chaque PC devant utiliser le XAP.
Avez-vous un hubXAP pour Arduino ?

Autre question, auriez-vous un exemple de code pour réceptionner un message XAP ?

Merci de vos réponses

Salut,

je m'interesse depuis peu à XAP, mais surtout à xPL (j'ai trouvé davantage de ressources sur ce sujet). Les deux protocoles sont très proches.
Il me semble que Laser a fait quelque chose pour l'envoi d'un message XAP sur évênement (changement d'état d'une entrée).
Par contre, pour la réception et surtout le décodage d'un message XAP, il n'y a rien. Je pense qu'il faut utiliser la lib UDP et s'inspirer d'un exemple de décodage d'XML.
Pour le hubXAP/XPL, il n'en existe pas (encore?) sous la forme d'arduino. Mais je ne pense pas que ce soit nécessaire dans le cas d'un réseau XAP/XPL constitué uniquement d'arduino: le message étant envoyé sur une adresse broadcoast du routeur, celui-ci la renvoie à tous les arduino connectées. Le hub devient indispensable dès qu'il s'agit d'interconnecter différents dispositif hardware (arduino, RFXCom...) ou logiciels (module météo sur le net...) entre eux.
Il y a pas mal de personnes intéressées sur le forum "touteladomotique" (TouteLaDomotique.com : la maison connectée au meilleur prix) et qu'il y a moyen d'arriver à faire quelque chose de bien sur ce sujet.

Gromain

merci pour ces informations. :slight_smile:

Ton choix xPL est surtout fait par rapport aux ressources ou y a-t-il une autre raison ?

Concernant le routeur, il connait la liste des arduino connectées grâce aux envois de message régulier de ces dernières.
C'est bien ça ?

Salut, un hub Xap n'est utile que si il y a plusieurs application sur la même machine. En fait il sert à partager le port 3639 UDP. Sans Hub un seul programme ouvrirait le port et dialoguerait. Les autres se mettraient en erreur.
Ca ne concerne donc pas l'arduino. Car nous avons un programme pour un port.
Concernant l'envoi et la réception des messages XAP j'ai réussi à faire pour l'instant 2 sketch séparés qui fonctionnent. J'en ai posté sur sur le forum de toute la domotique (lien posté par Gromain).
Je pense poster l'autre bientôt et surtout refaire des tests en regroupant les 2 dans un même sketch.
Gromain, je viens de lire ton idée de décodage XML, à mon avis ça peut être pas mal et surtout beaucoup plus propre que ce que j'ai fait pour mes tests actuels.

Allez courage, on va y arriver! :wink:

à mon avis, le code a peut-être plus sa place dans ce forum. La publication d'un code plus aboutit pourrait se faire également sur touteladomotique.
Je ne peux pas faire de test pour le moment, je n'ai pas de shield ethernet sous la main en ce moment et comme les beaux jours arrivent, on m'a un peu fixé d'autre priorité à la maison lol.
Je pourrais passer par la liaison série, mais je ne sais pas trop comment faire pour recevoir une commande d'un hub XAP par ce canal.

Je viens de recevoir mon arduino.
L'envoi XAP fonctionne à merveille :wink:

merci pour vos infos