Bonjour, je coule...
J'utilise arduino 1.0 et essaye d'utiliser le code de http://blog.weeboo.net/tutoriel-arduino-ethernet-shield-controler-led-depuis-une-page-web/
J'arrive bien à envoyer ma valeur vers l'arduino mais je ne trouve pas comment récupérer une trame depuis l'arduino... En gros sa réponse... En fait, j'ai besoin d'avoir un échange (bi directionel) entre ma page et mon arduino avant chaque "parcage" pour envoi vers le client.
En gros:
Le client fait appel à ma page phpsur mon serveur apache locilisé sur mon pc (easyphp par exemple)
mon serveur php (la "page") envoie des données à l'arduino (par exemple il est 21H49), l'arduino récupère cette donnée, la traite (par exemple met à l'heure un DS1307...) et retourne des données (par exemple la température mesurée sur une thermistance et confirme l'heure=> 21H49 vers le serveur php.
Ce dernier met en forme les données (par exemple les intègre en base de données et affiche ces dernieres (par exemple un graph avec les dernières consultations heures et températures relev&es à partir de la base de donnée...
Ce n'est qu'un exemple évidement....
Comme vous pouvez le comprendre, je tiens à une communication bi-directionelle entre mon serveur php et l'arduino, je ne veux pas que ce dernier génère la page car j'ai des besoins de graphismes dans mon projet et souhaite intégrer d'autres données et j'ai besoins de pouvoir envoyer des données à l'arduino pour modifier certaines de ses variables...
voici le code de ma partie php:
Code:
if (isset($_POST['envoyer'])){
$valeur_led = $_POST["led1"]; // récupération de la valeur transmise en méthode POST
$host="192.168.1.30"; // Adresse ip défini dans le code arduino
$port=8888; // Port défini dans le code arduino
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_sendto($socket, $valeur_led , strlen($valeur_led), 0, $host, $port);
/*$result = socket_bind($socket, $host, $port) ;//or die("Could not bind to socket\n");
echo "Socket Open OK
\n";
$tt=0;
while($tt<20){ // Lire les données 20 caracteres :
$input = socket_read($socket,20);
$tt++;
}
echo 'Message reçu : ' . stream_socket_recvfrom($socket, 15) . '
';
*/
socket_close($socket);
}
echo"retour POST=".$valeur_led."longueur=".strlen($valeur_led)."
";
$valeur_led=125;//ré initialisation par default pour le formulaire html
mon code ino:
Code:
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 30); //ip arduino
unsigned int localPort = 8888; // port de communication arduino
// buffers RX TX en UDP (24 par defaut??)
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;
void setup() {
// start the Ethernet and UDP:
Ethernet.begin(mac,ip);
Udp.begin(localPort);
Serial.begin(9600);
}
void loop() {
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());
memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);//permet de vider le buffer
// lecture du buffer reception
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
Serial.println("Contents:");
Serial.println(packetBuffer);
// envoi d'une réponse à la trame udp reçu
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();
}
delay(5);
}
Ma premiere question, remarque/probleme est le port affiché dans la console série , il varie en permanence...
voici quelques exemples:
Code:
Received packet of size 3
From 192.168.1.50, port 54964
Contents:
160
Received packet of size 3
From 192.168.1.50, port 58487
Contents:
125
Received packet of size 1
From 192.168.1.50, port 58488
Contents:
1
ma deuxième question est comment récupérer la trame envoyée par l'arduino? Ici "acknowledged"
Dans mon code php, si je laisse les parties contenant la lecture du buffer de réception, j'obtient systématiquement une erreur "Could not bind to socket"
raison pour laquelle j'ai commenté cette partie du code... en gros je suis perdu dans la partie réception php....
J'ai regardé aussi ce qui est fait sur http://www.jfkreuter.com/?p=9 mais cela ne me convient pas car l'on est obligé de passer par l'arduino pour attaquer ensuite le php et cela n'est pas directionnel...
Pour éviter les problèmes de routage, je travail en câble direct sur mon pc avec les 2 machines en ip fixe arduino 192 168 1 30 et serveur apache 192 168 1 50 (easyphp 5.4 avec extension php_sockets activée)
voili voilà...
Merci d'avance de votre aide...
Mon but est uniquement de pouvoir échanger des info entre l'arduino et mon serveur php, je verrais ensuite à utiliser ces données pour représenter des entrées/capteur ou des consignes pour l'arduino.
Mon post est légèrement long... j'espère que certains aurront la patience de le lire..;
@++