From 417452a7ad9d95a769c49b407a1ff07c2e852e11 Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Mon, 12 Jul 2010 16:34:25 +0200 Subject: [PATCH] [Aggregator] Translation of comments, 72 col. --- .../owlps-aggregator/owlps-aggregator.h | 58 +-- .../owlps-aggregator/owlps-aggregatord.c | 373 +++++++++++------- 2 files changed, 257 insertions(+), 174 deletions(-) diff --git a/infrastructure-centred/owlps-aggregator/owlps-aggregator.h b/infrastructure-centred/owlps-aggregator/owlps-aggregator.h index 1c26103..84f7155 100644 --- a/infrastructure-centred/owlps-aggregator/owlps-aggregator.h +++ b/infrastructure-centred/owlps-aggregator/owlps-aggregator.h @@ -2,62 +2,68 @@ * This file is part of the rtap localisation project. */ -#ifndef _RTAPAGGREGATE_H -#define _RTAPAGGREGATE_H +#ifndef _OWLPS_AGGREGATOR_H_ +#define _OWLPS_AGGREGATOR_H_ #include "../../libowlps/owlps.h" #include #define DEBUG -//#define TIMESTAMP // Décommenter pour afficher le timestamp à chaque ligne du fichier de sortie. +// Uncomment to output the timestamp on each line of the output file: +//#define TIMESTAMP -/* Arguments & configuration du programme */ -#define OPTIONS "a:c:f:i:k:l:o:p:" // Chaîne pour getopt +/* Arguments & program configuration */ +#define OPTIONS "a:c:f:i:k:l:o:p:" // getopt string #define DEFAULT_CONFIG_FILE "/usr/local/etc/owlps/owlps-aggregator.conf" -#define DEFAULT_AGGREGATE_TIMEOUT 1500 // Timeout d'agrégation (en millisecondes) -#define DEFAULT_KEEP_TIMEOUT 3000 // Temps que l'on conserve les données dans la liste (en millisecondes) -#define DEFAULT_CHECK_INTERVAL 500000 // Temps entre deux vérifications de la liste (en micro-secondes) +#define DEFAULT_AGGREGATE_TIMEOUT 1500 // milliseconds +#define DEFAULT_KEEP_TIMEOUT 3000 // milliseconds +#define DEFAULT_CHECK_INTERVAL 500000 // microseconds #define POSITIONER_DEFAULT_IP "127.0.0.1" -/* Codes d'erreur */ -#define ERR_NO_MESSAGE_RECEIVED 1 // Erreur lors de la lecture sur la socket -#define ERR_CREATING_SOCKET 2 // Erreur lors de la création de la socket d'écoute -#define ERR_BAD_USAGE 3 // Mauvais appel au programme -#define ERR_PARSING_CONFIG_FILE 4 // Erreur lors de la lecture du fichier de configuration + +/* Error codes */ +#define ERR_NO_MESSAGE_RECEIVED 1 // Error when reading the socket +#define ERR_CREATING_SOCKET 2 // Erreur when creating listening socket +#define ERR_BAD_USAGE 3 // Bad program call +#define ERR_PARSING_CONFIG_FILE 4 // Error reading the configuration file -/* Liste chaînée des informations concernant un couple MAC / séquence */ +/* Linked list storing data of couples MAC / sequence number */ typedef struct _couple_info_list { - unsigned char ap_mac_addr_bytes[6] ; // Adresse MAC de l'AP émetteur de l'info en octets - unsigned char antenna_signal_dbm ; // Puissance du signal reçu par l'AP du mobile + // MAC address of the data sender (in bytes): + unsigned char ap_mac_addr_bytes[6] ; + // Signal strength received by the AP from the mobile: + unsigned char antenna_signal_dbm ; struct _couple_info_list *next ; } couple_info_list ; -/* Liste chaînée des couples MAC / séquence */ +/* Linked list of the couples MAC / sequence number */ typedef struct _couple_list { /* Numéro de séquence de la demande de localisation du mobile */ - unsigned char mobile_mac_addr_bytes[6] ; // Adresse MAC du mobile en octets - struct timeval request_time ; // Heure de la demande sur le mobile + unsigned char mobile_mac_addr_bytes[6] ; // Mobile MAC address (in bytes) + struct timeval request_time ; // Request time on the mobile - /* Données pour la calibration */ + /* Calibration data */ float x_position ; float y_position ; float z_position ; - DIRECTION direction ; // Orientation de la demande de localisation + DIRECTION direction ; // Request orientation + + /* Other data */ + // Arrival time of the first packet of the couple on the aggregator: + struct timeval start_time ; + couple_info_list *info ; // Data for this couple - /* Autres données */ - struct timeval start_time ; // Heure d'arrivée du premier paquet du couple sur le serveur d'agrégation - couple_info_list *info ; // Liste des informations pour ce couple struct _couple_list *next ; } couple_list ; -/* En-têtes de fonctions */ +/* Function headers */ void initialise_configuration(int argc, char **argv) ; void parse_config_file(int argc, char **argv) ; void parse_command_line(int argc, char **argv) ; @@ -75,4 +81,4 @@ void* monitor_couple_list(couple_list **couples) ; char* ip_bytes_to_string(unsigned char *ip_binary) ; void print_usage(void) ; -#endif +#endif // _OWLPS_AGGREGATOR_H_ diff --git a/infrastructure-centred/owlps-aggregator/owlps-aggregatord.c b/infrastructure-centred/owlps-aggregator/owlps-aggregatord.c index 2748d13..73f67f6 100644 --- a/infrastructure-centred/owlps-aggregator/owlps-aggregatord.c +++ b/infrastructure-centred/owlps-aggregator/owlps-aggregatord.c @@ -15,39 +15,43 @@ couple_list *couples = NULL ; // Computed data list int main(int argc, char **argv) { - int ret = 0 ; // Valeur de retour du programme - struct sigaction action ; // Structure de mise en place des gestionnaires de signaux - pthread_t thread ; // Thread pour la fonction de surveillance de la liste d'informations agrégées - int sockfd ; // Socket d'écoute UDP + int ret = 0 ; // Program return value + struct sigaction action ; // Signal handler structure + pthread_t thread ; // Thread for aggregated data monitoring function + unsigned int listening_port ; + int sockfd ; // UDP listening socket program_name = argv[0] ; initialise_configuration(argc, argv) ; - /* Mise en place des gestionnaires de signaux */ + /* Set up signal handlers */ sigemptyset(&action.sa_mask) ; action.sa_handler = sigint_handler ; sigaction(SIGINT, &action, NULL) ; action.sa_handler = sigterm_handler ; sigaction(SIGTERM, &action, NULL) ; - /* Création de la socket UDP */ - if ((sockfd = create_udp_listening_socket(cfg_getint(cfg, "listening_port"))) < 0) + /* Create UDP socket */ + listening_port = cfg_getint(cfg, "listening_port") ; + if ((sockfd = create_udp_listening_socket(listening_port)) < 0) { - fprintf(stderr, "Erreur ! Impossible d'écouter sur le port %ld.\n", cfg_getint(cfg, "listening_port")) ; + fprintf(stderr, + "Error! Cannot listen on port %u.\n", listening_port) ; return ERR_CREATING_SOCKET ; } - /* Création du thread */ - pthread_create(&thread, NULL, (void *) &monitor_couple_list, &couples) ; + /* Set up thread */ + pthread_create(&thread, NULL, + (void *) &monitor_couple_list, &couples) ; run = TRUE ; ret = read_loop(sockfd) ; - (void) close(sockfd) ; // Fermeture de la socket - free_couple_list(&couples) ; // Nettoyage de la liste - cfg_free(cfg) ; // Nettoyage de la configuration + (void) close(sockfd) ; // Close socket + free_couple_list(&couples) ; // Clean list + cfg_free(cfg) ; // Clean configuration - printf("%s : fin.\n", argv[0]) ; + printf("%s: end.\n", program_name) ; return ret ; } @@ -61,7 +65,7 @@ void initialise_configuration(int argc, char **argv) #ifdef DEBUG /* Configuration printing */ - fprintf(stderr, "Configuration :\n") ; + fprintf(stderr, "Configuration:\n") ; cfg_print(cfg, stderr) ; #endif // DEBUG } @@ -104,7 +108,8 @@ void parse_config_file(int argc, char **argv) } else // If -f isn't found, we use the default config file { - config_file = malloc((strlen(DEFAULT_CONFIG_FILE) + 1) * sizeof(char)) ; + config_file = + malloc((strlen(DEFAULT_CONFIG_FILE) + 1) * sizeof(char)) ; strcpy(config_file, DEFAULT_CONFIG_FILE) ; } @@ -212,45 +217,54 @@ void check_configuration() +/* + * Reads packets while the program is not stopped. + */ int read_loop(int sockfd) { int ret = 0 ; // Return value - int nread ; // Retour de recvfrom - struct sockaddr_in client; // Structure pour le client UDP - socklen_t client_len = sizeof(client) ; // Taille du client pour la socket - couple_message message ; // Message lu sur la socket - char *ap_mac_string, *mobile_mac_string ; // Pointeurs pour retour de mac_bytes_to_string() - char *mobile_ip_string ; + int nread ; // recvfrom return value + struct sockaddr_in client; // UDP client structure + socklen_t client_len = sizeof(client) ; // Size of clients + couple_message message ; // Message read on the socket + char + *ap_mac_string, // Return pointers for mac_bytes_to_string() + *mobile_mac_string, + *mobile_ip_string ; // and ip_bytes_to_string() while (run) { - nread = recvfrom(sockfd, &message, sizeof(message), 0, (struct sockaddr *) &client, &client_len) ; + nread = recvfrom(sockfd, &message, sizeof(message), 0, + (struct sockaddr *) &client, &client_len) ; if (nread <= 0) { if (run) { - fprintf(stderr, "Aucun message reçu du client !\n") ; + fprintf(stderr, "No message received from client!\n") ; ret = ERR_NO_MESSAGE_RECEIVED ; } break ; } - ap_mac_string = mac_bytes_to_string(message.ap_mac_addr_bytes) ; - mobile_mac_string = mac_bytes_to_string(message.mobile_mac_addr_bytes) ; - mobile_ip_string = ip_bytes_to_string(message.mobile_ip_addr_bytes) ; - printf("\n\ -*** Message reçu du client ***\n\ -\tMAC AP : %s\n\ -\tMAC mobile : %s\n\ -\tIP mobile : %s\n\ -\tNuméro de séquence (heure de la demande) : %llu\n\ -\tHeure d'arrivée de la demande de localisation sur l'AP : %llu\n\ -\tSignal : %d dBm\n\ -\tPosition X : %f\n\ -\tPosition Y : %f\n\ -\tPosition Z : %f\n\ -\tDirection : %hhd\n\ -", + ap_mac_string = + mac_bytes_to_string(message.ap_mac_addr_bytes) ; + mobile_mac_string = + mac_bytes_to_string(message.mobile_mac_addr_bytes) ; + mobile_ip_string = + ip_bytes_to_string(message.mobile_ip_addr_bytes) ; + printf("\n" + "*** Message received from client ***\n" + "\tAP MAC: %s\n" + "\tMobile MAC: %s\n" + "\tMobile IP: %s\n" + "\tSequence number (request timestamp): %llu\n" + "\tRequest arrival time on the AP: %llu\n" + "\tSignal: %d dBm\n" + "\tPosition X: %f\n" + "\tPosition Y: %f\n" + "\tPosition Z: %f\n" + "\tDirection: %hhd\n" + , ap_mac_string, mobile_mac_string, mobile_ip_string, @@ -274,7 +288,10 @@ int read_loop(int sockfd) -/* Fonction du thread, qui surveille la liste et envoie les infos au serveur de localisation au bout du timeout */ +/* + * Thread function. Monitors the list and sends information to the + * localisation server when the timeout is reached. + */ void* monitor_couple_list(couple_list **couples) { couple_list *couple_ptr, *couple_prev ; @@ -282,7 +299,12 @@ void* monitor_couple_list(couple_list **couples) struct timeval current_time ; FILE *fd = NULL ; char *ap_mac_string ; - unsigned long sub ; // Résultat de sub_date(). + unsigned long sub ; // sub_date() result + + unsigned long aggregate_timeout = + (unsigned long) cfg_getint(cfg, "aggregate_timeout") ; + unsigned long keep_timeout = + (unsigned long) cfg_getint(cfg, "keep_timeout") ; struct sockaddr_in serv; struct sockaddr_in client ; @@ -291,14 +313,17 @@ void* monitor_couple_list(couple_list **couples) couple_info info; int sockfd; - sockfd = create_udp_sending_socket(cfg_getstr(cfg, "positioner_ip"), cfg_getint(cfg, "positioner_port"), &serv, &client); + sockfd = create_udp_sending_socket(cfg_getstr(cfg, "positioner_ip"), + cfg_getint(cfg, "positioner_port"), + &serv, &client) ; - fd = fopen(cfg_getstr(cfg, "output_file"), "a") ; // Ouverture du fichier de sortie en ajout - if (fd == NULL) // Si ouverture échouée, + /* Open output file */ + fd = fopen(cfg_getstr(cfg, "output_file"), "a") ; // We use add mode + if (fd == NULL) // If we failed to open the file, { - perror("Impossible d'ouvrir le fichier de sortie ") ; - fprintf(stderr, "Redirection de la sortie sur la sortie standard.") ; - fd = stdout ; // on redirige sur stdout + perror("Cannot open output file") ; + fprintf(stderr, "Redirecting output to standard output.") ; + fd = stdout ; // we fail back to stdout. } while (run) @@ -308,28 +333,37 @@ void* monitor_couple_list(couple_list **couples) couple_info_ptr = NULL ; gettimeofday(¤t_time, NULL) ; - while (couple_ptr != NULL) // Parcours de la liste + while (couple_ptr != NULL) // Parsing list { sub = sub_date(couple_ptr->start_time, current_time) ; - if (couple_ptr->info != NULL) // Si le couple atteint n'a pas déjà été traité + // If the couple was not treated already + if (couple_ptr->info != NULL) { - if (sub > (unsigned long) cfg_getint(cfg, "aggregate_timeout")) // Si le timeout est atteint, + // If the timeout is reached + if (sub > aggregate_timeout) { - printf("* Timeout dépassé.") ; + printf("* Timeout reached.") ; #ifdef DEBUG - printf(" sub=%lu > aggregate_timeout=%ld\n", sub, cfg_getint(cfg, "aggregate_timeout")) ; + printf(" sub=%lu > aggregate_timeout=%ld\n", + sub, aggregate_timeout) ; #else // DEBUG putchar('\n') ; #endif // DEBUG #ifdef TIMESTAMP - fprintf(fd, "%llu;", timeval_to_ms(couple_ptr->request_time)) ; // Inscription de la date de la demande (sur le mobile) dans le fichier + // Print request mobile timestamp to the output file + fprintf(fd, "%llu;", + timeval_to_ms(couple_ptr->request_time)) ; #endif // TIMESTAMP - fprintf(fd, "%0.2f;%0.2f;%0.2f;%hhd", couple_ptr->x_position, couple_ptr->y_position, couple_ptr->z_position, couple_ptr->direction) ; // Inscription des infos du couple dans le fichier + // Print couple info to the output file + fprintf(fd, "%0.2f;%0.2f;%0.2f;%hhd", + couple_ptr->x_position, couple_ptr->y_position, + couple_ptr->z_position, couple_ptr->direction) ; - memcpy(demande.mobile_mac_addr_bytes, couple_ptr -> mobile_mac_addr_bytes, 6); - demande.request_time = couple_ptr->request_time; + memcpy(demande.mobile_mac_addr_bytes, + couple_ptr->mobile_mac_addr_bytes, 6) ; + demande.request_time = couple_ptr->request_time ; demande.nb_couples = 0 ; couple_info_ptr = couple_ptr->info ; @@ -338,23 +372,30 @@ void* monitor_couple_list(couple_list **couples) demande.nb_couples++; couple_info_ptr = couple_info_ptr->next ; } - sendto(sockfd, (void *)&demande, sizeof(request), 0, (struct sockaddr *)&serv, serv_len) ; + sendto(sockfd, (void *)&demande, sizeof(request), 0, + (struct sockaddr *)&serv, serv_len) ; - + // Send couples to the server and empty the list couple_info_ptr = couple_ptr->info ; - while (couple_info_ptr != NULL) // On envoi les couples au serveur et on vide la liste + while (couple_info_ptr != NULL) { - // Envoi des infos de l'AP vers le serveur de géolocalisation - memcpy(info.ap_mac_addr_bytes, couple_info_ptr->ap_mac_addr_bytes, 6); - info.antenna_signal_dbm = couple_info_ptr->antenna_signal_dbm - 0x100; - sendto(sockfd, (void *)&info, sizeof(couple_info), 0, (struct sockaddr *)&serv, serv_len); + // Send AP info to the localisation server + memcpy(info.ap_mac_addr_bytes, + couple_info_ptr->ap_mac_addr_bytes, 6) ; + info.antenna_signal_dbm = + couple_info_ptr->antenna_signal_dbm - 0x100 ; + sendto(sockfd, (void *)&info, sizeof(couple_info), + 0, (struct sockaddr *)&serv, serv_len) ; - // Inscription des infos de l'AP dans le fichier - ap_mac_string = mac_bytes_to_string(couple_info_ptr->ap_mac_addr_bytes) ; - fprintf(fd, ";%s;%d", ap_mac_string, couple_info_ptr->antenna_signal_dbm - 0x100) ; + // Print AP info to the output file + ap_mac_string = + mac_bytes_to_string(couple_info_ptr + ->ap_mac_addr_bytes) ; + fprintf(fd, ";%s;%d", ap_mac_string, + couple_info_ptr->antenna_signal_dbm - 0x100) ; free(ap_mac_string) ; - // Suppression du maillon + // Delete couple couple_info_ptr = couple_info_ptr->next ; free(couple_ptr->info) ; couple_ptr->info = couple_info_ptr ; @@ -364,74 +405,84 @@ void* monitor_couple_list(couple_list **couples) } } - else if (sub > (unsigned long) cfg_getint(cfg, "keep_timeout")) // Si le couple a été traité et que le temps de garde est écoulé + // If the couple was treated and keep timeout is reached + else if (sub > keep_timeout) { couple_list *couple_tmp = couple_ptr ; - printf("* Délai de garde dépassé.") ; + printf("* Keep timeout reached.") ; #ifdef DEBUG - printf(" sub=%lu > keep_timeout=%ld\n", sub, cfg_getint(cfg, "keep_timeout")) ; + printf(" sub=%lu > keep_timeout=%ld\n", + sub, keep_timeout) ; #else // DEBUG putchar('\n') ; #endif // DEBUG couple_ptr = couple_ptr->next ; - if (couple_prev == NULL) // Si on est en tête de liste, - *couples = couple_ptr ; // on positionne la tête sur le suivant - else - couple_prev->next = couple_ptr ; // sinon on positionne le suivant du précédent sur le suivant. + // If it is the first couple of the list + if (couple_prev == NULL) + *couples = couple_ptr ; // we shift the head + else // else we put the next of the previous on the next + couple_prev->next = couple_ptr ; free(couple_tmp) ; - continue ; // On saute les instructions pour aller au suivant puisque c'est déjà fait + continue ; } - // Couple suivant + // Next couple couple_prev = couple_ptr ; couple_ptr = couple_ptr->next ; } fflush(NULL) ; - usleep(cfg_getint(cfg, "check_interval")) ; // On attend avant de vérifier à nouveau + usleep(cfg_getint(cfg, "check_interval")) ; // Wait to check again } - /* Fermeture du fichier */ + /* Close output file */ if (fclose(fd) != 0) - perror("Erreur lors de la fermeture du fichier de sortie ") ; + perror("Error closing output file") ; return NULL ; } -/* Fonction appelée lors de la réception d'un paquet */ +/* + * Treats a received packet. + */ void got_couple_info(couple_list **couples, couple_message message) { couple_list *tmp_couple = NULL ; couple_info_list *tmp_info = NULL ; - struct timeval start_time ; // Heure de réception du paquet par l'agrégateur + struct timeval start_time ; // Reception time on the aggregator gettimeofday(&start_time, NULL) ; - /* Initialisation d'un nouveau sous-maillon */ + /* Create a new couple */ tmp_info = malloc(sizeof(couple_info_list)) ; memcpy(tmp_info->ap_mac_addr_bytes, message.ap_mac_addr_bytes, 6) ; tmp_info->antenna_signal_dbm = message.antenna_signal_dbm ; tmp_info->next = NULL ; - /* Ajout dans la liste */ + /* Add it in the list */ tmp_couple = *couples ; - if (*couples == NULL) // Si la liste de couples n'existe pas encore, + if (*couples == NULL) // If the couple list does not exist, { - printf("Création de la liste des couples.\n") ; - tmp_couple = malloc(sizeof(couple_list)) ; // on la crée. - memcpy(tmp_couple->mobile_mac_addr_bytes, message.mobile_mac_addr_bytes, 6) ; - if (timeval_to_ms(message.request_time) != 0) // Paquet explicite - tmp_couple->request_time = message.request_time ; // Heure d'émission par le mobile - else // Paquet implicite - tmp_couple->request_time = message.start_time ; // Heure de réception par l'AP - tmp_couple->start_time = start_time ; // Enregistrement de la date locale de l'agrégateur et non de la date de réception de la demande sur l'AP + printf("Creating couple list.\n") ; + tmp_couple = malloc(sizeof(couple_list)) ; // create it. + memcpy(tmp_couple->mobile_mac_addr_bytes, + message.mobile_mac_addr_bytes, 6) ; + if (timeval_to_ms(message.request_time) != 0) // Explicit packet + // Transmission time on the mobile: + tmp_couple->request_time = message.request_time ; + else // Implicit packet + // Reception time on the AP: + tmp_couple->request_time = message.start_time ; + // Save locale time on the aggregator (not the reception time + // on the AP): + tmp_couple->start_time = start_time ; tmp_couple->x_position = message.x_position ; tmp_couple->y_position = message.y_position ; tmp_couple->z_position = message.z_position ; @@ -440,39 +491,51 @@ void got_couple_info(couple_list **couples, couple_message message) tmp_couple->info = tmp_info ; *couples = tmp_couple ; } - else - { // Sinon on cherche si le couple existe déjà dans la liste - if (timeval_to_ms(message.request_time) != 0) // Paquet explicite + + else // If the couple list exists already + { // we search the list for the couple + if (timeval_to_ms(message.request_time) != 0) // Explicit packet { while (tmp_couple != NULL) - { // Critère : MAC et heure d'émission identiques. - if(mac_cmp(message.mobile_mac_addr_bytes, tmp_couple->mobile_mac_addr_bytes) == 1 - && sub_date(message.request_time, tmp_couple->request_time) == 0) - break ; // Si le couple existe déjà, on s'arrête dessus. + { // Research criterion: MAC and transmission time + if(mac_cmp(message.mobile_mac_addr_bytes, + tmp_couple->mobile_mac_addr_bytes) == 1 + && sub_date(message.request_time, + tmp_couple->request_time) == 0) + break ; // If the couple exists, we stop on it tmp_couple = tmp_couple->next ; } } - else // Paquet implicite + else // Implicit packet { while (tmp_couple != NULL) - { // Critère : MAC identiques et décalage des heures de réception par les AP d'au maximum 10 ms. - if(mac_cmp(message.mobile_mac_addr_bytes, tmp_couple->mobile_mac_addr_bytes) == 1 - && sub_date(message.start_time, tmp_couple->request_time) <= 10) // TODO : définir un paramètre pour le décalage maximal - break ; // Si le couple existe déjà, on s'arrête dessus. + { // Research criterion: MAC addresses equals and reception + // times on the APs less than 10 ms + // TODO : define an option for the maximal difference time. + if(mac_cmp(message.mobile_mac_addr_bytes, + tmp_couple->mobile_mac_addr_bytes) == 1 + && sub_date(message.start_time, + tmp_couple->request_time) <= 10) + break ; // If the couple exists, we stop on it tmp_couple = tmp_couple->next ; } } - if (tmp_couple == NULL) // Si couple inexistant dans la liste + if (tmp_couple == NULL) // If the couple does not exist in the list, { - printf("Création du couple.\n") ; - tmp_couple = malloc(sizeof(couple_list)) ; // on crée un nouveau couple. - memcpy(tmp_couple->mobile_mac_addr_bytes, message.mobile_mac_addr_bytes, 6) ; - if (timeval_to_ms(message.request_time) != 0) // Paquet explicite - tmp_couple->request_time = message.request_time ; // Heure d'émission par le mobile - else // Paquet implicite - tmp_couple->request_time = message.start_time ; // Heure de réception par l'AP - tmp_couple->start_time = start_time ; // Enregistrement de la date locale de l'agrégateur et non de la date de réception de la demande sur l'AP + printf("Create new couple.\n") ; + tmp_couple = malloc(sizeof(couple_list)) ; // create it. + memcpy(tmp_couple->mobile_mac_addr_bytes, + message.mobile_mac_addr_bytes, 6) ; + if (timeval_to_ms(message.request_time) != 0) // Explicit packet + // Transmission time on the mobile: + tmp_couple->request_time = message.request_time ; + else // Implicit packet + // Reception time on the AP: + tmp_couple->request_time = message.start_time ; + // Save locale time on the aggregator (not the reception time + // on the AP): + tmp_couple->start_time = start_time ; tmp_couple->x_position = message.x_position ; tmp_couple->y_position = message.y_position ; tmp_couple->z_position = message.z_position ; @@ -481,17 +544,17 @@ void got_couple_info(couple_list **couples, couple_message message) tmp_couple->info = tmp_info ; *couples = tmp_couple ; } - else // Si couple trouvé dans la liste + else // If the couple was found in the list { - if (tmp_couple->info == NULL) // Si on a déjà envoyé les infos de ce couple au serveur - { - printf("Demande déjà traitée.\n") ; + if (tmp_couple->info == NULL) + { // We already sent to the server data for this couple + printf("Request already treated.\n") ; free(tmp_info) ; } else { - printf("Ajout des informations au couple.\n") ; - tmp_info->next = tmp_couple->info ; // on ajoute l'info. + printf("Add information to the couple.\n") ; + tmp_info->next = tmp_couple->info ; // Add data tmp_couple->info = tmp_info ; } } @@ -500,7 +563,7 @@ void got_couple_info(couple_list **couples, couple_message message) -/* Vide la liste chaînée de couples */ +/* Empty the couple list */ void free_couple_list(couple_list **couples) { couple_list *couple_ptr = *couples ; @@ -527,35 +590,37 @@ void free_couple_list(couple_list **couples) #ifdef DEBUG -/* Affiche la liste des couples */ +/* Prints the couple list */ void print_couple_list(couple_list *couples) { couple_list *couple_ptr = couples ; couple_info_list *info_ptr = NULL ; char *mobile_mac_string ; - if (couples == NULL) // Si la liste est vide + if (couples == NULL) // Empty list { - printf("Aucun couple.\n") ; // on l'affiche. + printf("Aucun couple.\n") ; return ; } while (couple_ptr != NULL) { - info_ptr = couple_ptr->info ; // On récupère le pointeur de la sous-liste + info_ptr = couple_ptr->info ; // Get the sub-list pointer - mobile_mac_string = mac_bytes_to_string(couple_ptr->mobile_mac_addr_bytes) ; - printf("MAC du mobile : %s\n\ -Numéro de séquence : %llu\n\ -Heure de réception de la demande de localisation : %llu\n\ -\n", + mobile_mac_string = + mac_bytes_to_string(couple_ptr->mobile_mac_addr_bytes) ; + printf("Mobile MAC: %s\n" + "Sequence number: %llu\n" + "Reception timestamp: %llu\n" + "\n", mobile_mac_string, timeval_to_ms(couple_ptr->request_time), timeval_to_ms(couple_ptr->start_time) ) ; free(mobile_mac_string) ; - while (info_ptr != NULL) // On parcourt toutes les informations relative au couple courant + // Parse information relative to the current couple + while (info_ptr != NULL) { print_couple_info(info_ptr) ; putchar('\n') ; @@ -570,7 +635,7 @@ Heure de réception de la demande de localisation : %llu\n\ -/* Affiche un maillon d'une couple_info_list */ +/* Prints an element of a couple_info_list */ void print_couple_info(couple_info_list *info) { char *ap_mac_string ; @@ -578,8 +643,8 @@ void print_couple_info(couple_info_list *info) return ; ap_mac_string = mac_bytes_to_string(info->ap_mac_addr_bytes) ; - printf("\tMAC de l'AP : %s\n\ -\tPuissance du signal : %d dBm\n", + printf("\tAP MAC: %s\n" + "\tSignal strength: %d dBm\n", ap_mac_string, info->antenna_signal_dbm - 0x100 ) ; @@ -613,22 +678,34 @@ char* ip_bytes_to_string(unsigned char *ip_binary) -/* Affiche le mode d'emploi du programme */ void print_usage() { - printf("Usage :\n\ -\t%s [-f config_file] [-l listening_port] [-i positionner_ip] [-p positioner_port] [-a aggregate_timeout] [-k keep_timeout] [-c check_interval] [-o output_file]\n\ -Options générales :\n\ -\t-f config_file : spécifie un fichier de configuration à lire à la place du fichier par défaut.\n\ -Options serveur :\n\ -\t-l listening_port : seules les demandes envoyées sur ce port seront retenues (défaut : %d).\n\ -\t-i positionner_ip : adresse IP du serveur de calcul auquel seront transmises les demandes (défaut : %s).\n\ -\t-p positioner_port : les demandes agrégées seront transmises sur ce port du serveur de calcul (défaut : %d).\n\ -Options d'agrégation :\n\ -\t-a aggregate_timeout : temps d'agrégation (défaut : %d millisecondes)\n\ -\t-k keep_timeout : temps de garde des demandes (défaut : %d millisecondes)\n\ -\t-c check_interval : délai entre deux vérifications des demandes en mémoire, et agrégation (défaut : %d micro-secondes)\n\ -", + printf("Usage:\n" + "\t%s [-f config_file] [-l listening_port] [-i positionner_ip]" + " [-p positioner_port] [-a aggregate_timeout] [-k keep_timeout]" + " [-c check_interval] [-o output_file]\n" + + "Main options:\n" + "\t-f config_file\tUse 'config_file' instead of the default" + " configuration file.\n" + + "Server options:\n" + "\t-l listening_port\tOnly requests sent on this port will be" + " treated (default: %d).\n" + "\t-i positionner_ip\tIP address of the localisation server" + " (default: %s).\n" + "\t-p positioner_port\tAggregated requests are transmitted to" + " the localisation server on this port (default: %d).\n" + + "Aggregation options:\n" + "\t-a aggregate_timeout\tRequests are stored during" + " 'aggregate_timeout' before to be grouped (default:" + " %d millisecondes).\n" + "\t-k keep_timeout\t\tAggregated requests are kept during" + " 'keep_timeout' milliseconds (default: %d milliseconds).\n" + "\t-c check_interval\tTime between two checks of the stored" + " requests (default\t%d microseconds).\n" + , program_name, AGGREGATE_DEFAULT_PORT, POSITIONER_DEFAULT_IP,