Go Down

Topic: commande arduino a travers le web (Read 7472 times) previous topic - next topic

systere

Bonjour,

J'utilise une arduino Duemilanove et un sheild ethernet.
J'utilise un petit programme qui permet d'allumer ou d'éteindre une led raccordée a un port de l'arduino et ceci depuis un programme en PHP.
ces 2 programmes sont inspirés de ce que l'on peût trouver sur le net.
Le tout fonctionne trés bien en web local avec un serveur Apache installé sur un des PC de mon ethernet.
Par contre lorsque je fais l'essai avec le programme PHP installé chez un hebergeur(LWS), en mettant l'adresse IP de ma box(SFR), l'arduino ne reçoit rien.
Code arduino :
Code: [Select]

#include <SPI.h>  // gestion bus SPI
#include <Ethernet.h>  // gestion ethernet
#include<EthernetUdp.h>  // gestion UDP
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0xEA, 0xF9};  // adresse Mac du module ethernet
IPAddress arduinoIP (192, 168, 1, 110);  // adresse IP du module ethernet
unsigned int arduinoPort = 8888;  // port écouté par arduino
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
EthernetUDP Udp;
String dataRX="";
int pin2 = 2; 

void setup()
  {
    Serial.begin(9600);
    Ethernet.begin(mac,arduinoIP);  //  connexion au reseau local
    Udp.begin(arduinoPort);  //  écoute du port redirigé par le routeur
    pinMode(pin2,OUTPUT);  // Configure la pin 8 en sortie
  }  // setup
     
void loop()
  {   
     Udp.beginPacket(arduinoIP,arduinoPort);
     int packetSize = Udp.parsePacket();
     if(packetSize)
      {
         Serial.print("TAILLE PACKET : ");
         Serial.println(packetSize);
         memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
         Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);       
        //Udp.endPacket();
        dataRX=packetBuffer;
        if(dataRX=="marche")
          {         
           digitalWrite(pin2, HIGH);
          }
        else
          {
            digitalWrite(pin2, LOW);
          }       
      }
      else
      {
        delay(500);
        Serial.println("Pas de connexion");
      }
  } 

code PHP :
Code: [Select]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<body>   
<?php

if(isset($_POST['chauffe']))
{
if($_POST['chauffe']=="MANUEL ON")
{
$message="marche";
}
else
{
$message="arret";
}
$host="192.168.1.110";  // Adresse ip de la carte arduino
$port="8888";    // Port défini dans le code arduino 
$socket socket_create(AF_INETSOCK_DGRAMSOL_UDP);
socket_sendto($socket$message strlen($message), 0$host$port);
socket_close($socket);
}
Else
{
echo" ";
}
header("Location:menu.php");
?>

</body>
</html>

J'ai fais le routage du port 8888 sur l'adresse ip de l'arduino ds ma box et j'ai configuré cette adresse en DMZ.
Malgré mes recherches, je ne vois pas comment résoudre ce Pb, si vous avez une idée ???

barbudor

Sur la plupart des serveur hosté, l'API socket n'est pas disponible (de même que l'API process).

As tu fait un PHPInfo sur ton hébergeur ?

Cherche : sockets                            Sockets Support   enabled

systere

Merci de la reponse,

Je viens de regarder et j'ai : Sockets Support    enabled

c'est donc à priori dispo !



barbudor

Je ne vois que 2 raisons :

- Soit ca ne part pas du serveur (socket bloquée malgré "socket Enabled")
- Soit ca ne traverse pas ta box

2 tests utiles :

1) En utilisant ton serveur Web chez toi, est-ce que cela marche si tu utilises ton IP publique au lieu de l'IP locale de l'Arduino ?
- Si oui, la traversée de la box est ok, c'est donc le serveur
- Si non, la traversée de la box n'est pas ok

2) Utilise la commande nc sur ton PC (si tu est sous Windows chercher avec google nc111nt.zip)
Redirige le port 8888 vers ton PC au lieu de l'Arduino est utilse nc avec la commande suivante :
Code: [Select]
nc -u -l -p 8888
Maintenant tous les messages qui viennent du serveur LWS devraient arriver sur ton PC est être affichés par la commande nc

- Si ok, serveur et box sont ok, problème sur l'Arduino


Es-tu sur qu'il faille à la fois configurer un transfert de port UDP ET mettre l'IP de l'Arduino en DMZ ?
Il me semble que l'un des 2 suffit. De préférence le 1er.


systere

J'ai fais la manip avec nc111nt et je ne reçois rien.

