Pages: [1] 2   Go Down
Author Topic: Envoie de données en UDP  (Read 2940 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Mon projet consiste à faire communiquer ma carte Arduino mega 2560 + un Ethernet shield via UDP à un serveur local (qui contient une interface web). Le principe:
envoie d'une information par UDP au serveur lors de l'appui sur le bouton poussoir.
Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

salut,

beau projet  smiley-grin

Gromain
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je suis bloqué au niveau du code donc si quelqu'un a une solution ou un exemple je suis preneur smiley-grin, si possible je peut envoyé le mien.
Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si tu as un shield ethernet officiel (à base de wiznet), alors les exemples fournit avec l'IDE te seront très utiles.
si tu as un shield ethernet à base d'ENC28J60, ce sera un peu plus délicat.
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'utilise un shield ethernet avec Wiznet, voici mon code pour le moment.

Code:
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008
#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, 40);

unsigned int localPort = 8888;      // 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;

// 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

//---- 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


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);
  Serial.begin(8888);
// initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  //---- connexion au serveur distant ----
 Serial.println("Connexion vers serveur en cours...");
 int testConnexion = true;
 if (testConnexion==true);  // si la connexion du client a réussi
  Serial.println("Connexion au serveur reussie");
    Serial.println("Envoi d'une requete HTTP au serveur");
 // Envoi de la requete HTTP au serveur
      Serial.println("GET /? HTTP/1.1"); // mettre donnees pour serveur apres le point interrogation
      Serial.println();
      //---- attente de la réponse du serveur distant ----     
    Serial.println("Attente de la reponse du Serveur");

 Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
   
    Udp.write("label: debut");

    Udp.endPacket();

  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  // check if the pushbutton is pressed.     
    if (buttonState == HIGH);
   
 
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
  delay(10);
}
« Last Edit: November 30, 2012, 08:41:14 am by armando2012 » Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je ne sais pas comment tu vois la communication entre l'arduino et le serveur, mais je pense que tu fais fausse route avec l'UDP et l'HTTP.

Contrairement au TCP/IP, il n'y a pas établissement de connexion entre le client et le serveur.
Donc il faut que ton serveur écoute en permanence sur le port UDP. Ce qui n'est pas vraiment possible avec un serveur php par exemple.

Qu'as-tu coté serveur pour recevoir tes paquets UDP ?

Si c'est un serveur type php, pourquoi ne pas utiliser simplement une connexion TCP/IP ?

Gromain
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

voici ce qu'il y a d'installé sur notre serveur local: http://www.tryphon.eu/fr/blog/2010/02/10/decouverte-interface-pigebox/

quel "exemple" me conseilles-tu d'utiliser ?

Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink

Gromain
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci de ta réponse je vais essayé demain matin avec la commande et je verrais bien le résultat  smiley-lol
Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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();
}
Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ça compile bien mais sur Wireshark il n' y a aucune trame envoyée par l'Arduino. smiley-confuse
Logged

Pages: [1] 2   Go Up
Jump to: