Go Down

Topic: Composants pour interface web (Read 6686 times) previous topic - next topic

chesnel

#30
Jun 07, 2011, 02:37 am Last Edit: Jun 07, 2011, 07:41 am by chesnel Reason: 1
Bon c'est partis je prend un peu de temps pour partager mon avancement smiley

Arduino est comme en mode écoute la manière dont cela fonctionne si vous allez dans votre navigateur et que vous tapez 192.168.1.200?led=200z et que vous avez votre serial monitor ouvert, vous devriez voir s'afficher des informations dont la valeur de led transmise. J'ai fait le tuto de cette page http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoEthernetServeurControleLEDx7 et mes  connaissances rudimentaires. Il existe surement d'autre manière plus propre pour récupérer la valeur, mais c'est déjà un bon début selon moi.

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <Server.h>
#include <Client.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4A, 0x8A };
byte ip[] = { 192,168,1,200};
byte passerelle[] = { 192, 168, 1, 254 };
byte masque[] = { 255, 255, 255, 0 };


String chaineRecue="";
int comptChar=0;

Server serveurHTTP(80);
int etat = 255;


void setup()   {

Serial.begin(115200);

Ethernet.begin(mac, ip, passerelle, masque);

serveurHTTP.begin();



}

void loop(){

 while(!serveurHTTP.available()); // attend qu'un client soit disponible


 Client client = serveurHTTP.available();

 if (client) { // si l'objet client n'est pas vide = si le client existe
 
   chaineRecue=""; // vide le String de reception
   comptChar=0; // compteur de caractères en réception à 0  
 
   if (client.connected()) { // si le client est connecté
   
          while (client.available()) {

               char c = client.read();
               comptChar=comptChar+1;
               //récuperation des 100 premier caractères
               if (comptChar<=100) chaineRecue=chaineRecue+c;

     } // --- fin while client.available
     
     
   //Serial.println(chaineRecue); // affiche le String de la requete pris en compte pour analyse
   Serial.println("");
   //les valeurs nous intéressant dans le GET transmit ce trouve entre = et & (led1=valeur$
   //trouve la position du premier =
   
   Serial.println(chaineRecue);
   Serial.println("");
   
   //trouve la position du premier =
   int positionStart = chaineRecue.indexOf('=');
   Serial.print("la position du = est ");
   Serial.println(positionStart);
   
   //trouve la position du premier z
   int positionEnd = chaineRecue.indexOf('z');
   Serial.print("la position du z est ");
   Serial.println(positionEnd);
   
   //récupère la velur présente entre le = et z
   String valeurLed = chaineRecue.substring(positionStart+1,positionEnd);
   
   int valeurLedint;
   //String en int est possible avec ses changements http://code.google.com/p/arduino/issues/detail?id=468
   long valeurLed2 = valeurLed.toInt();
   
   Serial.print("valeur de la led : ");
   Serial.print(valeurLed2);
   Serial.println("");
   
   
   analogWrite(9, valeurLed2);
   

   } // --- fin if client connected

   delay(1);

   client.stop();


 } //---- fin if client existe ----



}



Alors du coté de la page Web :
Pour ma part j'ai fait les essaie en local et en ligne et ça fonctionne. J'ai tout intégré dans une seul page css + jquery histoire que ce soit plus simple à comprendre.

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">
   <head>

       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
       <title>changement couleur arduino Client</title>
       
       <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
       <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
       <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>

       <style type="text/css">
           #slider { margin: 10px; width: 300px; }
           #contenu { width: 300px; height: 50px; margin:100px auto 0px auto; }
       </style>

       <script type="text/javascript">


       $(function(){

            //lien vers l'arduino qui est en mode écoute
            var $link = "192.168.1.200"
            //creation du slider avec une valeur max de 255 et initial de 0
            $( "#slider" ).slider({ max: 255 },{ value: 0 });

            //--- transmet la valeur durant le déplacement du slide - peu stable et envoi beaucoup de requête ---- //
            //a chaque fois que le slider est en action on envois la valeur
            /*$( "#slider" ).bind( "slide", function() {
               var value = $( "#slider" ).slider( "option", "value" );
               $.get($link,{led1:value+"z"});
           });*/

            //a chaque fois que le slider et laché on envois la valeur
            $( "#slider" ).bind( "slidestop", function() {
               var value = $( "#slider" ).slider( "option", "value" );
               //envoi par methode GET les informations à l'arduino
               $.get($link,{led1:value+"z"});
           });

             

       });

               </script>

   </head>

   <body>
       <div id="contenu">
           <div id="slider"></div>
       </div>

   </body>

