Arduino Forum

International => Français => Topic started by: systere on May 20, 2012, 04:56 pm

Title: commande arduino a travers le web
Post by: systere on May 20, 2012, 04:56 pm
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 ???
Title: Re: commande arduino a travers le web
Post by: barbudor on May 20, 2012, 07:00 pm
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
Title: Re: commande arduino a travers le web
Post by: systere on May 20, 2012, 07:32 pm
Merci de la reponse,

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

c'est donc à priori dispo !


Title: Re: commande arduino a travers le web
Post by: barbudor on May 20, 2012, 07:56 pm
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.

Title: Re: commande arduino a travers le web
Post by: systere on May 21, 2012, 06:46 pm
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 ...
Title: Re: commande arduino a travers le web
Post by: barbudor on May 21, 2012, 09:02 pm
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.
Title: Re: commande arduino a travers le web
Post by: infobarquee on May 21, 2012, 09:11 pm
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é?
Title: Re: commande arduino a travers le web
Post by: barbudor on May 21, 2012, 10:07 pm
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.
Title: Re: commande arduino a travers le web
Post by: systere on May 21, 2012, 10:46 pm
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 !
Title: Re: commande arduino a travers le web
Post by: systere on May 23, 2012, 03:05 pm
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.
Title: Re: commande arduino a travers le web
Post by: skywodd on May 24, 2012, 07:15 pm
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.
Title: Re: commande arduino a travers le web
Post by: systere on May 26, 2012, 10:23 am
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 !!
Title: Re: commande arduino a travers le web
Post by: barbudor on May 26, 2012, 11:07 am
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.
Title: Re: commande arduino a travers le web
Post by: infobarquee on Jun 02, 2012, 08:47 am
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)
Title: Re: commande arduino a travers le web
Post by: barbudor on Jun 02, 2012, 11:33 am
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
Title: Re: commande arduino a travers le web
Post by: infobarquee on Jun 02, 2012, 01:00 pm
oups j'avais pas relu le tout :(

apparemment le 8767 est ouvert pour teamspeak2. http://forum.lws-hosting.com/viewtopic.php?p=7175
ca devrait donc fonctionner avec ce port.
Title: Re: commande arduino a travers le web
Post by: barbudor on Jun 02, 2012, 03:06 pm
Le thread fait référence à un hébergement VPS : Virtual Private Server (serveur privé virtuel).
C'est une machine virtuelle (genre VMWare, VirtualPC, ...) sur laquelle tu as entièrement la main pour installer n'importe quelle applications.
A ne pas confondre avec un hébergement web mutualisé où tu es généralement limité à un serveur Web (+PHP, Python, etc..) et un serveur SQL.

J'ai plutôt compris que systere se trouve dans le 2nd cas
Title: Re: commande arduino a travers le web
Post by: trigger on Jun 02, 2012, 03:14 pm
Bonjour à tous ! :)

Comme pas mal de monde sur le fofo je travail sur un petit projet de domotique,
Via Ethernet l'affichage des pages web et le contrôle fonctionnes bien mais dans le but d'alléger l'Arduino je souhaiterai passer la partie html sur un petit serveur local.

N'ayant pas de base en html/php et ne trouvant pas vraiment mon bonheur sur la toile ( même sur le site du zéro, je commence encore plus bas que zéro je pense ^^)
J'ai donc voulu m'inspirer du code du post 1 pour comprendre le système ... J'ai installé wamp et tout fonctionne par contre je ne vois pas du tout comment débuter la partie web, j'ai tout le code dans l'Arduino mais comment le passer sur le serveur ?

Si une âme charitable à le temps de m'éclairer un peu je suis preneur, en tous cas ça sent le debut d'un joli projet ! Bon courage

Amicalement,
Trigger
Title: Re: commande arduino a travers le web
Post by: osaka on Jun 02, 2012, 03:47 pm
Yop Yop,
C'est un sujet qui reviens au minimum 1 fois par mois et qui aboutis toujours aux même résultats et constatations.
Il semble illusoire de vouloir utilisé les socket sur la majorité des solutions mutualisé ou autre possibilité d'hébergement externe courant pour une simple et bonne raison de sécurité.
Maintenant en alternative il existe comme notre barbu l'a indiqué les simples requêtes http (GET et POST) et si l'on veux quelque chose de plus attractif et intéressent que de simple formulaire allez faire un tour du côté de l'ajax et plus particulièrement JQuery (bibliothèque javascript) qui peut grandement facilité la tache.

Exemple :
http://www.siteduzero.com/tutoriel-3-557807-xmlhttprequest.html
http://www.toutjavascript.com/savoir/xmlhttprequest.php3

Maintenant si on tien absolument aux socket, il y a les webSocket de l'html5 instancié côté navigateur et non serveur mais qui ne sont pas encore à 100% standardisé (patience, patience  $)) et la plus part des navigateurs l'ont déjà implémenté (à différentes évolutions du standard donc peux marché sur l'un mais pas sur l'autre).
http://fr.wikipedia.org/wiki/Websocket
En perso je les utilise déjà dans ma propre solution comme le standard ne devrais plus trop changer.
Title: Re: commande arduino a travers le web
Post by: infobarquee on Jun 02, 2012, 04:00 pm

Le thread fait référence à un hébergement VPS : Virtual Private Server (serveur privé virtuel).
C'est une machine virtuelle (genre VMWare, VirtualPC, ...) sur laquelle tu as entièrement la main pour installer n'importe quelle applications.
A ne pas confondre avec un hébergement web mutualisé où tu es généralement limité à un serveur Web (+PHP, Python, etc..) et un serveur SQL.

J'ai plutôt compris que systere se trouve dans le 2nd cas


je connais les différences ;), j'ai quelques servers dédiés pour mon boulot et pour héberger des sites, sans compter les servers chez moi, mais merci quand même.
quand à ISP, ca m'étonnerait que lws utilise ce système pour des vhosts.

le mieux serait quand même de changer d'hébergeur dont les éloges sont au niveau de 0 depuis un très long moment.
mais le problème de l'udp est sa vulnérabilité, donc tous le ferme, sauf pour snmp, dns et encore.
Title: Re: commande arduino a travers le web
Post by: barbudor on Jun 02, 2012, 04:43 pm
D'un point de vue communication, JQuery ne fait rien d'autre que des requêtes HTTP. Comme cela est en Javascript c'est à priori coté navigateur que cela s'exécute.
C'est donc dans le principe identique (d'un point de vue relation client/serveur) à l'utilisation de socket HTML5.
L'avantage c'est que puisque le navigateur est capable d'aller chercher une page Web il saura aussi faire les requêtes JQuery vers l'Arduino.

L'inconvénient que je vois tant dans le Javascript que dans le HTML5 c'est la compatibilité avec les mobiles. On commence a voir des personnes qui se plaignent de la performence d'HTML5 sur mobile et Javascript est loin d'être universellement supporté sur les navigateurs mobiles.

Je pense que la solution de gérer la communication Arduino coté serveur (PHP/Python/Perl) est la meilleure mais reste incompatible avec un hébergement mutualisé.
Donc seul le VPS ou le serveur dédié est adapté mais c'est pas le même prix. VPS OVH ou Kimsuffi commencent à 15€HT/mois.

Ou alors récupérer un netbook d'occas avec un petite distri linux et le laisser brancher en permanence chez soi.
Voir même un routeur du type de ceux compatible OpenWRT et qui peuvent faire tourner un petit linux avec un serveur Web.
Par contre probablement pas de PHP dans ce cas, donc plutôt du cgi-bin a développer en C
Title: Re: commande arduino a travers le web
Post by: osaka on Jun 02, 2012, 05:22 pm

C'est donc dans le principe identique (d'un point de vue relation client/serveur) à l'utilisation de socket HTML5.


Dans le principe oui mais les (web)sockets ont quand même le gros avantage d'avoir une communication maintenue quelque soit le nombre ,pouvant être initié de chaque côté contrairement à une communication via requête initié obligatoirement du côté client.
Maintenant il y a moyen de simulé le même comportement mais bon si il y a moyen de faire les chose directement proprement.


L'inconvénient que je vois tant dans le Javascript que dans le HTML5 c'est la compatibilité avec les mobiles. On commence a voir des personnes qui se plaignent de la performence d'HTML5 sur mobile et Javascript est loin d'être universellement supporté sur les navigateurs mobiles.


Je n'ai toujours pas de smart_faune ou autre mais je suppose que la faute doit être coté navigateur parce qu'au final l'html5 et javascript ne sont que des norme et spécifications.
Maintenant la lourdeur peux venir de son utilisation pour de la vidéo par exemple ce qui est "normal", les websocket ne seront peut être pas logé à la même enseigne, je verrais le jour ou j'ai les moyens  :smiley-mr-green: ?