Dependencies:   EthernetNetIf NetServices mbed HTTPServer

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "stdio.h"
00002 #include "time.h"
00003 #include "stdlib.h"
00004 #include "string.h"
00005 #include "EthernetNetIf.h"
00006 #include "HTTPServer.h"
00007 #include "NTPClient.h"
00008 #include "SMTPClient.h"
00009 #include "fonctions.h"
00010 #include <mbed.h>
00011 #include <scmRTOS.h>
00012 
00013 #define HOSTNAME "mbedSE"
00014 
00015 
00016 
00017 //---------------------------------------------------------------------------
00018 //---------------------------------------------------------------------------
00019 //                      Creation des types                          
00020 //---------------------------------------------------------------------------
00021 //---------------------------------------------------------------------------
00022 
00023 //Definition des types process
00024 typedef OS::process<OS::pr0, 300> TProc1;
00025 typedef OS::process<OS::pr1, 300> TProc2;
00026 typedef OS::process<OS::pr2, 300> TProc3;
00027 
00028 //Definition du type adresse_IP
00029 typedef struct {
00030     uint8_t champs1;
00031     uint8_t champs2;
00032     uint8_t champs3;
00033     uint8_t champs4;
00034 } adresse_IP;
00035 
00036 // Definition du type de configuration du serveur SMTP pour l'envoi de mail
00037 typedef struct {
00038     adresse_IP IP;
00039     int port;
00040     string user;
00041     string password;
00042     string domain;
00043     string from_address;
00044     string to_address;
00045 
00046 } ConfSMTP;
00047 
00048 
00049 //---------------------------------------------------------------------------
00050 //---------------------------------------------------------------------------
00051 //                      Declaration des variables                           
00052 //---------------------------------------------------------------------------
00053 //---------------------------------------------------------------------------
00054 
00055 NTPClient ntp;
00056 LocalFileSystem local("local");
00057 Serial pc(USBTX, USBRX); // tx, rx
00058 EthernetNetIf eth(HOSTNAME);
00059 //HTTPServer svr;
00060 
00061 string StationName;
00062 
00063 adresse_IP IP;
00064 adresse_IP NM;
00065 adresse_IP GW;
00066 adresse_IP DNS;
00067 adresse_IP NTP;
00068 ConfSMTP SMTP;
00069 
00070 //Differents Processus pour le multitache
00071 TProc1 Proc1;
00072 TProc2 Proc2;
00073 TProc3 Proc3;
00074 
00075 //Differents evenements pouvant declencher un processus en attente
00076 OS::TEventFlag acquisition_de_lheure;
00077 
00078 //Heure machine et heure serveur
00079 
00080 time_t timer;
00081 time_t local_time;
00082 int server_time_h=0;
00083 int server_time_m=0;
00084 int server_time_s=0;
00085 int local_time_h=0;
00086 int local_time_min=0;
00087 int local_time_s=0;
00088 char hour [2];
00089 char mins [4];
00090 char sec [6];
00091 struct tm * server_time;
00092 
00093 //---------------------------------------------------------------------------
00094 //---------------------------------------------------------------------------
00095 //                      Mise en place des fonctions                           
00096 //---------------------------------------------------------------------------
00097 //---------------------------------------------------------------------------
00098 
00099 
00100 // Creation du fichier de config
00101 void creation_fichier_de_config()
00102 {
00103     FILE *p_fichier;                                 
00104     p_fichier = fopen("/local/config.txt", "r");  // Ouverture en lecture pour verifier son existence
00105 
00106     if (p_fichier == NULL)    // Test pour voir si le fichier existe ou pas
00107 
00108     {
00109         // On utilise le caractere # pour marquer les lignes de commentaires   
00110         pc.printf("le fichier n' existe pas, il faut le creer  \n");
00111         p_fichier = fopen("/local/config.txt", "w");  // Ouverture en ecriture pour le creer
00112         fprintf(p_fichier, "Station:observatoire\n");
00113         fprintf(p_fichier, "#configuration reseau \n");
00114         fprintf(p_fichier, "######################################## \n");
00115         fprintf(p_fichier, "IP:xxx.xxx.xxx.xxx\n");
00116         fprintf(p_fichier, "NM:xxx.xxx.xxx.xxx\n");
00117         fprintf(p_fichier, "GW:xxx.xxx.xxx.xxx\n");
00118         fprintf(p_fichier, "DNS:xxx.xxx.xxx.xxx\n");
00119         fprintf(p_fichier, "NTPxxx.xxx.xxx.xxx\n");
00120         fprintf(p_fichier, "SMTP:xxx.xxx.xxx.xxx\n");
00121         fprintf(p_fichier, "PORT:xx\n");
00122         fprintf(p_fichier, "USER:xxxxx\n");
00123         fprintf(p_fichier, "PASSWORD:xxxxx\n");
00124         fprintf(p_fichier, "DOMAIN:xxxxxxxxxx\n");
00125         fprintf(p_fichier, "FROM_ADDRESS:xxxxxxxxxxxxxxx\n");
00126         fprintf(p_fichier, "TO_ADDRESS:xxxxxxxxxxxxxxxx\n");
00127         fprintf(p_fichier, "######################################## \n");
00128         fclose(p_fichier);
00129         pc.printf("le fichier a ete cree\n");
00130     } else {
00131         fclose(p_fichier);
00132         pc.printf("le fichier de configuration existe \n");
00133     }
00134 }
00135 
00136 
00137 //Lecture du fichier de config et recuperation des donnees reseaux
00138 void lecture_du_fichier_de_config() {
00139     FILE *p_fichier;                    
00140     p_fichier = fopen("/local/config.txt","r");   // Ouverture en lecture seule pour recuperer les donnees
00141     pc.printf("lecture du fichier de configuration  \n");
00142 
00143     char ligne[100];
00144     char *ligne_de_commentaire;
00145           
00146     while ( feof(p_fichier) != TRUE ) {   // On verifie que le pointeur du fichier n'est pas &#65533; la fin du fichier
00147                                           //feof() renvoie FALSE si pointeur different de fin de fichier sinon renvoie TRUE
00148         
00149         fgets(ligne,100,p_fichier);    // aquisition d'une ligne pour la traiter
00150 
00151         if ( feof(p_fichier))        //on a pas atteint la fin du fichier
00152         {
00153             break;
00154         }
00155 
00156         ligne_de_commentaire = strchr(ligne, '#');     // verification que la ligne ne soit pas du commentaire
00157                                          // strchhr retourne l'adresse du premier caractere demande trouve
00158                                          // si il n'y en a pas il retourne NULL
00159 
00160         if (ligne_de_commentaire==NULL) {              // la ligne n'est pas du commentaire
00161             
00162             char *s=0;
00163             char **test;
00164             int lim1=0;
00165             int lim2=0;
00166             
00167             /******************************/
00168             /*lecture du nom de la station*/
00169             /******************************/
00170             lim1 = str_istr(ligne, "Station:");   //recherche de l'emplacement de la chaine de caractere correspondante   
00171                                                        
00172             if (lim1!=-1) {
00173                 lim2 = str_istr(ligne, "\n");
00174                 StationName=str_sub(ligne,lim1+8,lim2);
00175                 pc.printf("Station: %s\n",StationName);
00176                 }
00177             
00178             /******************************/
00179             /*   lecture de l'adresse IP  */
00180             /******************************/
00181             lim1 = str_istr(ligne, "IP:");     
00182             if (lim1!=-1) {
00183                 lim2 = str_istr(ligne, "\n");
00184                 s=str_sub(ligne,lim1+3,lim2);
00185                 test = str_split(s, ".");     //separation de la chaine en sous chaine separee par le caractere "."
00186                
00187                 //Transfert de l'ip vers la meroire
00188                 IP.champs1=(uint8_t)atoi(test[0]);
00189                 IP.champs2=(uint8_t)atoi(test[1]);
00190                 IP.champs3=(uint8_t)atoi(test[2]);
00191                 IP.champs4=(uint8_t)atoi(test[3]);
00192                 pc.printf("IP: %d.%d.%d.%d\n",IP.champs1,IP.champs2,IP.champs3,IP.champs4);
00193             }
00194             
00195             /******************************/
00196             /*     lecture du netmask     */
00197             /******************************/
00198             lim1 = str_istr(ligne, "NM:");      
00199             if (lim1!=-1) {
00200                 lim2 = str_istr(ligne, "\n");
00201                 s=str_sub(ligne,lim1+3,lim2);
00202                 test = str_split(s, ".");
00203 
00204                 //Transfert du net masque  vers la memoire
00205                 NM.champs1=(uint8_t)atoi(test[0]);
00206                 NM.champs2=(uint8_t)atoi(test[1]);
00207                 NM.champs3=(uint8_t)atoi(test[2]);
00208                 NM.champs4=(uint8_t)atoi(test[3]);
00209                 pc.printf("NM: %d.%d.%d.%d\n",NM.champs1,NM.champs2,NM.champs3,NM.champs4);
00210             }
00211             
00212             /******************************/
00213             /*  lecture de la passerelle  */
00214             /******************************/
00215             lim1 = str_istr(ligne, "GW:");
00216             if (lim1!=-1) {
00217                 lim2 = str_istr(ligne, "\n");
00218                 s=str_sub(ligne,lim1+3,lim2);
00219                 test = str_split(s, ".");
00220 
00221                 //Transfert de la gateway vers la memoire
00222                 GW.champs1=(uint8_t)atoi(test[0]);
00223                 GW.champs2=(uint8_t)atoi(test[1]);
00224                 GW.champs3=(uint8_t)atoi(test[2]);
00225                 GW.champs4=(uint8_t)atoi(test[3]);
00226                 pc.printf("GW: %d.%d.%d.%d\n",GW.champs1,GW.champs2,GW.champs3,GW.champs4);
00227             }
00228             
00229             /******************************/
00230             /*   lecture IP serveur DNS   */
00231             /******************************/
00232             lim1 = str_istr(ligne, "DNS:");
00233             if (lim1!=-1) {
00234                 lim2 = str_istr(ligne, "\n");
00235                 s=str_sub(ligne,lim1+4,lim2);
00236                 test = str_split(s, ".");
00237 
00238                 //Transfert du DNS vers la memoire
00239                 DNS.champs1=(uint8_t)atoi(test[0]);
00240                 DNS.champs2=(uint8_t)atoi(test[1]);
00241                 DNS.champs3=(uint8_t)atoi(test[2]);
00242                 DNS.champs4=(uint8_t)atoi(test[3]);
00243                 pc.printf("DNS: %d.%d.%d.%d\n",DNS.champs1,DNS.champs2,DNS.champs3,DNS.champs4);
00244             }
00245             
00246             /******************************/
00247             /*   lecture IP serveur NTP   */
00248             /******************************/
00249             lim1 = str_istr(ligne, "NTP:");
00250             if (lim1!=-1) {
00251                 lim2 = str_istr(ligne, "\n");
00252                 s=str_sub(ligne,lim1+4,lim2);
00253                 test = str_split(s, ".");
00254 
00255                 //Transfert du NTP vers la memoire
00256                 NTP.champs1=(uint8_t)atoi(test[0]);
00257                 NTP.champs2=(uint8_t)atoi(test[1]);
00258                 NTP.champs3=(uint8_t)atoi(test[2]);
00259                 NTP.champs4=(uint8_t)atoi(test[3]);
00260                 pc.printf("NTP: %d.%d.%d.%d\n",NTP.champs1,NTP.champs2,NTP.champs3,NTP.champs4);
00261             }
00262             
00263             /******************************/
00264             /* lecture configuration SMTP */
00265             /******************************/
00266             lim1 = str_istr(ligne, "SMTP:");
00267             if (lim1!=-1) {
00268                 lim2 = str_istr(ligne, "\n");
00269                 s=str_sub(ligne,lim1+5,lim2);
00270                 test = str_split(s, ".");
00271                 //Transfert du SMTP vers la memoire
00272                 SMTP.IP.champs1=(uint8_t)atoi(test[0]);
00273                 SMTP.IP.champs2=(uint8_t)atoi(test[1]);
00274                 SMTP.IP.champs3=(uint8_t)atoi(test[2]);
00275                 SMTP.IP.champs4=(uint8_t)atoi(test[3]);
00276                 pc.printf("SMTP: %d.%d.%d.%d\n",SMTP.IP.champs1,SMTP.IP.champs2,SMTP.IP.champs3,SMTP.IP.champs4);
00277             }
00278             
00279             //lecture du port
00280             lim1 = str_istr(ligne, "PORT:");      
00281             if (lim1!=-1) {
00282                 lim2 = str_istr(ligne, "\n");
00283                 SMTP.port=(uint8_t)atoi(str_sub(ligne,lim1+5,lim2-1));
00284                 pc.printf("Port: %d\n",SMTP.port);
00285 
00286             }
00287             //lecture de l'utilisateur
00288             lim1 = str_istr(ligne, "USER:");      
00289             if (lim1!=-1) {
00290                 lim2 = str_istr(ligne, "\n");
00291                 SMTP.user=str_sub(ligne,lim1+5,lim2-1);
00292                 pc.printf("User: %s\n",SMTP.user);
00293             }
00294             //lecture du mot de passe
00295             lim1 = str_istr(ligne, "PASSWORD:");      
00296             if (lim1!=-1) {
00297                 lim2 = str_istr(ligne, "\n");
00298                 SMTP.password=str_sub(ligne,lim1+9,lim2-1);
00299                 pc.printf("Password: %s\n",SMTP.password);
00300             }
00301             //lecture du domaine
00302             lim1 = str_istr(ligne, "DOMAIN:");      
00303             if (lim1!=-1) {
00304                 lim2 = str_istr(ligne, "\n");
00305                 SMTP.domain=str_sub(ligne,lim1+7,lim2-1);
00306                 pc.printf("Domain: %s\n",SMTP.domain);
00307             }
00308              //lecture de l'adresse de destination
00309             lim1 = str_istr(ligne, "FROM_ADDRESS:");     
00310             if (lim1!=-1) {
00311                 lim2 = str_istr(ligne, "\n");
00312                 SMTP.from_address=str_sub(ligne,lim1+13,lim2-1);
00313                 pc.printf("From adress: %s\n",SMTP.from_address);
00314             }
00315             //lecture de l' adresse de destination
00316             lim1 = str_istr(ligne, "TO_ADDRESS:");      
00317             if (lim1!=-1) {
00318                 lim2 = str_istr(ligne, "\n");
00319                 SMTP.to_address=str_sub(ligne,lim1+11,lim2-1);
00320                 pc.printf("To adress: %s\n",SMTP.to_address);
00321             }
00322         }
00323     }
00324     fclose(p_fichier);
00325 }
00326 
00327 
00328 // Telechargement de l'heure sur le serveur NTP
00329 int telechargement_heure(int initial) {
00330 
00331     bool connection_etablie = FALSE;
00332 
00333     // Connection au serveur NTP
00334     pc.printf("Connection au serveur NTP\n");
00335     pc.printf("Adresse serveur: %d.%d.%d.%d\n",NTP.champs1,NTP.champs2,NTP.champs3,NTP.champs4);
00336     Host serverNTP(IpAddr(NTP.champs1,NTP.champs2,NTP.champs3,NTP.champs4),123,"");
00337     
00338     // Verification de reussite de la connection
00339      NTPResult ntpResult=ntp.setTime(serverNTP);
00340      if( ntpResult == NTP_OK )
00341      {
00342          pc.printf("Connection etablie\r\n");
00343          connection_etablie = TRUE;
00344      }
00345      else {
00346      
00347      pc.printf("Erreur lors de la connection au serveur, description:\n");
00348      
00349      if ( ntpResult == NTP_PRTCL )
00350      {
00351          pc.printf("NTP Protocol error.\r\n") ;
00352      }
00353      else if ( ntpResult == NTP_TIMEOUT )
00354      {
00355          pc.printf("Connection timeout.\r\n");
00356      }
00357      else if ( ntpResult == NTP_DNS )
00358      {
00359          pc.printf("Could not resolve DNS hostname.\r\n") ;
00360      }
00361      else if ( ntpResult == NTP_PROCESSING )
00362      {
00363          pc.printf("Processing.\r\n");
00364      }
00365      else
00366      {
00367          pc.printf("Erreur inconnue");
00368      }
00369        
00370      }//Fin du else affichant les erreurs
00371      
00372      // Si erreur lors de la premiere tentative: deuxieme essai
00373      if( ntpResult != NTP_OK )
00374      {
00375          pc.printf("\nDeuxieme essai de recuperation de l'heure\n");
00376          
00377      NTPResult ntpResult=ntp.setTime(serverNTP);
00378      if( ntpResult == NTP_OK )
00379      {
00380          pc.printf("Connection etablie\r\n");
00381          connection_etablie = TRUE;
00382      
00383      }
00384      else {
00385      
00386      pc.printf("Erreur lors de la connection au serveur, description:\n");
00387      
00388      if ( ntpResult == NTP_PRTCL )
00389      {
00390          pc.printf("NTP Protocol error.\r\n") ;
00391      }
00392      else if ( ntpResult == NTP_TIMEOUT )
00393      {
00394          pc.printf("Connection timeout.\r\n");
00395      }
00396      else if ( ntpResult == NTP_DNS )
00397      {
00398          pc.printf("Could not resolve DNS hostname.\r\n") ;
00399      }
00400      else if ( ntpResult == NTP_PROCESSING )
00401      {
00402          pc.printf("Processing.\r\n");
00403      }
00404      else
00405      {
00406          pc.printf("Erreur inconnue");
00407      }
00408      }
00409      }
00410      
00411      if( connection_etablie == FALSE )
00412      {
00413      pc.printf("Connection impossible");
00414      ////////////////////////////////////////////////////////////////
00415      ////////////////////////////////////////////////////////////////
00416      //Ecrire ici le rapport d'erreur dans le fichier sur carte SD //
00417      ////////////////////////////////////////////////////////////////
00418      ////////////////////////////////////////////////////////////////
00419      return 0;
00420      }
00421      else{
00422      
00423      //connection etablie, recuperation de l'heure du serveur
00424      timer=time(NULL);
00425 
00426      //si nous en phase d'initialisation l'heure machine = l'heure serveur
00427     if( initial == 0)
00428     {
00429     local_time = timer;
00430     }
00431 
00432     server_time =  localtime(&timer);
00433     
00434     //Recuperation des differentes composantes de l'heure
00435     strcpy (hour,"");
00436     strftime (hour,2,"%H",server_time);
00437     server_time_h = atoi(hour);
00438 
00439     strcpy (mins,"");
00440     strftime(mins,4,"%M",server_time);
00441     server_time_m = atoi(mins);
00442 
00443     strcpy (sec,"");
00444     strftime (sec,6,"%S",server_time);
00445     server_time_s = atoi(sec);
00446     pc.printf("Heure serveur: %dh%dm%ds\n", server_time_h, server_time_m, server_time_s);
00447     return 1;
00448 
00449     }  
00450 }
00451 
00452 //   printf("L'heure courante est: %s\n",asctime(localtime(&timer)));
00453 
00454 
00455 // Configuration connection reseau Ethernet
00456 void configuration_reseau_static()
00457 {
00458   EthernetNetIf eth(IpAddr(IP.champs1,IP.champs2,IP.champs3,IP.champs4),
00459                     IpAddr(NM.champs1,NM.champs2,NM.champs3,NM.champs4),
00460                     IpAddr(GW.champs1,GW.champs2,GW.champs3,GW.champs4),
00461                     IpAddr(DNS.champs1,DNS.champs2,DNS.champs3,DNS.champs4));
00462   
00463   pc.printf("Debut configuration\n");
00464   EthernetErr ethErr = eth.setup();
00465   if(ethErr)
00466   {
00467     pc.printf("Echec de la configuration\n");
00468   }
00469     pc.printf("Configuration reseau OK\n");
00470 }
00471 
00472 // Configuration connection reseau Ethernet
00473 void configuration_reseau_dynamic()
00474 {
00475   
00476   pc.printf("Debut configuration\n");
00477   EthernetErr ethErr = eth.setup();
00478   if( ethErr == ETH_OK )
00479     {
00480         IpAddr ip = eth.getIp();
00481         pc.printf("Utilisation du protocol DHCP\n");
00482         pc.printf("IP fournie: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]);
00483     }
00484     else pc.printf ("Echec de la configuration\n");
00485 
00486 }
00487 
00488 
00489 
00490 int main(){
00491 
00492     wait(8);
00493     pc.printf("\n****************************\n");
00494     pc.printf("Initialisation connection reseau\n");
00495     pc.printf("****************************\n\n");
00496     
00497     wait(2);
00498     //Generation et lecture fichier de configuration 
00499     pc.printf("\nFichier de configuration\n");
00500     creation_fichier_de_config();
00501     lecture_du_fichier_de_config();
00502     
00503     wait(2);
00504     //configuration reseau
00505     pc.printf("\nConfiguration reseau\n");
00506     //configuration_reseau_static();
00507     configuration_reseau_dynamic();
00508   
00509     wait(2);
00510     //initialisation heure locale
00511     pc.printf("\nConnection reseau NTP et initialisation de l'heure\n");
00512     telechargement_heure(0);
00513 
00514 
00515     wait(2);
00516     pc.printf("\n\n****************************\n");
00517     pc.printf("Lancement de la gestion multitache\n");
00518     pc.printf("****************************\n\n");
00519     // run
00520     OS::Run();
00521 }
00522 
00523 //---------------------------------------------------------------------------
00524 template<> OS_PROCESS void TProc1::Exec()
00525 {
00526     for(;;)
00527     {
00528         Sleep(3000);            //Attente 3000ms
00529         pc.printf("Execution Process 1\n");
00530 
00531     }
00532 }
00533 
00534 //---------------------------------------------------------------------------
00535 template<> OS_PROCESS void TProc2::Exec()
00536 {
00537     for(;;)
00538     {
00539         Sleep(5000);                //Attente 5000ms
00540         pc.printf("Execution Process 2\n");
00541         
00542     }
00543 }
00544 
00545 //---------------------------------------------------------------------------
00546 template<> OS_PROCESS void TProc3::Exec()
00547 {
00548     for (;;)
00549     {
00550     
00551             char c = pc.getc();
00552            if(c == 'a')
00553             {
00554               telechargement_heure(1);  
00555             } 
00556 
00557     
00558     
00559     }
00560 }
00561 
00562 //---------------------------------------------------------------------------
00563 // Timer des process, c'est ici qu'on peut creer des evenement pour synchro les taches
00564 void OS::SystemTimerUserHook()
00565 {
00566         //Interrogation du serveur pour maintenir connection
00567         Net::poll();
00568 
00569 }
00570 //---------------------------------------------------------------------------
00571 void OS::IdleProcessUserHook()
00572 {
00573     __WFI();
00574 }
00575 //-----------------------------------------------------------------------------