</html>

La zone qui est en commentaire qui permet de transmettre la valeur durant le changement du slide n'est pas active car je me suis rendu compte que trop de valeur était transmise à l'arduino et parfois certaine envoyé en première arrivé après les suivantes transmises. Ce qui donnais une led clignotante à certains moment :p

Je donne quelque explication par rapport à cette partie

Code: [Select]
var $link = "192.168.1.200"

pour la démonstration j'ai mon mon adresse local mais pour faire fonctionner sur internet il y à plusieurs chose à savoir. Vous devez redirigez vers votre adresse ip qui, la plupart du temps est dynamique. À chaque fois que vous vous reconnecter à internet une nouvelle adresse ip vous est assigné. Ojal  l'adresse que tu as vus est en faite créée via le site https://www.dyndns.com. Elle permet de rediriger en permanence vers l'adresse ip de mon ordinateur, même si celle-ci change.

Pour ma part j'ai du paramétrer mon routeur pour que, lorsque j'accède à l'adresse ip de mon ordinateur, je sois rediriger vers l'adresse ip local de l'arduino, dans l'exemple 192.168.1.200 sous le port 80. Sur ce point je ne peux pas vraiment aider car les configurations de routeur varie selon les marques.

Gardez en tête que c'est une première tentative... elle fonctionne mais je suis certains que nous pouvons améliorer tout ceci ! Enfin pour le moment je trouve que ça peut ouvrir à pas mal d'idée ! :)

Voilà Si vous avez des questions sur le code n'hésitez pas !

PS(2h plus tard) : Je viens de faire mon tout premier montage avec un relais pour allumer une lumière branché sur du 120V ! branché au Québec, et testé depuis le Suisse ! Je crois que je deviens accros à tout ça :p

chesnel



Mais j'aimerais bien comprendre pourquoi vous n'appeler pas directement la carte ?   


tu peux donner plus de précision ?

ojal

Ça semble très intéressant! priori un simple passage d'arguments dans l'URL très classique  8)
Pas eu le temps d'analyser le dernier post, mais ça veut donc bien dire qu'il n'y a pas qu'UDP pour communiquer avec l'ARDUINO...
Je me remets à tout ça dès que j'ai un moment...

En fait, le problème que nous rencontrons est assez simple... Nous (je?) manquons de doc sur le SHIELD ETHERNET et sur les bibliothèques qui permettent à l'ARDUINO de communiquer par les couches réseau... On peut trouver ça où ???

Quote
ça veut donc bien dire qu'il n'y a pas qu'UDP pour communiquer avec l'ARDUINO...

initialement, l'arduino ne supportait que le TCP/IP (webserver, client web). Puis des âmes généreuses et dévouées ont écrit une bibliothèque UDP, qui a été intégré à l'IDE de manière officielle après la version 19.

Quote
Nous (je?) manquons de doc sur le SHIELD ETHERNET et sur les bibliothèques qui permettent à l'ARDUINO de communiquer par les couches réseau...


Sur le site de wiznet, tu trouveras le datasheet du W5100.

sur ce site: http://www.ermicro.com/blog/?p=1773, tu auras une explication intéressante de son fonctionnement.

Les bibliothèques arduino sont les bibliothèques wiznet adaptée à l'arduino (allégée)

Gromain
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

#34
Jun 07, 2011, 02:18 pm Last Edit: Jun 07, 2011, 02:20 pm by powerpack Reason: 1
Bonjour

je ni comprend plus rien, j'ai fait un schéma pour mieux comprendre.
Tu a serveur Web Ché ton FAI (Fournisseur Acces Internet) et tu a mie un arduino ché toi au Q de ton modem ADSL exate ?
Pour moi Arduino doi étre dans la DMZ du routeur de ton FAI, ces impératif pour que sa fonctionne correctement.
Il est Claire que la doc sur le Shield Ethernet et tré limiter, nous somme aussi limiter par la vitesse du processeur 16Mhz.

