Reconstitution du dépôt, étape 1
Le commentaire de révision initial figure ci-dessous. Les différences par rapport à ce commit sont les suivantes : - client/ : la version binaire n'est pas versionnée, ni "toutes.csv". - Non-suppression de clientinfo.* et de guinumo.* (on verra plus tard). - Les fichiers de conf restent dans le répertoire "cfg", qui n'est pas supprimé. - Le répertoire "csv" reste vide (les données d'entrée n'ont pas à être versionnées). - Le répertoire "log" n'est pas supprimé. | r89 | jgraeffly | 2009-05-15 14:54:13 +0200 (ven 15 mai 2009) | 11 lines | Chemins modifiés : | R /code/owlps-positioning/Makefile | D /code/owlps-positioning/TODO | D /code/owlps-positioning/cfg | A /code/owlps-positioning/client | A /code/owlps-positioning/client/Client | A /code/owlps-positioning/client/Client.cc | A /code/owlps-positioning/client/toutes.csv | D /code/owlps-positioning/clientinfo.cc | D /code/owlps-positioning/clientinfo.hh | R /code/owlps-positioning/csv | A /code/owlps-positioning/csv/minipc.cfg | A /code/owlps-positioning/csv/topo.csv | A /code/owlps-positioning/csv/toutes.csv | A /code/owlps-positioning/csv/waypoints.csv | D /code/owlps-positioning/guinumo.cc | D /code/owlps-positioning/guinumo.hh | D /code/owlps-positioning/log | A /code/owlps-positioning/positioning.cc | A /code/owlps-positioning/positioning.hh | R /code/owlps-positioning/server.cc | R /code/owlps-positioning/server.hh | A /code/owlps-positioning/treatment.cc | A /code/owlps-positioning/treatment.hh | | - Création du serveur qui reçois les informations à partir du client | se trouvant dans le dossier client/ | - Implémentation de la partie calcul dans le serveur (les résultats | sont cependant les mêmes qu'avant il n'y a pour l'instant pas eu de | modifications sur le traitement). | - En sortie, on retrouve le résultat de chaques algo. | - Sur cette version il n'y a pas encore de commentaires ceci a été | fait afin d'avoir une meilleure visualisation du programme. | - La réception des données se fait pour l'instant toujours grâce à un | vector | - positioning.cc est une classe qui contient les informations sur la | topologie les AP ainsi que les points de référence. | - server.cc contient les méthodes qui permet de recevoir les clients | et implémente positioning.cc avec les informations reçues par des | fichiers ces fichiers sont dans csv/ | - treatment.cc est une classe contenant les différents Algo permettant | de calculer la position. | - Pour éxécuter le programme : owlps-positioningd csv/minipc.cfg | csv/toutes.csv csv/topo.csv csv/waypoints.csv git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@90 785a6c6c-259e-4ff1-8b91-dc31627914f0
This commit is contained in:
parent
4784fb00df
commit
191109c5b0
|
@ -4,32 +4,35 @@ GXXFLAGS = $(DEBUG) -Wall -pedantic
|
|||
LD = g++
|
||||
LDFLAGS = -lm
|
||||
|
||||
TARGET = guinumo
|
||||
HEADER = guinumo.hh
|
||||
TARGET = owlps-positioningd
|
||||
HEADER = owlps-positioning.hh
|
||||
|
||||
all : ${TARGET}
|
||||
@rm -f *~ *.o
|
||||
|
||||
|
||||
% : %.o
|
||||
$(LD) $(LDFLAGS) -o $@ $^
|
||||
%.o : %.cc $(HEADER)
|
||||
$(GXX) $(GXXFLAGS) -c $<
|
||||
|
||||
clientinfo.o : clientinfo.hh point.hh
|
||||
server.o : server.hh clientinfo.hh referencepoint.hh accesspoint.hh point.hh measurement.hh area.hh
|
||||
positioning.o : point.hh referencepoint.hh accesspoint.hh area.hh
|
||||
server.o : server.hh positioning.hh point.hh measurement.hh treatment.hh
|
||||
referencepoint.o : referencepoint.hh measurement.hh point.hh
|
||||
accesspoint.o : accesspoint.hh point.hh
|
||||
point.o : point.hh
|
||||
measurement.o : measurement.hh
|
||||
area.o : area.hh point.hh
|
||||
guinumo.o : point.hh measurement.hh accesspoint.hh referencepoint.hh clientinfo.hh server.hh
|
||||
treatment.o : treatment.hh point.hh measurement.hh referencepoint.hh accesspoint.hh
|
||||
owlps-positioning.o : server.hh
|
||||
|
||||
${TARGET} : point.o measurement.o accesspoint.o referencepoint.o clientinfo.o server.o area.o
|
||||
${TARGET} : point.o measurement.o accesspoint.o referencepoint.o positioning.o server.o area.o treatment.o
|
||||
|
||||
clean:
|
||||
@rm -fv *~ *.o
|
||||
|
||||
purge : clean
|
||||
@rm -fv guinumo
|
||||
@rm -fv owlps-positioningd
|
||||
|
||||
install :
|
||||
@echo "La cible d'installation de ${TARGET} sera implémentée prochainement. Vous devez lancer le programme 'guinumo' depuis le répertoire des sources."
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
* ClientInfo : classe qui doit contenir les données des utilisateurs.
|
||||
- IP,
|
||||
- Socket,
|
||||
→ plus tard, pour une vraie démo.
|
|
@ -0,0 +1,443 @@
|
|||
#include <iwlib.h>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <net/if.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef struct _couple_info{
|
||||
unsigned char ap_mac_addr_bytes[6]; // Adresse MAC de l'AP
|
||||
int antenna_signal_dbm; // Puissance du signal reçu par l'AP
|
||||
} couple_info;
|
||||
|
||||
typedef struct _demande{
|
||||
unsigned char ag_mac_addr_bytes[6]; // Adresse MAC de l'Aggregateur émetteur de la demande
|
||||
int nb_couples; // Nombre couples (MAC AP;Puissance)
|
||||
} demande;
|
||||
|
||||
char* mac_bytes_to_string(unsigned char *mac_binary) ;
|
||||
int create_udp_sending_socket(char *server_address, int server_port, struct sockaddr_in *server_description, struct sockaddr_in * client_description) ;
|
||||
void get_mac_addr(char *eth, unsigned char mac_bytes[6]);
|
||||
int split(string buffer, vector<couple_info> &envoi_info);
|
||||
unsigned char convertuchar(char *caractere, int);
|
||||
|
||||
int main(int argc, char **argv){
|
||||
|
||||
int sockfd, n = 0;
|
||||
struct sockaddr_in serv;
|
||||
struct sockaddr_in client;
|
||||
unsigned char mac[6];
|
||||
ifstream fichier(argv[3]);
|
||||
string cppbuffer;
|
||||
|
||||
vector<couple_info> envoi_info;
|
||||
demande envoi_demande;
|
||||
|
||||
|
||||
if (argc != 4){
|
||||
cerr << "usage: Client IPaddress interface fichier" << endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
sockfd = create_udp_sending_socket(argv[1], 1234, &serv, &client);
|
||||
|
||||
if(sockfd < 0){
|
||||
cerr << "Erreur ! Impossible de créer la socket vers le serveur de localisation" << endl;
|
||||
return 1;
|
||||
}
|
||||
get_mac_addr(argv[2], mac) ;
|
||||
memcpy(envoi_demande.ag_mac_addr_bytes, mac, 6);
|
||||
|
||||
if(fichier){
|
||||
getline(fichier, cppbuffer);
|
||||
envoi_demande.nb_couples = split(cppbuffer, envoi_info);
|
||||
}
|
||||
|
||||
n = sendto(sockfd, (void *)&envoi_demande, sizeof(envoi_demande), 0, (struct sockaddr *)&serv, (socklen_t) sizeof(serv)) ;
|
||||
|
||||
for(int i = 0; i < envoi_demande.nb_couples; i++)
|
||||
sendto(sockfd, (void *)&envoi_info.at(i), sizeof(couple_info), 0, (struct sockaddr *)&serv, (socklen_t) sizeof(serv));
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void get_mac_addr(char *eth, unsigned char mac_bytes[6])
|
||||
{
|
||||
struct ifreq ifr;
|
||||
int sockfd ;
|
||||
|
||||
bzero(mac_bytes, sizeof(unsigned char) * 6) ; // RàZ
|
||||
|
||||
sockfd = socket(AF_INET, SOCK_DGRAM, 0) ;
|
||||
if(sockfd < 0)
|
||||
perror("Impossible d'ouvrir la socket pour récupérer l'adresse MAC ") ;
|
||||
|
||||
strncpy(ifr.ifr_name, eth, IFNAMSIZ) ;
|
||||
|
||||
if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0)
|
||||
return ;
|
||||
|
||||
if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0)
|
||||
return ;
|
||||
|
||||
memcpy(mac_bytes, ifr.ifr_hwaddr.sa_data, 6) ;
|
||||
}
|
||||
|
||||
int split(string buffer, vector<couple_info> &envoi_info){
|
||||
|
||||
unsigned char mac[6];
|
||||
int valueI;
|
||||
char c[4];
|
||||
couple_info elem;
|
||||
int i = 0;
|
||||
int nb = 0;
|
||||
|
||||
while(i < buffer.size()){
|
||||
|
||||
for(int j = 0; j < 6; j++){
|
||||
c[0] = buffer[i++];
|
||||
c[1] = buffer[i++];
|
||||
c[2] = '\0';
|
||||
mac[j] = convertuchar(c, 0);
|
||||
i++;
|
||||
}
|
||||
c[0] = buffer[i++];
|
||||
c[1] = buffer[i++];
|
||||
c[2] = buffer[i++];
|
||||
c[3] = '\0';
|
||||
i++;
|
||||
valueI = atoi(c);
|
||||
memcpy(elem.ap_mac_addr_bytes, mac, 6);
|
||||
elem.antenna_signal_dbm = valueI;
|
||||
envoi_info.resize(nb+1);
|
||||
envoi_info.at(nb) = elem;
|
||||
nb++;
|
||||
}
|
||||
|
||||
return nb;
|
||||
}
|
||||
|
||||
char* mac_bytes_to_string(unsigned char *mac_binary)
|
||||
{
|
||||
char *ret = (char *)malloc(sizeof(char) * 18) ;
|
||||
|
||||
sprintf(ret, "%02x:%02x:%02x:%02x:%02x:%02x", mac_binary[0], mac_binary[1], mac_binary[2], mac_binary[3], mac_binary[4], mac_binary[5]) ;
|
||||
ret[17] = '\0' ;
|
||||
|
||||
return ret ;
|
||||
}
|
||||
|
||||
int create_udp_sending_socket(char *server_address, int server_port, struct sockaddr_in *server_description, struct sockaddr_in * client_description){
|
||||
|
||||
int sockfd ; // Descripteur de la socket
|
||||
|
||||
/* Ceation de la socket UDP */
|
||||
sockfd = socket(AF_INET, SOCK_DGRAM, 0) ;
|
||||
if (sockfd < 0){
|
||||
cerr << "Échec de la création de la socket " << endl;
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
/* Remise à zéro et initialisation de la structure du client */
|
||||
bzero((char *) client_description, sizeof(*client_description)) ;
|
||||
client_description->sin_family = AF_INET ; // Socket INET
|
||||
client_description->sin_addr.s_addr = htonl(INADDR_ANY) ; // Toutes les connexions
|
||||
|
||||
/* Remise à zéro et initialisation de la structure du serveur */
|
||||
bzero((char *) server_description, sizeof(*server_description)) ; // RÀZ
|
||||
server_description->sin_family = AF_INET ; // Socket INET
|
||||
server_description->sin_addr.s_addr = inet_addr(server_address) ; // Adresse du serveur
|
||||
server_description->sin_port = htons(server_port) ; // Port d'écoute du serveur
|
||||
|
||||
return sockfd ; // On retourne le descripteur de la socket créée
|
||||
}
|
||||
|
||||
unsigned char convertuchar(char *caractere, int debut) {
|
||||
|
||||
int i = debut;
|
||||
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '0') return 0x00;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '1') return 0x01;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '2') return 0x02;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '3') return 0x03;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '4') return 0x04;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '5') return 0x05;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '6') return 0x06;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '7') return 0x07;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '8') return 0x08;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == '9') return 0x09;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == 'a') return 0x0a;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == 'b') return 0x0b;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == 'c') return 0x0c;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == 'd') return 0x0d;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == 'e') return 0x0e;
|
||||
if (caractere[i] == '0' && caractere[i + 1] == 'f') return 0x0f;
|
||||
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '0') return 0x10;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '1') return 0x11;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '2') return 0x12;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '3') return 0x13;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '4') return 0x14;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '5') return 0x15;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '6') return 0x16;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '7') return 0x17;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '8') return 0x18;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == '9') return 0x19;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == 'a') return 0x1a;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == 'b') return 0x1b;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == 'c') return 0x1c;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == 'd') return 0x1d;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == 'e') return 0x1e;
|
||||
if (caractere[i] == '1' && caractere[i + 1] == 'f') return 0x1f;
|
||||
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '0') return 0x20;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '1') return 0x21;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '2') return 0x22;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '3') return 0x23;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '4') return 0x24;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '5') return 0x25;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '6') return 0x26;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '7') return 0x27;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '8') return 0x28;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == '9') return 0x29;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == 'a') return 0x2a;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == 'b') return 0x2b;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == 'c') return 0x2c;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == 'd') return 0x2d;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == 'e') return 0x2e;
|
||||
if (caractere[i] == '2' && caractere[i + 1] == 'f') return 0x2f;
|
||||
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '0') return 0x30;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '1') return 0x31;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '2') return 0x32;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '3') return 0x33;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '4') return 0x34;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '5') return 0x35;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '6') return 0x36;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '7') return 0x37;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '8') return 0x38;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == '9') return 0x39;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == 'a') return 0x3a;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == 'b') return 0x3b;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == 'c') return 0x3c;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == 'd') return 0x3d;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == 'e') return 0x3e;
|
||||
if (caractere[i] == '3' && caractere[i + 1] == 'f') return 0x3f;
|
||||
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '0') return 0x40;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '1') return 0x41;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '2') return 0x42;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '3') return 0x43;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '4') return 0x44;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '5') return 0x45;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '6') return 0x46;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '7') return 0x47;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '8') return 0x48;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == '9') return 0x49;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == 'a') return 0x4a;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == 'b') return 0x4b;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == 'c') return 0x4c;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == 'd') return 0x4d;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == 'e') return 0x4e;
|
||||
if (caractere[i] == '4' && caractere[i + 1] == 'f') return 0x4f;
|
||||
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '0') return 0x50;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '1') return 0x51;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '2') return 0x52;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '3') return 0x53;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '4') return 0x54;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '5') return 0x55;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '6') return 0x56;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '7') return 0x57;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '8') return 0x58;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == '9') return 0x59;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == 'a') return 0x5a;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == 'b') return 0x5b;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == 'c') return 0x5c;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == 'd') return 0x5d;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == 'e') return 0x5e;
|
||||
if (caractere[i] == '5' && caractere[i + 1] == 'f') return 0x5f;
|
||||
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '0') return 0x60;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '1') return 0x61;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '2') return 0x62;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '3') return 0x63;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '4') return 0x64;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '5') return 0x65;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '6') return 0x66;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '7') return 0x67;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '8') return 0x68;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == '9') return 0x69;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == 'a') return 0x6a;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == 'b') return 0x6b;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == 'c') return 0x6c;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == 'd') return 0x6d;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == 'e') return 0x6e;
|
||||
if (caractere[i] == '6' && caractere[i + 1] == 'f') return 0x6f;
|
||||
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '0') return 0x70;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '1') return 0x71;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '2') return 0x72;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '3') return 0x73;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '4') return 0x74;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '5') return 0x75;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '6') return 0x76;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '7') return 0x77;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '8') return 0x78;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == '9') return 0x79;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == 'a') return 0x7a;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == 'b') return 0x7b;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == 'c') return 0x7c;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == 'd') return 0x7d;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == 'e') return 0x7e;
|
||||
if (caractere[i] == '7' && caractere[i + 1] == 'f') return 0x7f;
|
||||
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '0') return 0x80;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '1') return 0x81;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '2') return 0x82;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '3') return 0x83;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '4') return 0x84;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '5') return 0x85;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '6') return 0x86;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '7') return 0x87;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '8') return 0x88;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == '9') return 0x89;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == 'a') return 0x8a;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == 'b') return 0x8b;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == 'c') return 0x8c;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == 'd') return 0x8d;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == 'e') return 0x8e;
|
||||
if (caractere[i] == '8' && caractere[i + 1] == 'f') return 0x8f;
|
||||
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '0') return 0x90;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '1') return 0x91;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '2') return 0x92;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '3') return 0x93;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '4') return 0x94;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '5') return 0x95;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '6') return 0x96;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '7') return 0x97;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '8') return 0x98;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == '9') return 0x99;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == 'a') return 0x9a;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == 'b') return 0x9b;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == 'c') return 0x9c;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == 'd') return 0x9d;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == 'e') return 0x9e;
|
||||
if (caractere[i] == '9' && caractere[i + 1] == 'f') return 0x9f;
|
||||
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '0') return 0xa0;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '1') return 0xa1;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '2') return 0xa2;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '3') return 0xa3;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '4') return 0xa4;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '5') return 0xa5;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '6') return 0xa6;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '7') return 0xa7;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '8') return 0xa8;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == '9') return 0xa9;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == 'a') return 0xaa;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == 'b') return 0xab;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == 'c') return 0xac;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == 'd') return 0xad;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == 'e') return 0xae;
|
||||
if (caractere[i] == 'a' && caractere[i + 1] == 'f') return 0xaf;
|
||||
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '0') return 0xb0;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '1') return 0xb1;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '2') return 0xb2;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '3') return 0xb3;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '4') return 0xb4;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '5') return 0xb5;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '6') return 0xb6;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '7') return 0xb7;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '8') return 0xb8;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == '9') return 0xb9;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == 'a') return 0xba;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == 'b') return 0xbb;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == 'c') return 0xbc;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == 'd') return 0xbd;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == 'e') return 0xbe;
|
||||
if (caractere[i] == 'b' && caractere[i + 1] == 'f') return 0xbf;
|
||||
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '0') return 0xc0;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '1') return 0xc1;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '2') return 0xc2;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '3') return 0xc3;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '4') return 0xc4;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '5') return 0xc5;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '6') return 0xc6;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '7') return 0xc7;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '8') return 0xc8;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == '9') return 0xc9;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == 'a') return 0xca;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == 'b') return 0xcb;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == 'c') return 0xcc;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == 'd') return 0xcd;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == 'e') return 0xce;
|
||||
if (caractere[i] == 'c' && caractere[i + 1] == 'f') return 0xcf;
|
||||
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '0') return 0xd0;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '1') return 0xd1;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '2') return 0xd2;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '3') return 0xd3;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '4') return 0xd4;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '5') return 0xd5;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '6') return 0xd6;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '7') return 0xd7;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '8') return 0xd8;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == '9') return 0xd9;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == 'a') return 0xda;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == 'b') return 0xdb;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == 'c') return 0xdc;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == 'd') return 0xdd;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == 'e') return 0xde;
|
||||
if (caractere[i] == 'd' && caractere[i + 1] == 'f') return 0xdf;
|
||||
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '0') return 0xe0;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '1') return 0xe1;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '2') return 0xe2;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '3') return 0xe3;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '4') return 0xe4;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '5') return 0xe5;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '6') return 0xe6;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '7') return 0xe7;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '8') return 0xe8;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == '9') return 0xe9;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == 'a') return 0xea;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == 'b') return 0xeb;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == 'c') return 0xec;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == 'd') return 0xed;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == 'e') return 0xee;
|
||||
if (caractere[i] == 'e' && caractere[i + 1] == 'f') return 0xef;
|
||||
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '0') return 0xf0;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '1') return 0xf1;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '2') return 0xf2;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '3') return 0xf3;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '4') return 0xf4;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '5') return 0xf5;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '6') return 0xf6;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '7') return 0xf7;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '8') return 0xf8;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == '9') return 0xf9;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == 'a') return 0xfa;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == 'b') return 0xfb;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == 'c') return 0xfc;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == 'd') return 0xfd;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == 'e') return 0xfe;
|
||||
if (caractere[i] == 'f' && caractere[i + 1] == 'f') return 0xff;
|
||||
|
||||
return 0x00;
|
||||
}
|
|
@ -0,0 +1,651 @@
|
|||
#include "positioning.hh"
|
||||
|
||||
template <class T>
|
||||
inline T from_string(const string &s)
|
||||
{
|
||||
|
||||
T t;
|
||||
istringstream iss(s);
|
||||
|
||||
iss >> t;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
inline float round_float(float f, int n)
|
||||
{
|
||||
n = (int) pow((double) 10, (double) n) ;
|
||||
float f_dec = modff(f, &f) ;
|
||||
f_dec = floor(f_dec * n) / n ;
|
||||
|
||||
return f + f_dec ;
|
||||
}
|
||||
|
||||
inline vector<string> explode(const string &input, const char &sep)
|
||||
{
|
||||
vector<string> vs;
|
||||
string tmp;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < input.size() ; i++)
|
||||
if (input[i] == sep)
|
||||
{
|
||||
vs.push_back(tmp);
|
||||
tmp.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp.push_back(input[i]);
|
||||
}
|
||||
|
||||
vs.push_back(tmp);
|
||||
tmp.clear();
|
||||
|
||||
return vs;
|
||||
}
|
||||
|
||||
inline vector<string> extractReferencePointInfoFromBuffer(const string &buffer_in)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
string tmp_field;
|
||||
vector<string> ret;
|
||||
|
||||
while (buffer_in[i] != ';')
|
||||
{
|
||||
tmp_field.push_back(buffer_in[i]);
|
||||
i++;
|
||||
}
|
||||
ret.push_back(tmp_field);
|
||||
tmp_field.clear();
|
||||
i++; // go after the ';'
|
||||
|
||||
while (buffer_in[i] != ';')
|
||||
{
|
||||
tmp_field.push_back(buffer_in[i]);
|
||||
i++;
|
||||
}
|
||||
ret.push_back(tmp_field);
|
||||
tmp_field.clear();
|
||||
i++;
|
||||
|
||||
while (buffer_in[i] != ';')
|
||||
{
|
||||
tmp_field.push_back(buffer_in[i]);
|
||||
i++;
|
||||
}
|
||||
ret.push_back(tmp_field);
|
||||
tmp_field.clear();
|
||||
i++;
|
||||
|
||||
while (buffer_in[i] != ';')
|
||||
{
|
||||
tmp_field.push_back(buffer_in[i]);
|
||||
i++;
|
||||
}
|
||||
ret.push_back(tmp_field);
|
||||
tmp_field.clear();
|
||||
i++;
|
||||
|
||||
while (i <= buffer_in.size())
|
||||
{
|
||||
if ((buffer_in[i] == ';' || i == buffer_in.size()) && !tmp_field.empty()) // Si on est sur un séparateur et que la valeur lue n'est pas vide,
|
||||
{
|
||||
ret.push_back(tmp_field) ; // on met la valeur lue dans les valeurs de retour.
|
||||
tmp_field.clear() ;
|
||||
}
|
||||
else // Si on n'est pas sur un séparateur,
|
||||
tmp_field.push_back(buffer_in[i]) ; // on ajoute le caractère courant à la suite de la valeur lue.
|
||||
|
||||
i++ ;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Positioning::makeReferencePointListFromFile(const string &filename, const bool uniq_point)
|
||||
{
|
||||
|
||||
ifstream input_file ; // Flux d'entrée du fichier.
|
||||
string cpp_buffer ; // Buffer au format string.
|
||||
ReferencePoint rp;
|
||||
Point tmp_point;
|
||||
float x, y, z ; // Coordonnées des points.
|
||||
unsigned int pt_idx = 0 ; // Position du point lu dans la liste.
|
||||
vector<string> infos ; // Liste des informations lues dans une ligne du fichier.
|
||||
|
||||
input_file.open(filename.c_str()) ;
|
||||
if (input_file.fail())
|
||||
{
|
||||
cerr << "Error opening input file « " << filename << " » !" << endl ;
|
||||
return ;
|
||||
}
|
||||
|
||||
while (!input_file.eof())
|
||||
{
|
||||
getline(input_file, cpp_buffer);
|
||||
|
||||
if ((input_file.rdstate() & ifstream::eofbit) == 0)
|
||||
{
|
||||
if (cpp_buffer.size() == 0) // Ignorer une ligne vide
|
||||
continue ;
|
||||
|
||||
infos = extractReferencePointInfoFromBuffer(cpp_buffer);
|
||||
x = from_string<float>(infos[0]);
|
||||
y = from_string<float>(infos[1]);
|
||||
z = from_string<float>(infos[2]);
|
||||
|
||||
tmp_point.setX(x);
|
||||
tmp_point.setY(y);
|
||||
tmp_point.setZ(z);
|
||||
|
||||
if (!uniq_point || !pointExists(reference_point_list, tmp_point)) // Si on ne veut pas de points unique, ou que le point n'existe pas encore,{
|
||||
{
|
||||
rp.setCoordinates(tmp_point);
|
||||
reference_point_list.push_back(rp); // on le crée.
|
||||
pt_idx = reference_point_list.size() - 1; // Le point que l'on vient d'ajouter est le dernier du vector.
|
||||
}
|
||||
else // Le point existe déjà :
|
||||
{
|
||||
pt_idx = pointIndex(reference_point_list, tmp_point) ; // On recherche le point auquel on veut ajouter les informations.
|
||||
}
|
||||
|
||||
for (unsigned int i = 4; i < infos.size(); i++)
|
||||
{
|
||||
if (i+1 < infos.size())
|
||||
{
|
||||
reference_point_list[pt_idx].addMeasurement(infos[i], from_string<int>(infos[i+1]));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
input_file.close();
|
||||
infos.clear() ;
|
||||
}
|
||||
|
||||
void Positioning::makeApListFromFile(const string &filename)
|
||||
{
|
||||
|
||||
ifstream input_file;
|
||||
string buffer;
|
||||
vector<string> ap_infos;
|
||||
AccessPoint tmp_ap;
|
||||
|
||||
input_file.open(filename.c_str());
|
||||
if (input_file.fail())
|
||||
{
|
||||
cerr << "Error opening input file « " << filename << " » !" << endl ;
|
||||
return ;
|
||||
}
|
||||
|
||||
while (!input_file.eof())
|
||||
{
|
||||
getline(input_file, buffer);
|
||||
|
||||
if ((input_file.rdstate() & ifstream::eofbit) == 0)
|
||||
{
|
||||
if (buffer[0] == '\0' || buffer[0] == '#') // ligne vide ou ligne commençant par #
|
||||
continue;
|
||||
|
||||
ap_infos = explode(buffer, ';');
|
||||
tmp_ap.setApAddr(ap_infos[0]);
|
||||
tmp_ap.setCoordinates(from_string<float>(ap_infos[1]), from_string<float>(ap_infos[2]), from_string<float>(ap_infos[3]));
|
||||
tmp_ap.setFrequency(from_string<unsigned int>(ap_infos[4]));
|
||||
tmp_ap.setAntennaGain(from_string<float>(ap_infos[5]));
|
||||
tmp_ap.setOutputPower(from_string<float>(ap_infos[6]));
|
||||
access_point_list.push_back(tmp_ap);
|
||||
ap_infos.clear();
|
||||
}
|
||||
}
|
||||
|
||||
input_file.close();
|
||||
}
|
||||
|
||||
void Positioning::makeTopologyFromFile(const string &filename)
|
||||
{
|
||||
|
||||
ifstream input_file;
|
||||
string buffer;
|
||||
vector<string> infos;
|
||||
|
||||
input_file.open(filename.c_str()) ;
|
||||
if (input_file.fail())
|
||||
{
|
||||
cerr << "Error opening input file « " << filename << " » !" << endl ;
|
||||
return ;
|
||||
}
|
||||
|
||||
while (!input_file.eof())
|
||||
{
|
||||
getline(input_file, buffer) ;
|
||||
|
||||
if ((input_file.rdstate() & ifstream::eofbit) == 0)
|
||||
{
|
||||
/* Traitement basique des commentaires */
|
||||
if (buffer[0] == '\0' || buffer[0] == '#') // ligne vide ou ligne commençant par #
|
||||
continue ; // ignorer cette ligne.
|
||||
|
||||
infos = explode(buffer, ';') ;
|
||||
if (area_list.find(infos[0]) != area_list.end()) // Si la pièce existe déjà,
|
||||
cerr << "Erreur ! Déclaration multiple de la zone « " << infos[0] << " »." << endl ; // on le signale ;
|
||||
else // sinon on l'ajoute :
|
||||
area_list[infos[0]] = Area(infos[0], from_string<float>(infos[1]), from_string<float>(infos[3]),
|
||||
from_string<float>(infos[2]), from_string<float>(infos[4]),
|
||||
from_string<float>(infos[5]), from_string<float>(infos[6])) ;
|
||||
|
||||
infos.clear() ;
|
||||
}
|
||||
}
|
||||
|
||||
input_file.close() ;
|
||||
|
||||
}
|
||||
|
||||
void Positioning::makeWaypointListFromFile(const string &filename)
|
||||
{
|
||||
|
||||
ifstream input_file ;
|
||||
string buffer;
|
||||
vector<string> infos ;
|
||||
set<Point> point_list ;
|
||||
|
||||
input_file.open(filename.c_str());
|
||||
if (input_file.fail())
|
||||
{
|
||||
cerr << "Error opening input file « " << filename << " » !" << endl ;
|
||||
return ;
|
||||
}
|
||||
|
||||
while (!input_file.eof())
|
||||
{
|
||||
getline(input_file, buffer);
|
||||
|
||||
if ((input_file.rdstate() & ifstream::eofbit) == 0)
|
||||
{
|
||||
if (buffer[0] == '\0' || buffer[0] == '#') // ligne vide ou ligne commençant par #
|
||||
continue;
|
||||
|
||||
infos = explode(buffer, ';') ;
|
||||
|
||||
Point tmp_pt(from_string<float>(infos[0]), from_string<float>(infos[1]), from_string<float>(infos[2])) ;
|
||||
if (! point_list.insert(tmp_pt).second)
|
||||
cerr << "Point " << tmp_pt << " non ajouté ! Peut-être est-il dupliqué ?" << endl ;
|
||||
|
||||
infos.clear() ;
|
||||
}
|
||||
}
|
||||
input_file.close() ; // Lecture du fichier terminée
|
||||
|
||||
|
||||
unsigned int nb_pts = point_list.size() ; // Nombre de points
|
||||
unsigned int cur_idx = 0 ; // Itérateur sur l'indice de la matrice.
|
||||
waypoint_list.reserve(nb_pts) ; // Vector contenant tous les points (attribut du serveur)
|
||||
waypoint_matrix = new float*[nb_pts] ; // Matrice (carrée) des distances entre les points de passage (attribut du serveur)
|
||||
for (unsigned int i = 0 ; i < nb_pts ; i++) // Initialisation de la matrice :
|
||||
{
|
||||
waypoint_matrix[i] = new float[nb_pts] ;
|
||||
for (unsigned int k = 0 ; k < nb_pts ; k++) // Initialisation des distances à -1
|
||||
waypoint_matrix[i][k] = -1 ;
|
||||
}
|
||||
|
||||
for (set<Point>::iterator it = point_list.begin() ; it != point_list.end() ; it++, cur_idx++) // Pour chaque point enregistré
|
||||
{
|
||||
waypoint_list.push_back(*it) ; // Ajout du point dans waypoint_list
|
||||
waypoint_matrix[cur_idx][cur_idx] = 0 ; // La distance du point à lui-même est nulle
|
||||
|
||||
for (unsigned int k = 0 ; k < cur_idx ; k++) // Pour chacun des point précédent
|
||||
{
|
||||
if (inTheSameArea(waypoint_list[cur_idx], waypoint_list[k])) // Si le point est dans la même zone,
|
||||
{
|
||||
float dist = it->distance(waypoint_list[k]) ; // on calcule la distance
|
||||
waypoint_matrix[cur_idx][k] = dist ; // et on l'insère dans le tableau,
|
||||
waypoint_matrix[k][cur_idx] = dist ; // dans les deux sens.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool comput_done = true ;
|
||||
while (comput_done)
|
||||
{
|
||||
comput_done = false ;
|
||||
for (unsigned int i = 0 ; i < nb_pts ; i++)
|
||||
for (unsigned int j = 0 ; j < nb_pts ; j++)
|
||||
if (waypoint_matrix[i][j] > 0)
|
||||
for (unsigned int k = 0 ; k < nb_pts ; k++)
|
||||
if (waypoint_matrix[j][k] > 0)
|
||||
{
|
||||
float tmp_dist = round_float((waypoint_matrix[j][k] + waypoint_matrix[i][j]), 2);
|
||||
if (tmp_dist < round_float(waypoint_matrix[i][k], 2) || waypoint_matrix[i][k] == -1)
|
||||
{
|
||||
waypoint_matrix[i][k] = tmp_dist ;
|
||||
comput_done = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
map<string, Area> Positioning::inWhichAreas(const Point &p)
|
||||
{
|
||||
|
||||
map<string, Area> areas ;
|
||||
|
||||
for (map<string, Area>::iterator it = area_list.begin() ; it != area_list.end() ; it++)
|
||||
if (it->second.containsPoint(p))
|
||||
areas.insert(make_pair(it->first, it->second)) ;
|
||||
|
||||
return areas ;
|
||||
}
|
||||
|
||||
bool Positioning::inTheSameArea(const Point &p1, const Point &p2)
|
||||
{
|
||||
|
||||
// Liste des zones comportant les points p1 et p2 :
|
||||
map<string, Area> zones1(inWhichAreas(p1));
|
||||
map<string, Area> zones2(inWhichAreas(p2));
|
||||
|
||||
if (zones1.size() == 0 || zones2.size() == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (map<string, Area>::iterator it1 = zones1.begin() ; it1 != zones1.end() ; it1++) // Parcours des zones :
|
||||
for (map<string, Area>::iterator it2 = zones2.begin(); it2 != zones2.end(); it2++)
|
||||
if (it1->second == it2->second)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false ;
|
||||
}
|
||||
|
||||
float Positioning::distanceTopology(const Point &p1, const Point &p2)
|
||||
{
|
||||
|
||||
map<string, Area> zones1(inWhichAreas(p1));
|
||||
map<string, Area> zones2(inWhichAreas(p2));
|
||||
|
||||
if (zones1.size() == 0 || zones2.size() == 0) // Si aucune zone ne contient p1 ou p2,
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
Area z1(zones1.begin() -> second); // Première zone d'appartenance du point p1. // FIXME : vérifier toutes les zones
|
||||
Area z2(zones2.begin() -> second);
|
||||
vector<Point> connection;
|
||||
|
||||
|
||||
/* *** Cas de la même zone *** */
|
||||
if (z1 == z2) // Si les points sont dans la même zone,
|
||||
{
|
||||
return p1.distance(p2) ; // la distance entre eux est la distance euclidienne.
|
||||
}
|
||||
|
||||
|
||||
/* *** Cas de deux zones voisines (connectées directement) *** */
|
||||
if ((connection = areaConnection(z1, z2)).size() != 0) // Si les points sont dans deux zones voisines,
|
||||
{
|
||||
// la distance entre eux est la distance euclidienne de chacun jusqu'au plus proche point de passage entre les deux zones.
|
||||
float dist = p1.distance(connection[0]) + p2.distance(connection[0]) ;
|
||||
for (unsigned int i = 1 ; i < connection.size() ; i++) // Recherche du point de passage offrant la plus courte distance
|
||||
{
|
||||
float tmp_dist = p1.distance(connection[i]) + p2.distance(connection[i]) ;
|
||||
if (tmp_dist < dist)
|
||||
dist = tmp_dist ;
|
||||
}
|
||||
|
||||
return dist ;
|
||||
}
|
||||
|
||||
|
||||
/* *** Les points sont dans des zones non-voisines *** */
|
||||
// Liste des points de passage appartenant respectivement à z1 et à z2.
|
||||
vector<Point> wp_z1(areaConnection(z1));
|
||||
vector<Point> wp_z2(areaConnection(z2));
|
||||
|
||||
// Indices des points de passage dans la liste :
|
||||
int wp_z1_idx;
|
||||
int wp_z2_idx = -1 ; // z2 ne peut pas être utilisé non initialisé, contrairement à ce que dit GCC, car dans le cas où il n'est pas initialisé on quitte la fonction avant de l'utiliser (cf. "return -1" un peu plus bas);
|
||||
|
||||
if (wp_z1.size() == 0 || wp_z2.size() == 0) // Si l'une des deux zones ne comporte aucun point de passage,
|
||||
{
|
||||
return -1 ; // on quitte (ceci ne devrait jamais se produire).
|
||||
}
|
||||
|
||||
/* Première itération (voir explication de l'algorithme plus bas) */
|
||||
unsigned int i1, i2 ;
|
||||
for (i1 = 0 ; i1 < wp_z1.size() ; i1++) // Recherche des premiers indices valides (où il existe un chemin entre les points de passage)
|
||||
{
|
||||
wp_z1_idx = pointIndex(waypoint_list, wp_z1[i1]) ;
|
||||
for (i2 = 0 ; i2 < wp_z2.size() ; i2++)
|
||||
{
|
||||
wp_z2_idx = pointIndex(waypoint_list, wp_z2[i2]) ;
|
||||
if (wp_z2_idx < 0)
|
||||
continue ;
|
||||
|
||||
if (waypoint_matrix[wp_z1_idx][wp_z2_idx] != -1) // Si c'est bon,
|
||||
break ; // on arrête le parcours.
|
||||
}
|
||||
if (waypoint_matrix[wp_z1_idx][wp_z2_idx] != -1) // Si c'est bon,
|
||||
break ; // on arrête le parcours.
|
||||
}
|
||||
|
||||
if (i1 >= wp_z1.size()) // Si on a parcouru tout le tableau sans trouver de chemin,
|
||||
{
|
||||
return -1 ; // on quitte.
|
||||
}
|
||||
|
||||
float dist = p1.distance(wp_z1[i1]) + waypoint_matrix[wp_z1_idx][wp_z2_idx] + p2.distance(wp_z2[i2]);
|
||||
float tmp_dist ;
|
||||
|
||||
for (unsigned int j = i2 + 1 ; j < wp_z2.size() ; j++) // Fin du parcours :
|
||||
{
|
||||
wp_z2_idx = pointIndex(waypoint_list, wp_z2[j]) ;
|
||||
if (waypoint_matrix[wp_z1_idx][wp_z2_idx] == -1)
|
||||
continue ;
|
||||
tmp_dist = p1.distance(wp_z1[i1]) + waypoint_matrix[wp_z1_idx][wp_z2_idx] + p2.distance(wp_z2[j]) ;
|
||||
if (tmp_dist < dist)
|
||||
dist = tmp_dist ;
|
||||
}
|
||||
|
||||
/* Itérations suivantes */
|
||||
for (unsigned int i = i1 + 1 ; i < wp_z1.size() ; i++)
|
||||
for (unsigned int j = 0 ; j < wp_z2.size() ; j++)
|
||||
{
|
||||
// Indice des points de passage wp_z1[i] et wp_z2[j] dans la liste des points de passage :
|
||||
wp_z1_idx = pointIndex(waypoint_list, wp_z1[i]) ;
|
||||
wp_z2_idx = pointIndex(waypoint_list, wp_z2[j]) ;
|
||||
|
||||
if (waypoint_matrix[wp_z1_idx][wp_z2_idx] == -1) // S'il n'existe aucun chemin entre les deux points de passage
|
||||
continue ;
|
||||
|
||||
tmp_dist = p1.distance(wp_z1[i]) + waypoint_matrix[wp_z1_idx][wp_z2_idx] + p2.distance(wp_z2[j]) ;
|
||||
if (tmp_dist < dist)
|
||||
dist = tmp_dist ;
|
||||
}
|
||||
|
||||
return dist ;
|
||||
}
|
||||
|
||||
vector<Point> Positioning::areaConnection(const Area &z1, const Area &z2)
|
||||
{
|
||||
vector<Point> points ;
|
||||
|
||||
for (unsigned int i = 0 ; i < waypoint_list.size() ; i++)
|
||||
{
|
||||
map<string, Area> areas(inWhichAreas(waypoint_list[i])) ;
|
||||
if (areas.find(z1.getName()) != areas.end() && areas.find(z2.getName()) != areas.end())
|
||||
points.push_back(waypoint_list[i]) ;
|
||||
}
|
||||
|
||||
return points ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
vector<Point> Positioning::areaConnection(const Area &z)
|
||||
{
|
||||
vector<Point> points ;
|
||||
|
||||
for (unsigned int i = 0 ; i < waypoint_list.size() ; i++)
|
||||
{
|
||||
map<string, Area> areas(inWhichAreas(waypoint_list[i])) ;
|
||||
if (areas.find(z.getName()) != areas.end())
|
||||
points.push_back(waypoint_list[i]) ;
|
||||
}
|
||||
|
||||
return points ;
|
||||
}
|
||||
|
||||
void Positioning::makeReferencePointDistances()
|
||||
{
|
||||
|
||||
unsigned int nb_pts = reference_point_list.size() ; // Nombre de points à traiter.
|
||||
|
||||
reference_point_matrix = new float*[nb_pts] ; // Allocation de la première dimension.
|
||||
for (unsigned int i = 0 ; i < nb_pts ; i++) // Initialisation de la matrice :
|
||||
{
|
||||
reference_point_matrix[i] = new float[nb_pts] ;
|
||||
for (unsigned int k = 0; k < nb_pts; k++) // Initialisation des distances à -1
|
||||
reference_point_matrix[i][k] = -1 ;
|
||||
}
|
||||
|
||||
for (unsigned int cur_idx = 0 ; cur_idx < nb_pts ; cur_idx++)
|
||||
{
|
||||
reference_point_matrix[cur_idx][cur_idx] = 0 ; // La distance du point à lui-même est nulle
|
||||
|
||||
for (unsigned int k = 0 ; k < cur_idx ; k++) // Pour chacun des point précédent
|
||||
{
|
||||
float dist = distanceTopology((Point) reference_point_list[cur_idx], (Point) reference_point_list[k]) ; // On calcule la distance
|
||||
reference_point_matrix[cur_idx][k] = dist ; // et on l'insère dans le tableau,
|
||||
reference_point_matrix[k][cur_idx] = dist ; // dans les deux sens.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Positioning::checkTopology()
|
||||
{
|
||||
|
||||
for (unsigned int i = 0 ; i < waypoint_list.size() ; i++)
|
||||
{
|
||||
map<string, Area> areas(inWhichAreas(waypoint_list[i])) ;
|
||||
if (areas.empty())
|
||||
{
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (unsigned int i = 0 ; i < reference_point_list.size() ; i++)
|
||||
{
|
||||
map<string, Area> areas(inWhichAreas((Point)reference_point_list[i])) ;
|
||||
if (areas.empty())
|
||||
{
|
||||
return false ; // À modifier si on veut permettre aux points de référence de n'appartenir à aucune zone.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
set<string> connected_areas ; // Liste des zones connectées à au moins une autre zone (on n'enregistre que le nom des zones, dupliquer toutes les zones étant inutile).
|
||||
|
||||
for (map<string, Area>::iterator it1 = area_list.begin() ; it1 != area_list.end() ; it1++)
|
||||
for (map<string, Area>::iterator it2 = area_list.begin() ; it2 != area_list.end() ; it2++)
|
||||
{
|
||||
if (it1 == it2)
|
||||
continue ;
|
||||
|
||||
vector<Point> connect(areaConnection(it1->second, it2->second)) ;
|
||||
if (!connect.empty())
|
||||
connected_areas.insert(it1->first) ; // Ajout de la zone à la liste des zones connectées.
|
||||
}
|
||||
|
||||
if (connected_areas.size() != area_list.size())
|
||||
{
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
inline bool Positioning::pointExists(const float &x, const float &y, const float &z) const
|
||||
{
|
||||
return pointExists(reference_point_list, Point(x, y, z));
|
||||
}
|
||||
|
||||
inline bool Positioning::pointExists(const Point &p) const
|
||||
{
|
||||
return pointExists(reference_point_list, p);
|
||||
}
|
||||
|
||||
inline bool Positioning::pointExists(const vector<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const
|
||||
{
|
||||
return pointExists(point_list, Point(x, y, z));
|
||||
}
|
||||
|
||||
inline bool Positioning::pointExists(const vector<ReferencePoint> &point_list, const Point &p) const
|
||||
{
|
||||
return (pointIndex(point_list, p) != -1);
|
||||
}
|
||||
|
||||
inline int Positioning::pointIndex(const Point &p) const
|
||||
{
|
||||
return (unsigned int) pointIndex(reference_point_list, p);
|
||||
}
|
||||
|
||||
inline int Positioning::pointIndex(const vector<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const
|
||||
{
|
||||
return (unsigned int) pointIndex(point_list, Point(x, y, z)) ;
|
||||
}
|
||||
|
||||
inline int Positioning::pointIndex(const vector<ReferencePoint> &point_list, const Point &p) const
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < point_list.size() ; i++)
|
||||
if (p == point_list[i].getCoordinates())
|
||||
{
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Retourne la position du Point "p" dans le tableau à une dimension "point_tab" de taille "size", ou -1 en cas d'échec. */
|
||||
inline int Positioning::pointIndex(const Point *point_tab, unsigned int &size, const Point &p) const
|
||||
{
|
||||
for (unsigned int i = 0 ; i < size ; i++)
|
||||
if (point_tab[i] == p)
|
||||
return i;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Retourne la position du Point "p" dans le vector "point_list", ou -1 en cas d'échec. */
|
||||
inline int Positioning::pointIndex(const vector<Point> &point_list, const Point &p) const
|
||||
{
|
||||
|
||||
for (unsigned int i = 0 ; i < point_list.size() ; i++)
|
||||
if (point_list[i] == p)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Positioning::printReferencePointList()
|
||||
{
|
||||
printPointList(reference_point_list) ;
|
||||
}
|
||||
|
||||
void Positioning::printPointList(vector<ReferencePoint> &point_list)
|
||||
{
|
||||
for (unsigned int i = 0 ; i < point_list.size() ; i++)
|
||||
cout << point_list[i] << endl ;
|
||||
}
|
||||
|
||||
void Positioning::printAccessPointList() const
|
||||
{
|
||||
for (unsigned int i = 0; i < access_point_list.size(); i++)
|
||||
cout << access_point_list[i] << endl;
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
#ifndef _POSITIONING_HH_
|
||||
#define _POSITIONING_HH_
|
||||
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
#include "referencepoint.hh"
|
||||
#include "point.hh"
|
||||
#include "accesspoint.hh"
|
||||
#include "area.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Positioning
|
||||
{
|
||||
|
||||
private:
|
||||
vector<ReferencePoint> reference_point_list; // Liste des points de référence (calibration).
|
||||
float** reference_point_matrix; // Matrice des distances entre les points de référence.
|
||||
vector<AccessPoint> access_point_list; // Liste des AP connus.
|
||||
vector<Point> waypoint_list; // Liste des points de passage entre les zones.
|
||||
float** waypoint_matrix; // Matrice des distances entre les points de passage.
|
||||
map<string, Area> area_list ; // Liste des zones homogènes (pièces).
|
||||
|
||||
public :
|
||||
|
||||
Positioning() {};
|
||||
~Positioning() {};
|
||||
|
||||
void makeReferencePointListFromFile(const string &filename, const bool);
|
||||
void makeApListFromFile(const string &filename);
|
||||
void makeTopologyFromFile(const string &filename);
|
||||
void makeWaypointListFromFile(const string &filename);
|
||||
|
||||
void makeReferencePointListFromDb() {};
|
||||
void makeApListFromDb() {};
|
||||
void makeTopologyFromDb() {};
|
||||
void makeWaypointListFromDb() {};
|
||||
|
||||
map<string, Area> inWhichAreas(const Point &p);
|
||||
bool inTheSameArea(const Point &p1, const Point &p2);
|
||||
float distanceTopology(const Point &p1, const Point &p2);
|
||||
vector<Point> areaConnection(const Area &z1, const Area &z2);
|
||||
vector<Point> areaConnection(const Area &z);
|
||||
|
||||
void makeReferencePointDistances();
|
||||
bool checkTopology();
|
||||
|
||||
bool pointExists(const float &x, const float &y, const float &z)const;
|
||||
bool pointExists(const Point &p)const;
|
||||
bool pointExists(const vector<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const ;
|
||||
bool pointExists(const vector<ReferencePoint> &point_list, const Point &p) const ;
|
||||
|
||||
int pointIndex(const float &x, const float &y, const float &z) const;
|
||||
int pointIndex(const Point &p) const;
|
||||
int pointIndex(const vector<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const ;
|
||||
int pointIndex(const vector<ReferencePoint> &point_list, const Point &p) const ;
|
||||
int pointIndex(const Point *tab, unsigned int &size, const Point &p) const ;
|
||||
int pointIndex(const vector<Point> &point_list, const Point &p) const ;
|
||||
|
||||
vector<AccessPoint> getAccessPointList() const
|
||||
{
|
||||
return access_point_list;
|
||||
};
|
||||
vector<ReferencePoint> getReferencePointList() const
|
||||
{
|
||||
return reference_point_list;
|
||||
};
|
||||
|
||||
void printReferencePointList();
|
||||
void printPointList(vector<ReferencePoint> &point_list);
|
||||
void printAccessPointList() const;
|
||||
};
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -1,149 +1,65 @@
|
|||
#ifndef _SERVER_HH_
|
||||
#define _SERVER_HH_
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <netdb.h>
|
||||
#include <net/if.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <iostream>
|
||||
#include <cstdio>
|
||||
|
||||
#include "guinumo.hh"
|
||||
#include "clientinfo.hh"
|
||||
#include "referencepoint.hh"
|
||||
#include "accesspoint.hh"
|
||||
#include "positioning.hh"
|
||||
#include "point.hh"
|
||||
#include "measurement.hh"
|
||||
#include "area.hh"
|
||||
#include "treatment.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef ClientInfo::float_array float_array ;
|
||||
typedef ClientInfo::float_index float_index ;
|
||||
|
||||
|
||||
#define DEFAULT_LOGFILE "log/radar_exp.csv" // Fichier de sortie
|
||||
#define DEFAULT_REF_POINT_FILE "csv/agreg/1m/toutes.csv" // Fichier des points de référence
|
||||
#define DEFAULT_REF_POINT_FILE_1M "csv/agreg/1m/toutes.csv" // Fichier contenant tous les points de référence (maillage à 1m)
|
||||
#define DEFAULT_AP_FILE "cfg/minipc.cfg" // Fichier de configuration des AP
|
||||
#define DEFAULT_TRACKING_FILE "csv/agreg/divagation/divagation9_interpolé.csv" // Fichier de prérégrination
|
||||
#define DEFAULT_TOPOLOGY_FILE "cfg/topo.csv"
|
||||
#define DEFAULT_WAYPOINT_FILE "cfg/waypoints.csv"
|
||||
#define DEFAULT_IP "127.0.0.1"
|
||||
#define DEFAULT_LISTEN_PORT 7777
|
||||
#define LIGHT_SPEED 300000000
|
||||
#define MINMAX_STEP 0.5
|
||||
#define MINMAX_X_START 0.5
|
||||
#define MINMAX_Y_START 0.5
|
||||
#define MINMAX_Z_START 0
|
||||
#define MINMAX_X_STOP 10
|
||||
#define MINMAX_Y_STOP 31.5
|
||||
#define MINMAX_Z_STOP 6
|
||||
#define BUFFER_LENGTH 5000
|
||||
//#define DEFAULT_Z 3 // Décommenter pour utiliser des fichiers d'entrée avec des coordonnées dans un seul plan (X, Y).
|
||||
//#define FRED_CSV_FORMAT // Décommenter pour utiliser les fichiers CSV au « format Fred » (plusieurs lignes par mesure, avec un AP par ligne).
|
||||
|
||||
typedef enum { ALGO_VLI = 1, ALGO_BASIC_FRBHM, ALGO_CONTINU_FRBHM } ALGORITHM ;
|
||||
typedef struct _couple_info
|
||||
{
|
||||
unsigned char ap_mac_addr_bytes[6]; // Adresse MAC de l'AP
|
||||
int antenna_signal_dbm; // Puissance du signal reçu par l'AP
|
||||
} couple_info;
|
||||
|
||||
typedef struct _request
|
||||
{
|
||||
unsigned char ag_mac_addr_bytes[6]; // Adresse MAC de l'Aggregateur émetteur de la demande
|
||||
int nb_couples; // Nombre couples (MAC AP;Puissance)
|
||||
} request;
|
||||
|
||||
class Server
|
||||
{
|
||||
public :
|
||||
typedef boost::multi_array<float, 2> float_array ; // On utilise boost::multi_array pour les matrices de distances temporaires.
|
||||
typedef float_array::index float_index ;
|
||||
|
||||
protected:
|
||||
vector<ClientInfo> client_list ; // Liste des clients connus.
|
||||
map<string, Area> area_list ; // Liste des zones homogènes (pièces).
|
||||
vector<ReferencePoint> reference_point_list ; // Liste des points de référence (calibration).
|
||||
vector<AccessPoint> access_point_list ; // Liste des AP connus.
|
||||
float **reference_point_matrix ; // Matrice des distances entre les points de référence.
|
||||
vector<Point> waypoint_list ; // Liste des points de passage entre les zones.
|
||||
float **waypoint_matrix ; // Matrice des distances entre les points de passage.
|
||||
struct sockaddr_in server_addr;
|
||||
int sockListen;
|
||||
int sockSend;
|
||||
private:
|
||||
request att_request;
|
||||
vector<couple_info> recv_info;
|
||||
|
||||
int listen_socket;
|
||||
int listen_port;
|
||||
struct sockaddr_in serv_addr;
|
||||
struct sockaddr_in client;
|
||||
socklen_t client_len;
|
||||
|
||||
Positioning calcul;
|
||||
vector<Measurement> point_list;
|
||||
|
||||
public:
|
||||
Server(const string &ap_file = DEFAULT_AP_FILE, const string &ref_pt_file = DEFAULT_REF_POINT_FILE, const string &ip_addr = DEFAULT_IP, const int &listen_port = DEFAULT_LISTEN_PORT);
|
||||
~Server();
|
||||
Server(int);
|
||||
~Server()
|
||||
{
|
||||
close(listen_socket);
|
||||
};
|
||||
|
||||
void send_to_client(const int &cl);
|
||||
int receive_data();
|
||||
|
||||
ClientInfo& createClient() ;
|
||||
|
||||
map<string, Area> inWhichAreas(const Point &p) ;
|
||||
bool inTheSameArea(const Point &p1, const Point &p2) ;
|
||||
vector<Point> areaConnection(const Area &z1, const Area &z2) ;
|
||||
vector<Point> areaConnection(const Area &z) ;
|
||||
float distanceTopology(const Point &p1, const Point &p2) ;
|
||||
|
||||
bool pointExists(const float &x, const float &y, const float &z)const;
|
||||
bool pointExists(const Point &p)const;
|
||||
bool pointExists(const vector<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const ;
|
||||
bool pointExists(const vector<ReferencePoint> &point_list, const Point &p) const ;
|
||||
|
||||
int pointIndex(const float &x, const float &y, const float &z) const;
|
||||
int pointIndex(const Point &p) const;
|
||||
int pointIndex(const vector<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const ;
|
||||
int pointIndex(const vector<ReferencePoint> &point_list, const Point &p) const ;
|
||||
int pointIndex(const Point *tab, unsigned int &size, const Point &p) const ;
|
||||
int pointIndex(const vector<Point> &point_list, const Point &p) const ;
|
||||
|
||||
bool apExists(const string &ap_addr)const;
|
||||
unsigned int apIndex(const string &ap_addr)const;
|
||||
|
||||
vector<Point> getkClosestInSs(const vector<Measurement> &m, const unsigned int &k)const ;
|
||||
vector<Point> getkClosestInSs(const vector<Measurement> &m, const unsigned int &k, const Point *point_ignored)const ;
|
||||
|
||||
Point getkWeightedInSs(const vector<Measurement> &m, const unsigned int &k)const ;
|
||||
Point getkWeightedInSs(const vector<Measurement> &m, const unsigned int &k, const Point *point_ignored)const ;
|
||||
|
||||
Point kPointsAverage(const vector<Point> &vp)const;
|
||||
Point fbcm(const vector<Measurement> &m, const int &client_idx)const;
|
||||
Point fbcm_friis( const vector<Measurement> &m, const vector<float> friis_idx_list, const float &z)const;
|
||||
Point interlink(const vector<Measurement> &m, const int &client_idx)const;
|
||||
|
||||
void makeReferencePointListFromFile(const string &filename);
|
||||
void makePointListFromFile(vector<ReferencePoint> &dest_point_list, const string &filename) ;
|
||||
void makePointListFromFile(vector<ReferencePoint> &dest_point_list, const string &filename, const bool uniq_point) ;
|
||||
void makeApListFromFile(const string &filename);
|
||||
void makeTopologyFromFile(const string &filename) ;
|
||||
void makeWaypointListFromFile(const string &filename) ;
|
||||
void makeReferencePointDistances() ;
|
||||
|
||||
bool checkTopology() ;
|
||||
|
||||
void selectDistances(float_array *matrix, const vector<Point> &l1, const vector<Point> &l2) const ;
|
||||
void computeEuclideanDistances(float_array *matrix, const vector<Point> &l1, const vector<Point> &l2) const ;
|
||||
void computeTopologyDistances(float_array *matrix, const vector<Point> &l1, const vector<Point> &l2) ;
|
||||
|
||||
void printReferencePointList() ;
|
||||
void printPointList(vector<ReferencePoint> &point_list) ;
|
||||
void printAccessPointList() const ;
|
||||
|
||||
void computeFriisFromRefList();
|
||||
vector<float> computeFriisFromRefList(const Point &p, const vector<Measurement> &m);
|
||||
|
||||
unsigned int getNbReferencePoints()const
|
||||
{
|
||||
return reference_point_list.size();
|
||||
};
|
||||
|
||||
void monitorClient(const unsigned int &client_id, const ALGORITHM &algo) ;
|
||||
Point fastViterbiLike(const unsigned int &id_client, const float_array &distance_matrix) ;
|
||||
|
||||
/* For experimentation purpose only ! */
|
||||
void radar_exp(const string &outfile = DEFAULT_LOGFILE, const string &testfile = DEFAULT_REF_POINT_FILE_1M);
|
||||
int initFile(const string &, const string &, const string &, const string &);
|
||||
int start();
|
||||
void treatment(request, vector<couple_info>);
|
||||
void makeMeasurementList(vector<couple_info>);
|
||||
};
|
||||
|
||||
#endif // _SERVER_HH_
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,382 @@
|
|||
#include "treatment.hh"
|
||||
|
||||
bool Treatment::apExists(const string &ap_addr)const
|
||||
{
|
||||
|
||||
string str;
|
||||
|
||||
for (unsigned int i = 0 ; i < access_point_list.size() ; i++)
|
||||
{
|
||||
str = access_point_list[i].getApAddr() ;
|
||||
const int length = str.length() ;
|
||||
for (int j = 0 ; j < length ; ++j)
|
||||
str[j] = tolower(str[j]) ;
|
||||
if (str == ap_addr)
|
||||
{
|
||||
return true ;
|
||||
}
|
||||
}
|
||||
|
||||
return false ;
|
||||
}
|
||||
|
||||
unsigned int Treatment::apIndex(const string &ap_addr)const
|
||||
{
|
||||
unsigned int i;
|
||||
string str;
|
||||
|
||||
for (i = 0 ; i < access_point_list.size() ; i++)
|
||||
{
|
||||
str = access_point_list[i].getApAddr() ;
|
||||
const int length = str.length() ;
|
||||
for (int j = 0 ; j < length ; ++j)
|
||||
str[j] = tolower(str[j]) ;
|
||||
if (str == ap_addr)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return 0; // Should never happen
|
||||
}
|
||||
|
||||
vector<Point> Treatment::getkClosestInSs(const vector<Measurement> &m, const unsigned int &k, const Point *point_ignored)const
|
||||
{
|
||||
|
||||
unsigned int i, j, min_idx;
|
||||
vector<float> distances_vector;
|
||||
vector<Point> points_vector;
|
||||
Point tmp_pt;
|
||||
float tmp_distance = 0, dist_max = 10000000, tmp_min;
|
||||
|
||||
for (i = 0 ; i < reference_point_list.size() ; i++)
|
||||
if (point_ignored == NULL || (reference_point_list[i].getCoordinates() != *point_ignored))
|
||||
{
|
||||
tmp_distance = reference_point_list[i].getSsSquareDistance(m);
|
||||
|
||||
/* if not k points, add it */
|
||||
if (distances_vector.size() < k)
|
||||
{
|
||||
distances_vector.push_back(tmp_distance);
|
||||
points_vector.push_back(reference_point_list[i].getCoordinates());
|
||||
dist_max = (dist_max < tmp_distance) ? tmp_distance : dist_max;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if tmp_dst < dist_max, should add it and remove previous greatest dist. */
|
||||
if (dist_max > tmp_distance)
|
||||
{
|
||||
/* remove old max */
|
||||
for (j = 0 ; j < distances_vector.size() ; j++)
|
||||
if (distances_vector[j] == dist_max)
|
||||
{
|
||||
distances_vector[j] = tmp_distance;
|
||||
points_vector[j] = reference_point_list[i].getCoordinates();
|
||||
break;
|
||||
}
|
||||
/* Now seek the new max. distance */
|
||||
dist_max = distances_vector[0];
|
||||
for (j = 1 ; j < distances_vector.size() ; j++)
|
||||
if (distances_vector[j] > dist_max)
|
||||
dist_max = distances_vector[j];
|
||||
}
|
||||
/* Else nothing needs to be done */
|
||||
}
|
||||
}
|
||||
|
||||
/* Sorts the vector */
|
||||
for (i = 0 ; i < distances_vector.size() - 1 ; i++)
|
||||
{
|
||||
tmp_min = distances_vector[i];
|
||||
min_idx = i;
|
||||
for (j = i+1 ; j < distances_vector.size() ; j++)
|
||||
if (tmp_min > distances_vector[j])
|
||||
{
|
||||
tmp_min = distances_vector[j];
|
||||
min_idx = j;
|
||||
}
|
||||
|
||||
if (min_idx != i)
|
||||
{
|
||||
/* Swap points */
|
||||
tmp_pt = points_vector[i];
|
||||
points_vector[i] = points_vector[min_idx];
|
||||
points_vector[min_idx] = tmp_pt;
|
||||
|
||||
/* Swap distances */
|
||||
distances_vector[min_idx] = distances_vector[i];
|
||||
distances_vector[i] = tmp_min;
|
||||
}
|
||||
}
|
||||
|
||||
return points_vector;
|
||||
}
|
||||
|
||||
Point Treatment::fbcm(const vector<Measurement> &m, const int &client_idx)const
|
||||
{
|
||||
|
||||
Point ret(0, 0, 0);
|
||||
vector<string> addr;
|
||||
vector<float> dist_vect;
|
||||
vector<Point> centres;
|
||||
unsigned int i, ap_idx;
|
||||
float constant_term, minmax_res, minmax_max;
|
||||
float x = MINMAX_X_START, y = MINMAX_Y_START, z = MINMAX_Z_START;
|
||||
|
||||
i = 0;
|
||||
//cout << "FBCM: ";
|
||||
for (i = 0 ; i < m.size() ; i++)
|
||||
if (apExists(m[i].getMacAddr()))
|
||||
{
|
||||
ap_idx = apIndex(m[i].getMacAddr());
|
||||
//cout << "AP idx: " << ap_idx << " ";
|
||||
centres.push_back(access_point_list[ap_idx].getCoordinates());
|
||||
addr.push_back(m[i].getMacAddr());
|
||||
constant_term = access_point_list[ap_idx].getOutputPower() + access_point_list[ap_idx].getAntennaGain() + 2;
|
||||
constant_term += 20 * log10((300000000.0 / (float) access_point_list[ap_idx].getFrequency()) / (4*M_PI));
|
||||
//end of expr. should be: client_list[client_idx].getAntennaGain() instead of 2.
|
||||
//cout << "20log(" << (300000000.0 / (float) access_point_list[ap_idx].getFrequency()) / (4*M_PI) << ") = ";
|
||||
//cout << constant_term << " ";
|
||||
dist_vect.push_back(pow(10, (constant_term - m[i].getAverage()) / (10 * access_point_list[ap_idx].getFriisIndex())));
|
||||
//cout << endl;
|
||||
}
|
||||
|
||||
/* Then: min-max */
|
||||
minmax_res = 1000000;
|
||||
for (x = MINMAX_X_START ; x < MINMAX_X_STOP ; x += MINMAX_STEP)
|
||||
for (y = MINMAX_Y_START ; y < MINMAX_Y_STOP ; y += MINMAX_STEP)
|
||||
for (z = MINMAX_Z_START ; z <= MINMAX_Z_STOP ; z += MINMAX_STEP)
|
||||
{
|
||||
minmax_max = 0;
|
||||
for (i = 0 ; i < centres.size() ; i++)
|
||||
if (abs(centres[i].distance(x, y, z) - dist_vect[i]) > minmax_max)
|
||||
minmax_max = abs(centres[i].distance(x, y, z) - dist_vect[i]) ;
|
||||
if (minmax_max < minmax_res)
|
||||
{
|
||||
ret.setX(x);
|
||||
ret.setY(y);
|
||||
ret.setZ(z);
|
||||
minmax_res = minmax_max;
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear all vectors */
|
||||
addr.clear();
|
||||
dist_vect.clear();
|
||||
centres.clear();
|
||||
|
||||
/* Return position */
|
||||
return ret;
|
||||
}
|
||||
|
||||
Point Treatment::fbcm_friis( const vector<Measurement> &m, const vector<float> friis_idx_list, const float &z)const
|
||||
{
|
||||
|
||||
Point ret(0, 0, 0);
|
||||
vector<float> dist_vect;
|
||||
vector<Point> centres;
|
||||
unsigned int i, ap_idx;
|
||||
float constant_term, minmax_res, minmax_max;
|
||||
float x = MINMAX_X_START, y = MINMAX_Y_START ;
|
||||
vector<Measurement> vm = m; //Used when filtering 3 strongest APs
|
||||
vector<float> friis_idx = friis_idx_list; //Used when filtering 3 strongest APs
|
||||
|
||||
i = 0;
|
||||
for (i = 0 ; i < vm.size() ; i++)
|
||||
{
|
||||
if (apExists(vm[i].getMacAddr()))
|
||||
{
|
||||
ap_idx = apIndex(vm[i].getMacAddr());
|
||||
constant_term = access_point_list[ap_idx].getOutputPower() + access_point_list[ap_idx].getAntennaGain() + 2;
|
||||
constant_term += 20 * log10((300000000.0 / (float) access_point_list[ap_idx].getFrequency()) / (4*M_PI));
|
||||
if (friis_idx[i] != -1)
|
||||
{
|
||||
centres.push_back(access_point_list[ap_idx].getCoordinates());
|
||||
dist_vect.push_back(pow(10, (constant_term - vm[i].getAverage()) / (10 * friis_idx[i])));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Then: min-max */
|
||||
minmax_res = 1000000;
|
||||
for (x = MINMAX_X_START ; x < MINMAX_X_STOP ; x += MINMAX_STEP)
|
||||
for (y = MINMAX_Y_START ; y < MINMAX_Y_STOP ; y += MINMAX_STEP)
|
||||
{
|
||||
minmax_max = 0;
|
||||
for (i = 0 ; i < centres.size() ; i++)
|
||||
if (abs(centres[i].distance(x, y, z) - dist_vect[i]) > minmax_max)
|
||||
minmax_max = abs(centres[i].distance(x, y, z) - dist_vect[i]) ;
|
||||
if (minmax_max < minmax_res)
|
||||
{
|
||||
ret.setX(x);
|
||||
ret.setY(y);
|
||||
ret.setZ(z);
|
||||
minmax_res = minmax_max;
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear all vectors */
|
||||
dist_vect.clear();
|
||||
centres.clear();
|
||||
|
||||
/* Return position */
|
||||
return ret;
|
||||
}
|
||||
|
||||
Point Treatment::interlink(const vector<Measurement> &m, const int &client_idx) const
|
||||
{
|
||||
|
||||
Point ret(0, 0, 0);
|
||||
vector<string> addr;
|
||||
vector<float> dist_vect;
|
||||
vector<Point> centres;
|
||||
unsigned int i, ap_idx;
|
||||
float constant_term, minmax_res, minmax_max;
|
||||
float x = MINMAX_X_START, y = MINMAX_Y_START, z = MINMAX_Z_START;
|
||||
|
||||
i = 0;
|
||||
for (i = 0 ; i < m.size() ; i++)
|
||||
if (apExists(m[i].getMacAddr()))
|
||||
{
|
||||
ap_idx = apIndex(m[i].getMacAddr());
|
||||
centres.push_back(access_point_list[ap_idx].getCoordinates());
|
||||
addr.push_back(m[i].getMacAddr());
|
||||
constant_term = access_point_list[ap_idx].getOutputPower() + access_point_list[ap_idx].getAntennaGain();
|
||||
constant_term += 20 * log10((300000000.0 / (float) access_point_list[ap_idx].getFrequency()) / (4*M_PI)) + 2;
|
||||
//end of expr. should be: client_list[client_idx].getAntennaGain() instead of 2.
|
||||
dist_vect.push_back(pow(10, (constant_term - m[i].getAverage()) / 35));
|
||||
}
|
||||
|
||||
/* Then: min-max */
|
||||
minmax_res = 1000000;
|
||||
for (x = MINMAX_X_START ; x < MINMAX_X_STOP ; x += MINMAX_STEP)
|
||||
for (y = MINMAX_Y_START ; y < MINMAX_Y_STOP ; y += MINMAX_STEP)
|
||||
for (z = MINMAX_Z_START ; z < MINMAX_Z_STOP ; z += MINMAX_STEP)
|
||||
{
|
||||
minmax_max = 0;
|
||||
for (i = 0 ; i < centres.size() ; i++)
|
||||
if (abs(centres[i].distance(x, y, z) - dist_vect[i]) > minmax_max)
|
||||
minmax_max = abs(centres[i].distance(x, y, z) - dist_vect[i]);
|
||||
if (minmax_max < minmax_res)
|
||||
{
|
||||
ret.setX(x);
|
||||
ret.setY(y);
|
||||
ret.setZ(z);
|
||||
minmax_res = minmax_max;
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear all vectors */
|
||||
addr.clear();
|
||||
dist_vect.clear();
|
||||
centres.clear();
|
||||
|
||||
/* Return position */
|
||||
return ret;
|
||||
}
|
||||
|
||||
vector<float> Treatment::computeFriisFromRefList(const Point &p, const vector<Measurement> &m)
|
||||
{
|
||||
|
||||
vector<float> friis_idx_list;
|
||||
Point pt_coords, ap_coords;
|
||||
float ap_power, ap_gain, calib_gain = 2, const_term, mes_power/*, friis_sum*/;
|
||||
unsigned int ap_freq;
|
||||
string ap_mac;
|
||||
|
||||
|
||||
/* Compute an index for each ref point. List stored in friis_idx_list */
|
||||
/* Compute an index for Point p. List stored in friis_idx_list */
|
||||
for (unsigned int j = 0 ; j < reference_point_list.size() ; j++)
|
||||
{
|
||||
pt_coords = reference_point_list[j].getCoordinates();
|
||||
if (pt_coords==p)
|
||||
{
|
||||
for (unsigned int i = 0 ; i < m.size() ; i++)
|
||||
{
|
||||
if (apExists(m[i].getMacAddr()))
|
||||
{
|
||||
unsigned int ap_idx = apIndex(m[i].getMacAddr());
|
||||
ap_power = access_point_list[ap_idx].getOutputPower();
|
||||
ap_coords = access_point_list[ap_idx].getCoordinates();
|
||||
ap_freq = access_point_list[ap_idx].getFrequency();
|
||||
ap_gain = access_point_list[ap_idx].getAntennaGain();
|
||||
ap_mac = access_point_list[ap_idx].getApAddr();
|
||||
|
||||
/* Compute main general term, independant from scans */
|
||||
const_term = calib_gain + ap_gain;
|
||||
const_term -= 20 * log10(4 * M_PI);
|
||||
const_term += 20 * log10 (300000000.0 / ap_freq) + ap_power;
|
||||
|
||||
if (reference_point_list[j].getPowerForAp(ap_mac, &mes_power))
|
||||
friis_idx_list.push_back((const_term - mes_power) / (10 * log10(ap_coords.distance(pt_coords))));
|
||||
else
|
||||
friis_idx_list.push_back(-1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return friis_idx_list;
|
||||
}
|
||||
|
||||
Point Treatment::getkWeightedInSs(const vector<Measurement> &m, const unsigned int &k, const Point *point_ignored)const
|
||||
{
|
||||
|
||||
unsigned int i, j;
|
||||
vector<float> distances_vector;
|
||||
vector<Point> points_vector;
|
||||
float tmp_distance = 0, dist_max = 10000000;
|
||||
Point ret;
|
||||
float total = 0, x = 0, y = 0, z = 0;
|
||||
|
||||
for (i = 0 ; i < reference_point_list.size() ; i++)
|
||||
if (point_ignored == NULL || (reference_point_list[i].getCoordinates() != *point_ignored))
|
||||
{
|
||||
tmp_distance = reference_point_list[i].getSsSquareDistance(m);
|
||||
/* if not k points, add it */
|
||||
if (distances_vector.size() < k)
|
||||
{
|
||||
distances_vector.push_back(tmp_distance);
|
||||
points_vector.push_back(reference_point_list[i].getCoordinates());
|
||||
dist_max = (dist_max < tmp_distance) ? tmp_distance : dist_max;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if tmp_dst < dist_max, should add it and remove previous greatest dist. */
|
||||
if (dist_max > tmp_distance)
|
||||
{
|
||||
/* remove old max */
|
||||
for (j = 0 ; j < distances_vector.size() ; j++)
|
||||
if (distances_vector[j] == dist_max)
|
||||
{
|
||||
dist_max = tmp_distance;
|
||||
distances_vector.erase(distances_vector.begin() + j);
|
||||
points_vector.erase(points_vector.begin() + j);
|
||||
distances_vector.push_back(tmp_distance);
|
||||
points_vector.push_back(reference_point_list[i].getCoordinates());
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Else nothing needs to be done */
|
||||
}
|
||||
}
|
||||
for (i = 0 ; i < distances_vector.size() ; i++)
|
||||
total += (1 / distances_vector[i]);
|
||||
|
||||
for (i = 0 ; i < distances_vector.size() ; i++)
|
||||
{
|
||||
x += points_vector[i].getX() * (1 / distances_vector[i]) / total;
|
||||
y += points_vector[i].getY() * (1 / distances_vector[i]) / total;
|
||||
z += points_vector[i].getZ() * (1 / distances_vector[i]) / total;
|
||||
}
|
||||
|
||||
ret.setX(x);
|
||||
ret.setY(y);
|
||||
ret.setZ(z);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
#ifndef _TREATMENT_HH_
|
||||
#define _TREATMENT_HH_
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
|
||||
#include "point.hh"
|
||||
#include "measurement.hh"
|
||||
#include "accesspoint.hh"
|
||||
#include "referencepoint.hh"
|
||||
|
||||
#define LIGHT_SPEED 300000000
|
||||
#define MINMAX_STEP 0.5
|
||||
#define MINMAX_X_START 0.5
|
||||
#define MINMAX_Y_START 0.5
|
||||
#define MINMAX_Z_START 0
|
||||
#define MINMAX_X_STOP 10
|
||||
#define MINMAX_Y_STOP 31.5
|
||||
#define MINMAX_Z_STOP 6
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Treatment
|
||||
{
|
||||
|
||||
private:
|
||||
vector<AccessPoint> access_point_list;
|
||||
vector<ReferencePoint> reference_point_list;
|
||||
|
||||
public:
|
||||
Treatment(vector<AccessPoint> access_point, vector<ReferencePoint> reference_point)
|
||||
{
|
||||
access_point_list = access_point;
|
||||
reference_point_list = reference_point;
|
||||
};
|
||||
~Treatment()
|
||||
{
|
||||
access_point_list.clear();
|
||||
};
|
||||
|
||||
bool apExists(const string &)const;
|
||||
unsigned int apIndex(const string &)const;
|
||||
|
||||
vector<Point> getkClosestInSs(const vector<Measurement> &m, const unsigned int &k, const Point *point_ignored)const;
|
||||
|
||||
Point kPointsAverage(const vector<Point> &vp)const;
|
||||
Point fbcm(const vector<Measurement> &m, const int &client_idx)const;
|
||||
Point fbcm_friis( const vector<Measurement> &m, const vector<float> friis_idx_list, const float &z)const;
|
||||
Point interlink(const vector<Measurement> &m, const int &client_idx)const;
|
||||
|
||||
vector<float> computeFriisFromRefList(const Point &p, const vector<Measurement> &m);
|
||||
Point getkWeightedInSs(const vector<Measurement> &m, const unsigned int &k, const Point *point_ignored)const ;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue