Envoie de données en UDP

Je ne savais même pas qu'un tel serveur pouvait exister ^^

Effectivement il est indiqué qu'une des sources d'événements pouvait provenir d'UDP. Ca veut tout dire et rien dire.
Sans un minimum de documentation technique (protocole...), je ne vois pas comment on peut t'aider :wink:

Gromain

Voilà un peu de documentations technique :
http://wiki.tryphon.eu/pigebox/create-labels-with-rivendell.
http://projects.tryphon.eu/blog/2011/02/28/arduino-used-for-networked-red-button/

cela décrit parfaitement le projet.

sans être entré dans le détail du protocole, il semble que tu as le choix entre TCP/IP et UDP.
Dans le second lien ils disent privilégier l'UDP (question de rapidité).
Donc pas besoin d'en-tête HTTP dans la trame que tu envois, c'est le serveur qui fera la passerelle.
Envoi simplement un texte genre ”label: Diff %t - %a” vers le port udp 9999

Et utilises Wireshark pour vérifier tes paquets de data.

Merci de ta réponse je vais essayé demain matin avec la commande et je verrais bien le résultat XD

attention, je ne dis pas que la chaine de caractères à envoyer est ”label: Diff %t - %a”
Il faut que tu grattes un peu pour savoir ce qui est réellement attendu par ton serveur :wink:

Bon après quelques modifications du programme, aucun changement XD
voici le code actuel:

#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>         
#include <Server.h>
#include <Client.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 0);

unsigned int localPort = 9999;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged";       // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;


//---- tableau de l'adresse IP de la carte Arduino
byte ipLocal[] = { 192,168,1,40 }; // le réseau local a numéro 192.168.1.x
//----- tableau de l'adresse de la passerelle --- 
byte passerelle[] = { 192, 168, 1, 1 }; // l'adresse du PC de connexion à internet ou de la box
//----- tableau du masque de sous réseau 
byte masque[] = { 255, 255, 255, 0 }; // idem masque sous-réseau du PC ou de la box : 255.255.255.0
//---- IP du serveur distant de connexion ---- 
//byte server[] = { 192,168,1,26 }; // pigebox : 192.168.1.26
byte ipServeurDistant[] = { 192,168,1,26 }; // serveur Arduino sur meme reseau local

// un bouton poussoir connecté à la broche 1
    int inPin = 40;
const int buttonPin = 40;     // the number of the pushbutton pin
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  //---- initialise la connexion Ethernet avec l'adresse MAC du module Ethernet, l'adresse IP Locale 
//---- l'adresse IP de la passerelle internet et le masque du réseau local
Ethernet.begin(ipLocal, passerelle, masque);
delay(1000); // donne le temps à la carte Ethernet de s'initialiser

  // start the Ethernet and UDP:
  Ethernet.begin(mac,192, 168, 1, 40);
  Udp.begin(8888);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {

  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  // check if the pushbutton is pressed.     
    if (buttonState == HIGH);
  Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
   
    Udp.write("label: debut");

    Udp.endPacket();
}

euh... c'est un peu light "aucun changement"
ça compile ?
ça envoie correctement ? (cf trame sur le réseau avec wireshark)

ça compile bien mais sur Wireshark il n' y a aucune trame envoyée par l'Arduino. :~

regarde l'exemple UDPSendReceiveString.ino, et tu verras que:

  // start the Ethernet and UDP:
  Ethernet.begin(mac,192, 168, 1, 40);

est foireux.

Il faut donc quelque chose comme:

IPAddress monIP(192, 168, 1, 40); // ip de l'arduino
Ethernet.begin(mac,monIP);

Ensuite:

Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());

n'a pas de sens, puisque dans l'exemple c'est l'information d'IP et port du message reçu. Or tu n'en as pas dans ton cas.

Il faut donc quelque chose comme:

IPAddress remoteIP(192, 168, 1, 177); // ip du serveur
Udp.beginPacket(remoteIP, 9999);

pour lui indiquer quel est l'IP et le port de la cible (ton serveur)

Gromain