pour faire de la domotique, la supervision de la maison, GTC, il ne faut pas ce voiler la face ce n'est pas avec un arduino simple que lon peut faire quelle que chose de correcte, il faudra un serveur WEB (apache, Mysql) et un arduino comme interface entrée et de sortie avec  une gestion des automatise de base, le serveur Web et la pour sécurisé l'acces et faire interface IHM (Interface Homme Machine) changer des valeurs ou afficher des valeurs dans une pas web.

C tré risquer en terme de securité, n'importe qui peut faire ce qu'il veut ché son voisin monter les rideau, allumer les lumiére, changer le point de consigne du chauffage etc....

Cordialement

PS pardon pour les faute orthographe.
Windows Certif MCSA. Electronicien.
Arduino Mega 2560.
68hc11F1, 68705U3, 68705P3.
Perl,Java,ABAP,VB,VBS,VBnet,Php,Asp,Css,C,C++,C#,MySql,S

chesnel

#35
Jun 07, 2011, 03:44 pm Last Edit: Jun 07, 2011, 03:53 pm by chesnel Reason: 1
La configuration de l'accès  à l'arduino est en DeMilitarized Zone (DMZ) http://www.commentcamarche.net/contents/protect/dmz-cloisonnement.php3

La seul différence entre ce que j'ai fait et de la domotique, peut-être un peu plus réaliste. C'est que pour moi le serveur WEB ne ce trouve pas chez moi mais sur un de mes site personnel. D'ailleurs ton schéma est correct Powerpack :) Ceci pourrais être une seconde étape avoir un petit ordinateur dédié pour servir comme serveur ce trouvant chez moi et communiquant avec l'arduino. D'ailleurs mon prochaine essai et de pouvoir communiquer dans les deux sens. Que je puisse allumer la lumière physiquement (un bouton) et que ceci change la valeur d'état dans la base de donnée qui est à distance et inversement.

Question risque ça l'est si tu ne protège pas les informations auxquelles tu peux accéder. Pour moi c'est le cas en ce moment, mais rien ne m'empêche de développer un système d'accès sécurisé avec clé crypté pour rendre la tâche difficile à mon voisin, qui n'a d'ailleurs certainement pas de notion de hacking :p

ojal

Bonjour,

Je ne suis pas convaincu de la nécessité de mettre l'ARDUINO en DMZ... Il faut configurer le routeur, je ne vois pas l'impossibilité... En DMZ, il me semble très vulnérable aux attaques extérieures...  s'il doit y en avoir  8)
Le serveur hébergé est la meilleure solution quand cela est possible... Aucun intérêt à avoir un serveur qui tourne chez soi... La seule limitation est que certains hébergeurs ne donnent pas accès à toutes les options... Le must étant son propre serveur en mode hébergé... Il y a des choses pas trop chères maintenant... Par exemple http://www.kimsufi.com/fr/cloud/ à 10.50 € TTC / mois...  :)

chesnel

#37
Jun 07, 2011, 03:59 pm Last Edit: Jun 07, 2011, 04:01 pm by chesnel Reason: 1

Bonjour,

Je ne suis pas convaincu de la nécessité de mettre l'ARDUINO en DMZ...



En faite la DMZ c'est la zone ou ce trouve  l'arduino, non le serveur web php/mysql qui a les informations. Il n'y a, à ma connaissance, pas d'autre alternative. Ton arduino est forcément brancher sur un routeur et il faut éviter les intrusions.

Sinon l'intéret d'avoir un serveur chez soi c'est pour la rapidité de communication Serveur <-> arduino qui est certainement limité quand ton serveur web ce trouve sur un herbergement (ce qui est mon cas) Mais pour des exercice comme celui-ci ce n'est pas nécessaire.

ojal

L'ARDUINO obtient une adresse IP du routeur et je ne vois pas pourquoi cette adresse ne serait pas accessible depuis l'extérieur avec une bonne config du routeur...?
C'est ce que j'avais fait à une époque pour accéder à mon serveur PHP MYSQL depuis l'extérieur... A valider quand même...

Un hébergement extérieur ne sera pas forcément beaucoup plus lent... Il n'y a pas de volumes de données à transférer... Et c'est quand même un ENORME soucis de moins à gérer... Je ne connais personne qui ai un serveur 'fiable' sur son réseau local... Cela génère souvent une nuisance sonore, ventilation du serveur, une dépense énergétique non nulle et tous les soucis de redémarrage en cas de coupure de courant etc...

Perso les serveurs doivent tous être chez des hébergeurs et OVH est assez bon pour ça... En tous cas pour l'Europe...

chesnel

#39
Jun 07, 2011, 04:16 pm Last Edit: Jun 07, 2011, 04:19 pm by chesnel Reason: 1

L'ARDUINO obtient une adresse IP du routeur et je ne vois pas pourquoi cette adresse ne serait pas accessible depuis l'extérieur avec une bonne config du routeur...?
C'est ce que j'avais fait à une époque pour accéder à mon serveur PHP MYSQL depuis l'extérieur... A valider quand même...



Mais c'est tout à fait ça. l'adresse IP qu'obtiens ton arduino est une ip adresse local. en Configurant ton routeur tu assignes l'adresse ip qui permet d'accéder à ton ordinateur depuis le web  à l'ip local de ton arduino. Mais tout ceci est configurer en DMZ tout simplement (enfin corrigé moi si je me tormpe :p)

C'est clair que ça peut être embêtant à gérer un serveur local. Je ne m'y connais pas en domotique mais je suis pas certains qu'il accède à un seveur distant. Mais pour nos projets il est clair que c'est suffisant. Je serais curieux de savoir comment cela fonctionne pour les maisons domotique, jvais aller googeler ! :)

Vous pouvez router les informations via la DMZ ou uniquement certains port avec NAT/PAT.
Toutefois, il est important de sécuriser la communication entre la carte et le serveur.

ClientWeb --->(identification basé sur php ou htaccess )--> ServeurWeb --> ( sécuriser cette connexion avec un jeton unique)--> CarteArduino






chesnel

Je viens de voir que sous IE ça ne fonctionne pas. En effet, la méthode GET utilisé en jquery pose quelque problème, uniquement avec Internet Explorer... Étonnant :p

ojal

@ chesnel,

Si je comprends bien...
Tu lance un serveur sur ton arduino
Depuis tons script PHP situé n'importe ou, tu appels des pages situées sur ton ARDUINO du type
www.url_arduino.com/page_de_pilotage_des_leds.htm?led1:0z&led2:255z&led3:122z
Est-ce bien cela que te génère ton script php?

Ensuite le serveur de l'ARDUINO est capable de récupérer l'URL de la page qui est chargée et désosse l'URL afin de connaître les valeurs passées dans l'URL???

Est-ce ça le mécanisme???

chesnel

#43
Jun 07, 2011, 08:04 pm Last Edit: Jun 07, 2011, 08:21 pm by chesnel Reason: 1
exactement. De cette manière l'arduino ne traite les informations que quand il les reçois, contrairement à l'autre méthode ou l'arduino interrogé en continue une page php extérieur.

Code: [Select]
 $.get($link,{led1:value+"z"});
C'est cette ligne en jquery qui envoi les informations. $link est le liens vers l'arduino et ensuite les valeurs à transmettre en GET :)

je viens tout juste de penser à autre chose qui n'est pas terrible niveau sécurité. Si quelqu'un arrive à intercepter les commandes que j'envois en GET vers L'arduino par exemple :
http://adress_vers_arduino.com?valeur=1/
Rien ne l'empêche de le taper dans son navigateur et voir ce que ça fait :S

chesnel

#44
Jun 07, 2011, 09:08 pm Last Edit: Jun 07, 2011, 09:17 pm by chesnel Reason: 1
Bon j'ai trouvé une solution pour éviter que la requête soit faite depuis n'importe ou.
J'ai constaté que dans les informations que l'ont reçois sur l'arduino il y à l'host. Dans mon cas c'est mon sous-domaine ou je met mes pages php en ligne. Donc j'ai mis en place une petite vérification de la présence de l'host :

Code: [Select]

     if (client.connected()) { // si le client est connecté
   
          while (client.available()) {

               char c = client.read();
               //Serial.print(c);
               comptChar=comptChar+1;
               //récuperation des 100 premier caractères
               if (comptChar<=100){
                 chaineRecue=chaineRecue+c;
               }
               
              chaineTotal = chaineTotal+c;

   

     } // --- fin while client.available
   

  String page_host = "http://arduiboo.weeboo.net";
  int tag_referer = chaineTotale.indexOf(page_referer);
   
   if(tag_referer != -1){
   
   }



Si l'host est bien présent il doit me retourner la position du 1er caractère si il n'est pas présent il retourne -1

Par contre de charger ce que l'ont reçois entièrement dans la chaineTotale ralentie pas mal l'exécution de la suite :(

Go Up