Go Down

Topic: [EtherCard] Envoyer une requete POST (Read 7845 times) previous topic - next topic

timiti29

Oct 20, 2013, 06:20 pm Last Edit: Oct 20, 2013, 06:24 pm by timiti29 Reason: 1
Bonjour à tous, Je travail actuellement avec un module ethernet breakout board enc28j60 et un arduino MEGA 2560.

je cherche à envoyer des variables par méthode POST à un script PHP.
la méthode GET marche bien mais je préférerais utilisé la méthode POST.

Je dispose du script suivant :

Code: [Select]
#include <EtherCard.h>

static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
char website[] PROGMEM = "192.168.100.22";

boolean x = true;

byte Ethernet::buffer[700];
static uint32_t timer;

static void response_callback (byte status, word off, word len) {
 
 Serial.print((const char*) Ethernet::buffer + off + 207);
}

void setup () {

 Serial.begin(57600);
 Serial.println("Client Demo");
 Serial.println();

 if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
   Serial.println( "Failed to access Ethernet controller");
else
  Serial.println("Ethernet controller initialized");
Serial.println();

 if (!ether.dhcpSetup())
   Serial.println("Failed to get configuration from DHCP");
 else
   Serial.println("DHCP configuration done");

 ether.printIp("IP Address:\t", ether.myip);
 ether.printIp("Netmask:\t", ether.mymask);
 ether.printIp("Gateway:\t", ether.gwip);
 Serial.println();
 
 ether.hisip[0] = 192;
 ether.hisip[1] = 168;
 ether.hisip[2] = 100;
 ether.hisip[3] = 22;
 ether.printIp("SRV IP:\t", ether.hisip);
 Serial.println("Loop :");
 delay(1000);
}

void loop() {

 ether.packetLoop(ether.packetReceive());
 
 if ((millis() > timer) && x == true) {
   timer = millis() + 5000;
   const char postval[] = "id=422";
   ether.httpPost(PSTR("/test/index2.php"), website, PSTR(""), postval, response_callback);
   x = false;
 }
}


et voici mon script php :
Code: [Select]
<?php

        
if(isset($_POST["id"]))
                echo 
"id :" $_POST["id"];
        elseif(isset(
$_GET["id"]))
                echo 
"id :" $_GET["id"];
        else
                echo 
"nothing to show";
?>


Seulement, le problème est que mon arduino me retourne "nothing to show" au lieu de me retournée le nombre 422.

Je ne comprend pas d'où vient le problème.

Merci à tous.
Timiti29

PS : voici le prototype de la fonction httpPost :

void EtherCard::httpPost (prog_char *urlbuf, prog_char *hoststr, prog_char *additionalheaderline,const char *postval,void (*callback)(byte,word,word))

infobarquee

#1
Oct 20, 2013, 08:36 pm Last Edit: Oct 20, 2013, 08:40 pm by infobarquee Reason: 1
bonjour,
même réponse que dans ton autre post.
log apache?

mais réduit ton php en plus simple
Quote

<?php

       if(isset($_POST['id']) || isset($_GET['id']) )
                 {
                    $id_post = $_POST['id'];
                    $id_get    = $_GET['id'];
                   echo " post id : $id_post <br/>get id : $id_get";
             
      } else{
               echo "nothing to show";
      }
?>
AUCUNE AIDE PAR MP

timiti29

Re, concernant le code PHP je le trouve claire pour un exemple basique pour tester les variables POST et GET.

Ensuite concernant le fichier error.log, il est vide
et le fichier access.log contient une ligne :

192.168.100.100 - - [20/Oct/2013:21:05:42 +0200] "POST /test/index2.php HTTP/1.0" 200 226 "-" "-"

Il ne devrais pas y avoir les variables ?

Merci
Timiti29

infobarquee


Re, concernant le code PHP je le trouve claire pour un exemple basique pour tester les variables POST et GET.

Ensuite concernant le fichier error.log, il est vide
et le fichier access.log contient une ligne :

192.168.100.100 - - [20/Oct/2013:21:05:42 +0200] "POST /test/index2.php HTTP/1.0" 200 226 "-" "-"

Il ne devrais pas y avoir les variables ?

Merci
Timiti29

tu fais comme tu veux pour ton php, mais là, tu sais même pas ou ca bloque ;)

ben non, vu que tu fais un POST, donc pas de variable, un GET oui.
trace les données du POST dans un fichier, ca sera plus simple ou dans la bdd
AUCUNE AIDE PAR MP

barbudor

Je trouve ton code PHP tout a fait ok.
Mais comme pour le précédant, je suggère d'utiliser tcpdump

Tout a l'heure je n'avais pas la possibilité d'être plus clair sur l'utilisation de tcpdump mais là je suis de retour sur mon PC.

Le man est ici : http://www.tcpdump.org/tcpdump_man.html mais aussi "man tcpdump" ou "tcpdump --help"

Le plus simple est de mettre un filtre sur l'IP de ton Arduino : "tcpdump host 192.168.100.100"
Tu devrais voir passer les échanges DHCP puis la requette HTTP.
Je suis sous Windows avec Wireshark c'est plus facile mais tu devrais quand même pouvoir tout voir.

Il y a peut être des équivalents de Wireshark sous Linux mais je ne les connais pas.




barbudor

Cool
Y'a des trucs bien chez les pingouins  :D
=> []

timiti29

