Dependencies: EthernetNetIf NetServices mbed HTTPServer
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 � 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 //-----------------------------------------------------------------------------
Generated on Sat Jul 16 2022 09:37:44 by 1.7.2