Dependencies: EthernetNetIf NetServices mbed HTTPServer
Diff: main.cpp
- Revision:
- 0:96cf274f19bc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon May 23 05:40:11 2011 +0000 @@ -0,0 +1,575 @@ +#include "stdio.h" +#include "time.h" +#include "stdlib.h" +#include "string.h" +#include "EthernetNetIf.h" +#include "HTTPServer.h" +#include "NTPClient.h" +#include "SMTPClient.h" +#include "fonctions.h" +#include <mbed.h> +#include <scmRTOS.h> + +#define HOSTNAME "mbedSE" + + + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Creation des types +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + +//Definition des types process +typedef OS::process<OS::pr0, 300> TProc1; +typedef OS::process<OS::pr1, 300> TProc2; +typedef OS::process<OS::pr2, 300> TProc3; + +//Definition du type adresse_IP +typedef struct { + uint8_t champs1; + uint8_t champs2; + uint8_t champs3; + uint8_t champs4; +} adresse_IP; + +// Definition du type de configuration du serveur SMTP pour l'envoi de mail +typedef struct { + adresse_IP IP; + int port; + string user; + string password; + string domain; + string from_address; + string to_address; + +} ConfSMTP; + + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Declaration des variables +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + +NTPClient ntp; +LocalFileSystem local("local"); +Serial pc(USBTX, USBRX); // tx, rx +EthernetNetIf eth(HOSTNAME); +//HTTPServer svr; + +string StationName; + +adresse_IP IP; +adresse_IP NM; +adresse_IP GW; +adresse_IP DNS; +adresse_IP NTP; +ConfSMTP SMTP; + +//Differents Processus pour le multitache +TProc1 Proc1; +TProc2 Proc2; +TProc3 Proc3; + +//Differents evenements pouvant declencher un processus en attente +OS::TEventFlag acquisition_de_lheure; + +//Heure machine et heure serveur + +time_t timer; +time_t local_time; +int server_time_h=0; +int server_time_m=0; +int server_time_s=0; +int local_time_h=0; +int local_time_min=0; +int local_time_s=0; +char hour [2]; +char mins [4]; +char sec [6]; +struct tm * server_time; + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Mise en place des fonctions +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + + +// Creation du fichier de config +void creation_fichier_de_config() +{ + FILE *p_fichier; + p_fichier = fopen("/local/config.txt", "r"); // Ouverture en lecture pour verifier son existence + + if (p_fichier == NULL) // Test pour voir si le fichier existe ou pas + + { + // On utilise le caractere # pour marquer les lignes de commentaires + pc.printf("le fichier n' existe pas, il faut le creer \n"); + p_fichier = fopen("/local/config.txt", "w"); // Ouverture en ecriture pour le creer + fprintf(p_fichier, "Station:observatoire\n"); + fprintf(p_fichier, "#configuration reseau \n"); + fprintf(p_fichier, "######################################## \n"); + fprintf(p_fichier, "IP:xxx.xxx.xxx.xxx\n"); + fprintf(p_fichier, "NM:xxx.xxx.xxx.xxx\n"); + fprintf(p_fichier, "GW:xxx.xxx.xxx.xxx\n"); + fprintf(p_fichier, "DNS:xxx.xxx.xxx.xxx\n"); + fprintf(p_fichier, "NTPxxx.xxx.xxx.xxx\n"); + fprintf(p_fichier, "SMTP:xxx.xxx.xxx.xxx\n"); + fprintf(p_fichier, "PORT:xx\n"); + fprintf(p_fichier, "USER:xxxxx\n"); + fprintf(p_fichier, "PASSWORD:xxxxx\n"); + fprintf(p_fichier, "DOMAIN:xxxxxxxxxx\n"); + fprintf(p_fichier, "FROM_ADDRESS:xxxxxxxxxxxxxxx\n"); + fprintf(p_fichier, "TO_ADDRESS:xxxxxxxxxxxxxxxx\n"); + fprintf(p_fichier, "######################################## \n"); + fclose(p_fichier); + pc.printf("le fichier a ete cree\n"); + } else { + fclose(p_fichier); + pc.printf("le fichier de configuration existe \n"); + } +} + + +//Lecture du fichier de config et recuperation des donnees reseaux +void lecture_du_fichier_de_config() { + FILE *p_fichier; + p_fichier = fopen("/local/config.txt","r"); // Ouverture en lecture seule pour recuperer les donnees + pc.printf("lecture du fichier de configuration \n"); + + char ligne[100]; + char *ligne_de_commentaire; + + while ( feof(p_fichier) != TRUE ) { // On verifie que le pointeur du fichier n'est pas � la fin du fichier + //feof() renvoie FALSE si pointeur different de fin de fichier sinon renvoie TRUE + + fgets(ligne,100,p_fichier); // aquisition d'une ligne pour la traiter + + if ( feof(p_fichier)) //on a pas atteint la fin du fichier + { + break; + } + + ligne_de_commentaire = strchr(ligne, '#'); // verification que la ligne ne soit pas du commentaire + // strchhr retourne l'adresse du premier caractere demande trouve + // si il n'y en a pas il retourne NULL + + if (ligne_de_commentaire==NULL) { // la ligne n'est pas du commentaire + + char *s=0; + char **test; + int lim1=0; + int lim2=0; + + /******************************/ + /*lecture du nom de la station*/ + /******************************/ + lim1 = str_istr(ligne, "Station:"); //recherche de l'emplacement de la chaine de caractere correspondante + + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + StationName=str_sub(ligne,lim1+8,lim2); + pc.printf("Station: %s\n",StationName); + } + + /******************************/ + /* lecture de l'adresse IP */ + /******************************/ + lim1 = str_istr(ligne, "IP:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + s=str_sub(ligne,lim1+3,lim2); + test = str_split(s, "."); //separation de la chaine en sous chaine separee par le caractere "." + + //Transfert de l'ip vers la meroire + IP.champs1=(uint8_t)atoi(test[0]); + IP.champs2=(uint8_t)atoi(test[1]); + IP.champs3=(uint8_t)atoi(test[2]); + IP.champs4=(uint8_t)atoi(test[3]); + pc.printf("IP: %d.%d.%d.%d\n",IP.champs1,IP.champs2,IP.champs3,IP.champs4); + } + + /******************************/ + /* lecture du netmask */ + /******************************/ + lim1 = str_istr(ligne, "NM:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + s=str_sub(ligne,lim1+3,lim2); + test = str_split(s, "."); + + //Transfert du net masque vers la memoire + NM.champs1=(uint8_t)atoi(test[0]); + NM.champs2=(uint8_t)atoi(test[1]); + NM.champs3=(uint8_t)atoi(test[2]); + NM.champs4=(uint8_t)atoi(test[3]); + pc.printf("NM: %d.%d.%d.%d\n",NM.champs1,NM.champs2,NM.champs3,NM.champs4); + } + + /******************************/ + /* lecture de la passerelle */ + /******************************/ + lim1 = str_istr(ligne, "GW:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + s=str_sub(ligne,lim1+3,lim2); + test = str_split(s, "."); + + //Transfert de la gateway vers la memoire + GW.champs1=(uint8_t)atoi(test[0]); + GW.champs2=(uint8_t)atoi(test[1]); + GW.champs3=(uint8_t)atoi(test[2]); + GW.champs4=(uint8_t)atoi(test[3]); + pc.printf("GW: %d.%d.%d.%d\n",GW.champs1,GW.champs2,GW.champs3,GW.champs4); + } + + /******************************/ + /* lecture IP serveur DNS */ + /******************************/ + lim1 = str_istr(ligne, "DNS:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + s=str_sub(ligne,lim1+4,lim2); + test = str_split(s, "."); + + //Transfert du DNS vers la memoire + DNS.champs1=(uint8_t)atoi(test[0]); + DNS.champs2=(uint8_t)atoi(test[1]); + DNS.champs3=(uint8_t)atoi(test[2]); + DNS.champs4=(uint8_t)atoi(test[3]); + pc.printf("DNS: %d.%d.%d.%d\n",DNS.champs1,DNS.champs2,DNS.champs3,DNS.champs4); + } + + /******************************/ + /* lecture IP serveur NTP */ + /******************************/ + lim1 = str_istr(ligne, "NTP:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + s=str_sub(ligne,lim1+4,lim2); + test = str_split(s, "."); + + //Transfert du NTP vers la memoire + NTP.champs1=(uint8_t)atoi(test[0]); + NTP.champs2=(uint8_t)atoi(test[1]); + NTP.champs3=(uint8_t)atoi(test[2]); + NTP.champs4=(uint8_t)atoi(test[3]); + pc.printf("NTP: %d.%d.%d.%d\n",NTP.champs1,NTP.champs2,NTP.champs3,NTP.champs4); + } + + /******************************/ + /* lecture configuration SMTP */ + /******************************/ + lim1 = str_istr(ligne, "SMTP:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + s=str_sub(ligne,lim1+5,lim2); + test = str_split(s, "."); + //Transfert du SMTP vers la memoire + SMTP.IP.champs1=(uint8_t)atoi(test[0]); + SMTP.IP.champs2=(uint8_t)atoi(test[1]); + SMTP.IP.champs3=(uint8_t)atoi(test[2]); + SMTP.IP.champs4=(uint8_t)atoi(test[3]); + pc.printf("SMTP: %d.%d.%d.%d\n",SMTP.IP.champs1,SMTP.IP.champs2,SMTP.IP.champs3,SMTP.IP.champs4); + } + + //lecture du port + lim1 = str_istr(ligne, "PORT:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + SMTP.port=(uint8_t)atoi(str_sub(ligne,lim1+5,lim2-1)); + pc.printf("Port: %d\n",SMTP.port); + + } + //lecture de l'utilisateur + lim1 = str_istr(ligne, "USER:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + SMTP.user=str_sub(ligne,lim1+5,lim2-1); + pc.printf("User: %s\n",SMTP.user); + } + //lecture du mot de passe + lim1 = str_istr(ligne, "PASSWORD:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + SMTP.password=str_sub(ligne,lim1+9,lim2-1); + pc.printf("Password: %s\n",SMTP.password); + } + //lecture du domaine + lim1 = str_istr(ligne, "DOMAIN:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + SMTP.domain=str_sub(ligne,lim1+7,lim2-1); + pc.printf("Domain: %s\n",SMTP.domain); + } + //lecture de l'adresse de destination + lim1 = str_istr(ligne, "FROM_ADDRESS:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + SMTP.from_address=str_sub(ligne,lim1+13,lim2-1); + pc.printf("From adress: %s\n",SMTP.from_address); + } + //lecture de l' adresse de destination + lim1 = str_istr(ligne, "TO_ADDRESS:"); + if (lim1!=-1) { + lim2 = str_istr(ligne, "\n"); + SMTP.to_address=str_sub(ligne,lim1+11,lim2-1); + pc.printf("To adress: %s\n",SMTP.to_address); + } + } + } + fclose(p_fichier); +} + + +// Telechargement de l'heure sur le serveur NTP +int telechargement_heure(int initial) { + + bool connection_etablie = FALSE; + + // Connection au serveur NTP + pc.printf("Connection au serveur NTP\n"); + pc.printf("Adresse serveur: %d.%d.%d.%d\n",NTP.champs1,NTP.champs2,NTP.champs3,NTP.champs4); + Host serverNTP(IpAddr(NTP.champs1,NTP.champs2,NTP.champs3,NTP.champs4),123,""); + + // Verification de reussite de la connection + NTPResult ntpResult=ntp.setTime(serverNTP); + if( ntpResult == NTP_OK ) + { + pc.printf("Connection etablie\r\n"); + connection_etablie = TRUE; + } + else { + + pc.printf("Erreur lors de la connection au serveur, description:\n"); + + if ( ntpResult == NTP_PRTCL ) + { + pc.printf("NTP Protocol error.\r\n") ; + } + else if ( ntpResult == NTP_TIMEOUT ) + { + pc.printf("Connection timeout.\r\n"); + } + else if ( ntpResult == NTP_DNS ) + { + pc.printf("Could not resolve DNS hostname.\r\n") ; + } + else if ( ntpResult == NTP_PROCESSING ) + { + pc.printf("Processing.\r\n"); + } + else + { + pc.printf("Erreur inconnue"); + } + + }//Fin du else affichant les erreurs + + // Si erreur lors de la premiere tentative: deuxieme essai + if( ntpResult != NTP_OK ) + { + pc.printf("\nDeuxieme essai de recuperation de l'heure\n"); + + NTPResult ntpResult=ntp.setTime(serverNTP); + if( ntpResult == NTP_OK ) + { + pc.printf("Connection etablie\r\n"); + connection_etablie = TRUE; + + } + else { + + pc.printf("Erreur lors de la connection au serveur, description:\n"); + + if ( ntpResult == NTP_PRTCL ) + { + pc.printf("NTP Protocol error.\r\n") ; + } + else if ( ntpResult == NTP_TIMEOUT ) + { + pc.printf("Connection timeout.\r\n"); + } + else if ( ntpResult == NTP_DNS ) + { + pc.printf("Could not resolve DNS hostname.\r\n") ; + } + else if ( ntpResult == NTP_PROCESSING ) + { + pc.printf("Processing.\r\n"); + } + else + { + pc.printf("Erreur inconnue"); + } + } + } + + if( connection_etablie == FALSE ) + { + pc.printf("Connection impossible"); + //////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////// + //Ecrire ici le rapport d'erreur dans le fichier sur carte SD // + //////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////// + return 0; + } + else{ + + //connection etablie, recuperation de l'heure du serveur + timer=time(NULL); + + //si nous en phase d'initialisation l'heure machine = l'heure serveur + if( initial == 0) + { + local_time = timer; + } + + server_time = localtime(&timer); + + //Recuperation des differentes composantes de l'heure + strcpy (hour,""); + strftime (hour,2,"%H",server_time); + server_time_h = atoi(hour); + + strcpy (mins,""); + strftime(mins,4,"%M",server_time); + server_time_m = atoi(mins); + + strcpy (sec,""); + strftime (sec,6,"%S",server_time); + server_time_s = atoi(sec); + pc.printf("Heure serveur: %dh%dm%ds\n", server_time_h, server_time_m, server_time_s); + return 1; + + } +} + +// printf("L'heure courante est: %s\n",asctime(localtime(&timer))); + + +// Configuration connection reseau Ethernet +void configuration_reseau_static() +{ + EthernetNetIf eth(IpAddr(IP.champs1,IP.champs2,IP.champs3,IP.champs4), + IpAddr(NM.champs1,NM.champs2,NM.champs3,NM.champs4), + IpAddr(GW.champs1,GW.champs2,GW.champs3,GW.champs4), + IpAddr(DNS.champs1,DNS.champs2,DNS.champs3,DNS.champs4)); + + pc.printf("Debut configuration\n"); + EthernetErr ethErr = eth.setup(); + if(ethErr) + { + pc.printf("Echec de la configuration\n"); + } + pc.printf("Configuration reseau OK\n"); +} + +// Configuration connection reseau Ethernet +void configuration_reseau_dynamic() +{ + + pc.printf("Debut configuration\n"); + EthernetErr ethErr = eth.setup(); + if( ethErr == ETH_OK ) + { + IpAddr ip = eth.getIp(); + pc.printf("Utilisation du protocol DHCP\n"); + pc.printf("IP fournie: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + } + else pc.printf ("Echec de la configuration\n"); + +} + + + +int main(){ + + wait(8); + pc.printf("\n****************************\n"); + pc.printf("Initialisation connection reseau\n"); + pc.printf("****************************\n\n"); + + wait(2); + //Generation et lecture fichier de configuration + pc.printf("\nFichier de configuration\n"); + creation_fichier_de_config(); + lecture_du_fichier_de_config(); + + wait(2); + //configuration reseau + pc.printf("\nConfiguration reseau\n"); + //configuration_reseau_static(); + configuration_reseau_dynamic(); + + wait(2); + //initialisation heure locale + pc.printf("\nConnection reseau NTP et initialisation de l'heure\n"); + telechargement_heure(0); + + + wait(2); + pc.printf("\n\n****************************\n"); + pc.printf("Lancement de la gestion multitache\n"); + pc.printf("****************************\n\n"); + // run + OS::Run(); +} + +//--------------------------------------------------------------------------- +template<> OS_PROCESS void TProc1::Exec() +{ + for(;;) + { + Sleep(3000); //Attente 3000ms + pc.printf("Execution Process 1\n"); + + } +} + +//--------------------------------------------------------------------------- +template<> OS_PROCESS void TProc2::Exec() +{ + for(;;) + { + Sleep(5000); //Attente 5000ms + pc.printf("Execution Process 2\n"); + + } +} + +//--------------------------------------------------------------------------- +template<> OS_PROCESS void TProc3::Exec() +{ + for (;;) + { + + char c = pc.getc(); + if(c == 'a') + { + telechargement_heure(1); + } + + + + } +} + +//--------------------------------------------------------------------------- +// Timer des process, c'est ici qu'on peut creer des evenement pour synchro les taches +void OS::SystemTimerUserHook() +{ + //Interrogation du serveur pour maintenir connection + Net::poll(); + +} +//--------------------------------------------------------------------------- +void OS::IdleProcessUserHook() +{ + __WFI(); +} +//-----------------------------------------------------------------------------