voila le resultat d'un tcpdump -i eth1 src 192.168.100.100 -vvv :
Code: [Select]
23:45:19.226273 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 310)
    192.168.100.100.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from dd:dd:dd:00:00:01 (oui Unknown), length 282, xid 0x36000000, Flags [none] (0x0000)
  Client-Ethernet-Address dd:dd:dd:00:00:01 (oui Unknown)
  Vendor-rfc1048 Extensions
    Magic Cookie 0x63825363
    DHCP-Message Option 53, length 1: Request
    Client-ID Option 61, length 7: ether dd:dd:dd:00:00:01
    Hostname Option 12, length 10: "Arduino-01"
    Requested-IP Option 50, length 4: 192.168.100.100
    Server-ID Option 54, length 4: Dj-Timiti29.local
    Parameter-Request Option 55, length 3:
      Subnet-Mask, Default-Gateway, Domain-Name-Server
    END Option 255, length 0
23:45:23.245479 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has Dj-Timiti29.local tell 192.168.100.100, length 46
23:45:23.246613 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 44)
    192.168.100.100.2850 > Dj-Timiti29.local.http: Flags [S], cksum 0x3977 (correct), seq 2560, win 768, options [mss 550], length 0
23:45:23.247635 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.100.100.2850 > Dj-Timiti29.local.http: Flags [R.], cksum 0x732f (correct), seq 2704, ack 1077778582, win 1024, length 0
23:45:23.248140 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 44)
    192.168.100.100.2851 > Dj-Timiti29.local.http: Flags [S], cksum 0x3676 (correct), seq 3328, win 768, options [mss 550], length 0
23:45:23.249149 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.100.100.2851 > Dj-Timiti29.local.http: Flags [.], cksum 0x1dd5 (correct), seq 3329, ack 3273746590, win 1024, length 0
23:45:23.250353 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 182)
    192.168.100.100.2851 > Dj-Timiti29.local.http: Flags [P.], cksum 0xc357 (correct), seq 0:142, ack 1, win 1024, length 142
23:45:23.253076 IP (tos 0x0, ttl 64, id 43576, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.100.100.2851 > Dj-Timiti29.local.http: Flags [FP.], cksum 0x1c5c (correct), seq 142, ack 227, win 1024, length 0
23:45:23.253900 IP (tos 0x0, ttl 64, id 43577, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.100.100.2851 > Dj-Timiti29.local.http: Flags [FP.], cksum 0x1c5b (correct), seq 142, ack 228, win 1024, length 0


Merci
Timiti29

infobarquee


Cool
Y'a des trucs bien chez les pingouins  :D
=> []


HS
héhé plus qu'on ne croit :) franchement du mal a revenir sur un windaub pour du dépannage

mais wireshark ne montre que les trames, pas ce qui est envoyé en données.
d'ou mon idée de mettre en fichier les données recues.

mais un truc me tarabusque quand même, la config de son apache.
j'ai bien peur qu'il prenne comme un Ddos ou autre les requêtes aussi proches et du coup bloque les données.
j'ai pas regardé la lib, mais ca me donne pas l'impression d'envoyer la variable "id" quelque part.

en suivant le process d'un post ca revient à ca
formulaire methode =POST
variable name=id
value = 3
submit

un GET est plus approprié pour éviter le formulaire, un lien suffit, chose impossible via un POST puisque les variables ne passent pas dans le lien, mais c'est mon avis perso.
AUCUNE AIDE PAR MP

timiti29

J'ai pour projet d'envoyer des requetes SQL, je pensse que pour une telle utilisation, une methode POST est plus approprié.
(j'ai pas envie d'avoir des conversions d'espace etc...)

consernant la configuration d'apache, elle est d'origine, je n'est rien modifié depuis l'installation.

Merci
Timiti29

infobarquee

dans un premier temps passe par un GET pour vérifier si ca passe.
peut être un bug dans la lib, qui sait?
AUCUNE AIDE PAR MP

barbudor

De toute évidence, j'ai du oublié une paramètre de ligne de commande pour obtenir le contenu des paquets.
Il faut d'ailleurs peut être demander à tcpdump de faire un fichier pcap (capture) et ensuite l'exploiter avec un autre soft
Ou alors prendre Wireshark puisqu'il y a une version Linux

N'en déplaise à Infobarquee, on peut voir l'intégralité d'une conversation TCP non cryptée dans Wireshark avec "Follow TCP stream"
Cf la copie d'écran ci dessous
Faut dire que sous Windaube on est faignant de la console, alors forcément les utilitaires nous machent le travail  :smiley-mr-green:

infobarquee


De toute évidence, j'ai du oublié une paramètre de ligne de commande pour obtenir le contenu des paquets.
Il faut d'ailleurs peut être demander à tcpdump de faire un fichier pcap (capture) et ensuite l'exploiter avec un autre soft
Ou alors prendre Wireshark puisqu'il y a une version Linux

N'en déplaise à Infobarquee, on peut voir l'intégralité d'une conversation TCP non cryptée dans Wireshark avec "Follow TCP stream"
Cf la copie d'écran ci dessous
Faut dire que sous Windaube on est faignant de la console, alors forcément les utilitaires nous machent le travail  :smiley-mr-green:



gnarf gnarf gnarf, :)
je viens de lire justement cette option dans wireshark qui est dispo aussi sous nunux.
là tu fais sur un GET, teste avec un POST via un formulaire pour voir si on trace la variable.
pas installé le prog encore sur mon nunux.
AUCUNE AIDE PAR MP

barbudor

Pfff
j'ai dis que j'était faignant
Enfin, voilà : on voit très bien passer les variables avec Wireshark

infobarquee

oki,
je me coucherai moins benet ce soir :) mais pas pour autant que tu me redonne gout à windaub, héhéhé.
donc, notre ami, n'a plus qu'a faire la même chose pour vérifier les trames envoyées.
AUCUNE AIDE PAR MP

Go Up