J'ai fais un essai  avec l'IP publique de ma box  depuis un PC externe  vers mon serveur et la ça fonctionne très bien.

Il me semble donc que c'est mon hébergeur qui bloque.

Quel autre solution employer pour envoyer mes ordres a travers le web sans utiliser les sockets ??

L'autre partie de mon appli, se connecte au serveur et vient au travers d' un prog PHP inscrire des valeurs de capteurs ds une bdd mysql.Cette partie fonctionne bien.

Mon but est donc de commander manuellement a travers le web les sorties de l'arduino en fonction des valeurs de capteurs reçues.

Si tu as une idée ...

barbudor

Si tu ne peux pas utiliser une socket pour faire de l'UDP, tu peux peut être faire une requête HTTP GET ou POST ?
Peux être que cette API n'est pas bloquée ?
http://www.php.net/manual/fr/book.http.php

Pour info, chez Free, le phpinfo() dit aussi que les socket sont activées mais ce n'est pas vrai.

infobarquee

bonjour,
cherche pas trop, trouvé sur le wiki lws

Code: [Select]
# Les ports UDP suivants sont maintenant ouverts :

    * 1194 : openvpn
    * 8767 : Teamspeak 2
    * 9987 : Teamspeak 3
    * 53 : DNS
    * 123 : NTP

tu as quoi comme hébergement?
mutualisé, dédié?
AUCUNE AIDE PAR MP

barbudor

Ahah
Bonne idée !
C'est pas forcément l'API socket qui est interdite mais le firewall qui empêche de sortir....

Quoi que là, je pencherait plutôt pour des ports en entrée...
Mais bon, ça vaut le coup d'essayer avec le port d'OpenVPN par exemple.

systere

J'ai un hebergement mutualisé, et en plus le tarif de base donc peut être accès plus réduit.
Je vais essayer sur un autre port par ex OpenVPN.
Je vous tiens au courant.
Merci pour ces pistes !

systere

Malheureusement quel que soit le port utilisé, je n'ai pas réussi à communiquer.

Je continue ma recherche de communication dans le sens PHP vers Arduino à travers le Web.

skywodd

Salut,


Malheureusement quel que soit le port utilisé, je n'ai pas réussi à communiquer.

Je continue ma recherche de communication dans le sens PHP vers Arduino à travers le Web.

Truc bête, est ce que tu peut faire un file_get_content sur une adresse http depuis ton serveur ?
Si oui tu peut jouer avec le protocole http et html pour transmettre les données.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

systere

A moins d'avoir mal compris, je pense que le file_get_content sert a lire un fichier reçu par une appli PHP.
Or moi ce que je veux faire c'est envoyer une trame vers l' Arduino depuis une appli PHP qui tourne sur le serveur.
Je vois comment décoder une trame entrante sur l'Arduino, mais je ne vois pas comment l'envoyer depuis PHP !!

barbudor

Est-ce que tu as regardé l'API HTTP de PHP comme je te l'ai indiqué plus haut ?
Ou bien tout simplement utilise le port 80...

Mais il y a de grande chance que le problème soit un firewall qui empêche toute communication sortante.
Ca parait relativement logique d'un point de vue de la sécurité sur un serveur partagé.

A mon avais la seule solution est de passer sur un serveur dédié... mais ce n'est pas le même prix bien sur.

Tu ne peux pas monter un serveur dédié chez toi ? Avec un netbook d'occasion, tu peux avoir quelque chose de simple qui ne consomme pas beaucoup.

infobarquee

bonjour,
je pense a un truc, as tu changé l'ip sur ton script  php pour envoyer les infos?
Code: [Select]
$host="192.168.1.110";  // Adresse ip de la carte arduino
qui doit se transformer en
Code: [Select]
$host="ton_ip_publique";

après avoir ouvert le 8888, as tu rebooté ta box?
chez certains modems, il faut rebooter.

ca part de chez lws, mais en fait on se fiche que ce soit en tcp ou udp, c'est à l'arrivée qu'il faut voir et configurer les entrées.
fais un test avec le port 81
je ne sais plus si les box sfr permettent de natter un port vers un autre différent, les lb ne peuvent plus maintenant (81->80 par exemple)
AUCUNE AIDE PAR MP

barbudor

Quote
J'ai fais un essai  avec l'IP publique de ma box  depuis un PC externe  vers mon serveur et la ça fonctionne très bien.


Brisbee, le problème n'est pas sur sa box.
Le problème est de pouvoir sortir de l'ISP ce qui semble bloqué par un firewall ou directement dans PHP chez LWS

Go Up