je n'avais pas vu, mais tu as 2 fois "Ethernet.begin" dans le setup(). il n'en faut qu'un.
Garde uniquement:

Ethernet.begin(ipLocal, passerelle, masque);

Merci pour la remarque je n'est pas fait attention XD
Toujours aucun changement au niveau de Wireshark. Tout a l'heure j'ai eu quelques trames sur Wireshark ( la source était Arduino.cc et la destination était mon pc en 192.168.1.59 alors qu'elle est censé être 192.168.1.26).

C'est bon la carte Arduino communique avec le serveur :smiley: mais l'action ce fait continuellement, le bouton poussoir n'est pas pris en compte j'ai l'impression.

cool que ça marche.

Pour le bouton, il faut une soit une résistance de pull-up soit une pull-down.

Si tu utilises une pull-up (interne ou externe), alors le niveau sera HIGH quand le bouton n'est pas pressé.

Note que tant que tu appuieras sur le bouton, la trame sera envoyée. Il faudra prévoir un mécanisme soft pour ne prendre en compte qu'une seule fois par appui.

Ok merci, je vais bosser sur la fonction LOW du bouton car je me retrouve avec 10000 repères sur le serveur c'est ennuyant XD

pourrais-tu m'éclairer sur la commande qui va permettre lors de l'appui sur le bouton poussoir, d'envoyer le paquet et d'arrêter l'envoie quand on relâche le bouton. Avec la commande il envoie le paquet 1 fois et ne le renvoie pas si il est pressé une autre fois :roll_eyes:

void loop() {

 
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  // check if the pushbutton is pressed.     
    if (buttonState == HIGH);
 
 IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: debut");
    Udp.endPacket();
     
    if (buttonState == LOW);
     Udp.endPacket();

je pense qu'il n' y a pas de boucle.

il va falloir que tu te mettes au C pour comprendre un minimum ce que tu codes et t'en sortir seul :wink:

Udp.endPacket(); ne fait pas ce que tu penses qu'il fait (Ethernet - Arduino Reference)

Il faut simplement que tu mémorises que tu as envoyé le message, et tu reset le flag une fois le bouton relaché. Si le flag est vrai, alors tu n'envoies pas le message.

boolean memo = false; // variable globale, à placer en tete du code
IPAddress remoteIP(192, 168, 1, 26); // ip du serveur, tu peux le placer en tete du code également

void loop() {

 
	// read the state of the pushbutton value:
	buttonState = digitalRead(buttonPin);

	// check if the pushbutton is pressed et que la commande n'est pas envoyée
	if (buttonState == HIGH &! memo ){ 

		Udp.beginPacket(remoteIP, 9999);
		Udp.write("label: debut");
		Udp.endPacket();
		
		memo=true; // on memorise que la commande a été envoyée
	}

	if (buttonState == LOW){
		memo=false; // on remet à zéro le flag
	};

il est possible que sur appui il envoie plusieurs fois le message à cause de possible rebonds du contact. Dans ce cas temporise un peu avant de relire l'entrée (100ms)

boolean memo = false; // variable globale, à placer en tete du code

void setup() {
  //---- initialise la connexion Ethernet avec l'adresse MAC du module Ethernet, l'adresse IP Locale 
//---- l'adresse IP de la passerelle internet et le masque du réseau local
Ethernet.begin(ipLocal, passerelle, masque);
delay(1000); // donne le temps à la carte Ethernet de s'initialiser

  IPAddress (192, 168, 1, 40); // ip de l'arduino
  
  Udp.begin(8888);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {

 
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  // check if the pushbutton is pressed.     
    if (buttonState == HIGH &! memo);
      {
 
 IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: debut");
    Udp.endPacket();
    memo=true; // on memorise que la commande a été envoyée
      }
  if (buttonState == LOW); {
  memo=false; // on remet à zéro le flag
   delay(100);
  }
 }

toujours le même problême =(

Je pense que le problème vient de ma commande qui ne dit pas à la carte Arduino d'arrêter d'envoyer des paquets quand le serveur en a reçu un. C'est pour cela qu'il en envoie continuellement.

Problème résolue merci à toi Gromain. :smiley: