commande arduino a travers le web

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 :

#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 :

<!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_INET, SOCK_DGRAM, SOL_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 ???

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

Merci de la reponse,

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

c'est donc à priori dispo !

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 :

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.

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

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.

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

# 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é?

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.

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 !

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.

Salut,

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.

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.

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

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.

bonjour, je pense a un truc, as tu changé l'ip sur ton script php pour envoyer les infos?

$host="192.168.1.110";  // Adresse ip de la carte arduino

qui doit se transformer en

$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)

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

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.

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

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

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.

barbudor: 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.