1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
| #!/usr/bin/perl -w
use strict; # désactive certaines expressions en Perl qui pourraient être difficile à déboguer
use warnings; #donne le contrôle sur quels avertissements sont activés dans quelles parties dun programme Perl
#use utf8;
use DBI; # driver de base de données
use Term::ANSIColor; #directive pour pouvoir utiliser color() qui colorie le texte en sortie de terminal
# Fonction qui prend 2 paramètres $message et $status ecrit le message avec le status 'F' si pas défini
sub dielog {
my ( $message, $status ) = @_;
$status = 'F' if ( !defined $status );
printlog($message, $status); #appel à la fonction printlog de mise en forme définie ci-dessous
exit;#fin de la fonction
}
#Fonction printlog d'écriture des logs --> elle met en forme en fonction de $message et de $status
sub printlog {
my ( $message, $status ) = @_; #La fonction prend 2 paramètres $message et $status contenues dans le tableau @_
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(); #définit les variables $sec,$min..
$year += 1900; #incrémente la variable $year de 1900
print STDERR color('white'); #Change le texte en blanc
print STDERR "["; #écrit '['
print STDERR color('green'); #Change le texte du terminal en vert
printf STDERR "%04d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday, $hour, $min, $sec;#écrit l'heure au format 09:29:12
#printf STDERR "%4d-$year-$mon-$mday $hour:$min:$sec";
print STDERR color('white'); #Change le texte en blanc
print STDERR "] "; #écrit '] '
print STDERR color('cyan'); #Change le text en couleur cyan
print STDERR "$$ "; #retourn l'id du process du script en cours
print STDERR color('reset');#réinitialise la couleurpar défaut
$status = 'I' if ( !defined $status ); #affecte la varibale $status à 'I' si $status n'existe pas
#Si la variable $status vaut 'M'
if ( $status eq 'M' ) {
print STDERR color('yellow', 'on_blue');# écrit en jaune sur fond bleu
print STDERR ' MESSAGE '; # écrit 'MESSAGE ' en console
print STDERR color('reset');#réinitialise la couleur par défaut
print STDERR color('bright_blue'); #écrit en bleu
print STDERR '-';
}
#Si la variable $status vaut 'E'
elsif ($status eq 'E') {
print STDERR color( 'bright_yellow', 'on_red' ); #écrit en jaune sur fond rouge
print STDERR ' ERROR ';
print STDERR color('reset'); #réinitialise la couleur par défaut
print STDERR color('bright_blue');#écrit en bleu
print STDERR '---';
}
#Si la variable $status vaut 'D'
elsif ($status eq 'D') {
print STDERR color( 'bright_yellow', 'on_green' );#écrit en jaune sur fond vert
print STDERR ' DEBUG ';
print STDERR color('reset');#réinitialise la couleur
print STDERR color('bright_blue');
print STDERR '---';
}
#Si la variable $stauts vaut 'F'
elsif ($status eq 'F') {
print STDERR color( 'black', 'on_red' );#écrit en noir sur fond rouge
print STDERR ' FATAL ';#écrit ' FATAL'
print STDERR color('reset');#réinitialise la couleur
print STDERR color('bright_blue');
print STDERR '---';
}
#Si la variable $stauts vaut 'W'
elsif ($status eq 'W') {
print STDERR color( 'bright_red', 'on_yellow' );
print STDERR ' WARNING ';#écrit 'WARNING'
print STDERR color('reset');#réinitialise la couleur
print STDERR color('bright_blue');
print STDERR '-';
}
#Sinon (cas par défaut)
else {
print STDERR color( 'bright_blue', 'on_black' );#écrit en bleu sur fond noir
print STDERR ' INFO ';#écrit ' INFO'
print STDERR color('reset');#réinitialise la couleur
print STDERR color('bright_blue');#écrit en bleu
print STDERR '----';
}
print STDERR color('bright_blue');#écrit en bleu
print STDERR "> ";#écrit '> '
print STDERR color('reset');#réinitialise la couleur
#print STDERR color('bright_white');
print STDERR $message;#écrit la valeur de la variable $message
print STDERR color('reset');#réinitialise la couleur
}
# tempo initialise la variable $tempo à 1
my $tempo = 1; # n secondes
# Paramètres de connection à la base de données
my $bd = 'gps';
my $serveur = 'localhost';
my $identifiant = 'gps';
my $motdepasse = 'gps';
my $port = ''; #Si vous ne savez pas, ne rien mettre
# test arguments fournis en paramètre au lancement du script en contenus dans @ARGV
if ( scalar @ARGV != 1 ) {
print color('white');
print "Usage: ";
print color('green');
print "$0 <device port gps>\nexample: $0 /dev/ttyACM0\n\n";#écrit le port fournit en paramétre
print color('reset');
exit 1;
}
#ouvre le port
open( COM, $ARGV[0] ) or dielog "Can't read serial port '$ARGV[0]': $!\n", 'F';#
# Connection à la base de données mysql
printlog "Connexion à la base de données $bd\n", 'I';
my $dbh = DBI->connect( "DBI:mysql:database=$bd;host=$serveur;port=$port",
$identifiant, $motdepasse, { RaiseError => 1, } )
or dielog
"Connection impossible à la base de données $bd !\n $! \n $@\n$DBI::errstr";#message d'erreur en cas d'échec de connexion
# Création des tables
printlog "Création de la table 'gps'\n", 'I';
#requête sql de création de la table gps
my $req_create_table_sql = <<"SQL";
CREATE TABLE IF NOT EXISTS `gps` (
`id` int(10) UNSIGNED NOT NULL,
`latitude` FLOAT( 10, 6 ) NOT NULL ,
`longitude` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=latin1 COMMENT='Coordonnées GPS fonction de timestamp';
SQL
#
#Exécution de la requête de création de table
$dbh->do($req_create_table_sql)
or dielog "Echec Requête $req_create_table_sql : $DBI::errstr", 'F';
#Requête d'insertion d'une ligne dans la gps nouvellement crée
my $req = "INSERT INTO `gps` (`id`, `latitude`, `longitude`) VALUES (UNIX_TIMESTAMP(), ?, ?);";
my $sth = $dbh->prepare($req);
my $ligne;
my @champs;
my $deg;
my $min;
my $min_in_deg;
my $lat_in_deg;
my $long_in_deg;
while (1) {
while ( $ligne = <COM> ) {
chomp $ligne;#chomp: retire les séparateurs de ligne
printlog "$ligne\n", 'D' if ( $ligne ne '' );#Si $ligne n'est pas vide
if ( $ligne =~ /^\$GPGLL/ ) { #recherche le motif GPGLL dans la ligne
@champs = split ',', $ligne; #découpe la ligne en valeur dans le tableau @champs suivant le séparateur ','
my $i = 0; #initialisation du compteur $i à 0
foreach my $val (@champs) { #on parcourt tous les champs
printlog "champ[$i]: $val\n", 'D';#on écrit avec la fonction printlog (cf.ci-dessus) les champs
$i++;
}
# éviter les trames vides...
next if ( $champs[1] eq '' );
next if ( $champs[2] eq '' );
next if ( $champs[3] eq '' );
next if ( $champs[4] eq '' );
my $latitude = $champs[1];
($deg, $min) = $champs[1] =~ /(\d\d)(\d.+)/;
$min_in_deg = $min / 60;
$lat_in_deg = $deg + $min_in_deg;
my $longitude = $champs[3];
($deg, $min) = $champs[3] =~ /(\d{3})(\d.+)/;
$min_in_deg = $min / 60;
$long_in_deg = $deg + $min_in_deg;
$long_in_deg *= -1 if ( $champs[4] eq 'W' );
printlog "Enregistrement L: $lat_in_deg, l: $long_in_deg\n", 'I'; #on écrit les coordonnées à l'aide de la fonction printlog
print STDERR color('red'); #on écrit en rouge
$sth->execute( $lat_in_deg, $long_in_deg )
or dielog "Echec Requête $req : $DBI::errstr", 'F'; #on exécute la requête sql
sleep($tempo); #temporisation du script
}
}
sleep($tempo);#temporisation du script
}
close(COM);#fermeture du port |