2008-04-11 10:11:29 +02:00
|
|
|
#include "server.hh"
|
|
|
|
|
2009-07-03 14:29:40 +02:00
|
|
|
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Transforme un string en un type différent */
|
2009-05-29 17:02:20 +02:00
|
|
|
template <class T>
|
|
|
|
inline T from_string(const string &s)
|
2008-07-03 15:04:30 +02:00
|
|
|
{
|
2009-05-29 17:02:20 +02:00
|
|
|
T t;
|
|
|
|
istringstream iss(s);
|
2008-07-03 15:04:30 +02:00
|
|
|
|
2009-05-29 17:02:20 +02:00
|
|
|
iss >> t;
|
|
|
|
|
|
|
|
return t;
|
2008-07-03 15:04:30 +02:00
|
|
|
}
|
|
|
|
|
2009-07-03 14:29:40 +02:00
|
|
|
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Initialisation du serveur */
|
2009-05-29 17:02:20 +02:00
|
|
|
int Server::init(const boost::program_options::variables_map vm)
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
{
|
2009-05-29 17:02:20 +02:00
|
|
|
ostringstream oss;
|
|
|
|
string buf;
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Connexion à la BdD */
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
oss << "hostaddr = '";
|
2009-07-16 17:25:14 +02:00
|
|
|
if (vm.count("db.host")) // Recherche du nom de l'hôte de la BdD
|
2009-07-03 14:29:40 +02:00
|
|
|
oss << vm["db.host"].as<string>();
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
else
|
2009-07-03 14:29:40 +02:00
|
|
|
{
|
|
|
|
cerr << "Attention ! Hôte de la BDD non spécifié, utilisation de la valeur par défaut..." << endl ;
|
|
|
|
oss << DEFAULT_BDD_HOST;
|
|
|
|
}
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
|
|
|
|
oss << "' dbname = '";
|
2009-07-16 17:25:14 +02:00
|
|
|
if (vm.count("db.name")) // Recherche du nom de la BdD
|
2009-07-03 14:29:40 +02:00
|
|
|
oss << vm["db.name"].as<string>();
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
else
|
2009-07-03 14:29:40 +02:00
|
|
|
{
|
|
|
|
cerr << "Attention ! Nom de la BDD non spécifié, utilisation de la valeur par défaut..." << endl ;
|
|
|
|
oss << DEFAULT_BDD_NAME;
|
|
|
|
}
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
|
|
|
|
oss << "' user = '";
|
2009-07-16 17:25:14 +02:00
|
|
|
if (vm.count("db.user")) // Recherche du nom d'utilisateur de la BdD
|
2009-07-03 14:29:40 +02:00
|
|
|
oss << vm["db.user"].as<string>();
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
else
|
2009-07-03 14:29:40 +02:00
|
|
|
{
|
|
|
|
cerr << "Attention ! Utilisateur non spécifié pour la connexion à la BDD, utilisation de la valeur par défaut..." << endl ;
|
|
|
|
oss << DEFAULT_BDD_USER;
|
|
|
|
}
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
|
|
|
|
oss << "' password = '";
|
2009-07-16 17:25:14 +02:00
|
|
|
if (vm.count("db.passwd")) // Recherche du mot de passe
|
2009-07-03 14:29:40 +02:00
|
|
|
oss << vm["db.passwd"].as<string>() << "'";
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
else
|
2009-07-03 14:29:40 +02:00
|
|
|
{
|
|
|
|
cerr << "Attention ! Mot de passe non spécifié pour la connexion à la BDD, utilisation de la valeur par défaut..." << endl ;
|
|
|
|
oss << DEFAULT_BDD_PASS << "'";
|
|
|
|
}
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
|
2009-05-29 17:02:20 +02:00
|
|
|
buf = oss.str();
|
|
|
|
|
|
|
|
const char *conninfo = buf.c_str();
|
|
|
|
conn = PQconnectdb(conninfo);
|
|
|
|
|
|
|
|
if (PQstatus(conn) != CONNECTION_OK)
|
|
|
|
{
|
2009-07-03 14:29:40 +02:00
|
|
|
cout << "Erreur ! Connexion à la base de donnée échouée : " << PQerrorMessage(conn) << endl;
|
2009-05-29 17:02:20 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Création de la topology */
|
2009-05-29 17:02:20 +02:00
|
|
|
if (vm.count("input-topo")) pos.makeTopologyFromFile(vm["input-topo"].as<string>());
|
|
|
|
else pos.makeTopologyFromDb(conn);
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Création de la liste des points de passage */
|
2009-05-29 17:02:20 +02:00
|
|
|
if (vm.count("input-waypoint")) pos.makeWaypointListFromFile(vm["input-waypoint"].as<string>());
|
|
|
|
else pos.makeWaypointListFromDb(conn);
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Création de la liste des points de référence */
|
2009-05-29 17:02:20 +02:00
|
|
|
if (vm.count("input-refpoint")) pos.makeReferencePointListFromFile(vm["input-refpoint"].as<string>(), true);
|
|
|
|
else pos.makeReferencePointListFromDb(conn, true);
|
|
|
|
|
|
|
|
if (!pos.checkTopology())
|
|
|
|
{
|
2009-07-03 14:29:40 +02:00
|
|
|
cerr << "Erreur lors de la création de la topologie !" << endl;
|
2009-05-29 17:02:20 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
pos.makeReferencePointDistances();
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Création de la liste des Access Point */
|
2009-07-03 14:29:40 +02:00
|
|
|
if (vm.count("input-ap"))
|
|
|
|
pos.makeApListFromFile(vm["input-ap"].as<string>()) ;
|
|
|
|
else
|
|
|
|
pos.makeApListFromDb(conn) ;
|
2009-05-29 17:02:20 +02:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Server::start()
|
|
|
|
{
|
|
|
|
struct sockaddr_in serv_addr;
|
|
|
|
struct sockaddr_in client;
|
|
|
|
socklen_t client_len = sizeof(client);
|
|
|
|
Point solution;
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
char *mac = (char *) malloc(18 * sizeof(char));
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* Création d'une socket UDP */
|
|
|
|
listen_socket = socket(AF_INET, SOCK_DGRAM, 0) ;
|
|
|
|
if (listen_socket < 0)
|
2009-05-29 13:46:49 +02:00
|
|
|
{
|
2009-05-29 14:07:05 +02:00
|
|
|
cerr << "Échec de la création de la socket " << endl;
|
|
|
|
exit(1);
|
2009-05-29 13:46:49 +02:00
|
|
|
}
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* Remise à zéro et initialisation de la structure du serveur */
|
|
|
|
bzero((char *) &serv_addr, sizeof(serv_addr)) ; // RÀZ
|
|
|
|
serv_addr.sin_family = AF_INET ; // Socket INET
|
|
|
|
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY) ; // Toutes les connexions sont acceptées
|
|
|
|
serv_addr.sin_port = htons(listen_port) ; // Port d'écoute
|
GuiNuMo : gestion topologie
server.{hh,cc} :
* Utilisation d'une map plutôt que d'une multimap pour stocker la liste
des pièces. Conséquence : les noms des zones doivent être uniques, il
faut donc numéroter les zones des pièces composites (par exemple
« Couloir N1 A » et « Couloir N1 B »).
* Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des
zones auxquelles appartient un point.
* Modification de la fonction makeWaypointDistancesFromFile() (renommée
makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice
des distances entre points de passage (lecture d'une liste de points).
Abandon du format décrivant les points en visibilité (voir le fichier
cfg/distances.csv, supprimé à cette révision), puisque nous nous
servons des points de passage et de la description des zones pour
calculer les liens entre points. RESTE À FAIRE : prise en comppte de
la topologie dans le calcul de distance.
* Ajout de deux fonctions areaConnection() qui permettent de récupérer
la liste des points de passage d'une zone, ou faisant l'intersection
entre deux zones.
* Ajout de la fonction distanceTopology, qui calcule la distance entre
deux points en tenant compte de la topologie (zones et points de
passage entre elles).
* Ajout de la fonction makeReferencePointDistances(), qui calcule les
distances entre points de référence, en tenant compte de la
topologie.
* Ajout de la fonction point_vector_idx(), semblable à point_tab_idx()
mais pour un vector<Point>.
referencepoint.{hh,cc} :
* Ajout de l'operator de cast en Point (operator Point()).
area.{hh,cc} :
* Ajout de l'operator==(Area).
cfg/distances.csv
* Suppression de ce fichier obsolète.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* Réservation du port */
|
|
|
|
if (bind(listen_socket, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)
|
2009-05-29 13:46:49 +02:00
|
|
|
{
|
2009-05-29 14:07:05 +02:00
|
|
|
cerr << "Impossible de créer la socket (bind) " << endl;
|
|
|
|
close(listen_socket) ;
|
|
|
|
exit(1);
|
2009-05-29 13:46:49 +02:00
|
|
|
}
|
2008-06-20 12:37:25 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
cout << "Serveur prêt" << endl;
|
2008-04-15 12:19:15 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* Récupération des données envoyées par le client */
|
|
|
|
while (true)
|
2009-05-29 13:46:49 +02:00
|
|
|
{
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Attente d'une demande d'un serveur d'aggrégation */
|
2009-05-29 14:07:05 +02:00
|
|
|
if (recvfrom(listen_socket, &att_request, sizeof(att_request), 0, (struct sockaddr *) &client, &client_len) < 0)
|
2009-05-29 13:46:49 +02:00
|
|
|
{
|
2009-05-29 14:07:05 +02:00
|
|
|
cerr << "Aucun message reçu du client" << endl;
|
|
|
|
close(listen_socket);
|
|
|
|
return 1;
|
2009-05-29 13:46:49 +02:00
|
|
|
}
|
2008-05-05 13:59:55 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
recv_info.resize(att_request.nb_couples);
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", att_request.mobile_mac_addr_bytes[0],att_request.mobile_mac_addr_bytes[1],
|
|
|
|
att_request.mobile_mac_addr_bytes[2],att_request.mobile_mac_addr_bytes[3],
|
|
|
|
att_request.mobile_mac_addr_bytes[4],att_request.mobile_mac_addr_bytes[5]);
|
|
|
|
|
|
|
|
cout << "\n*** Message reçu de l'aggregator ***" << endl;
|
|
|
|
cout << "\tMAC Mobile\t: " << mac << endl;
|
|
|
|
cout << "\tHeure de la demande\t: " << timeval_to_ms(att_request.request_time) << endl;
|
|
|
|
cout << "\tNombre de couples\t: " << att_request.nb_couples << endl;
|
2008-05-05 13:59:55 +02:00
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Récupération des couples (AP;Puissance) */
|
2009-05-29 14:07:05 +02:00
|
|
|
for (int i = 0; i < att_request.nb_couples; i++)
|
|
|
|
recvfrom(listen_socket, &recv_info.at(i), sizeof(couple_info), 0, (struct sockaddr *) &client, &client_len);
|
2008-05-05 13:59:55 +02:00
|
|
|
|
2009-05-29 17:02:20 +02:00
|
|
|
treatment();
|
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
recv_info.clear();
|
2009-05-29 13:46:49 +02:00
|
|
|
}
|
2008-04-11 10:11:29 +02:00
|
|
|
}
|
|
|
|
|
2009-07-03 14:29:40 +02:00
|
|
|
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Calcul de la position avec les différents algo */
|
2009-05-29 17:02:20 +02:00
|
|
|
void Server::treatment()
|
2008-06-17 11:08:26 +02:00
|
|
|
{
|
2009-05-29 14:07:05 +02:00
|
|
|
Point solution;
|
2009-05-29 13:46:49 +02:00
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
int id_request; // Permet de récupérer l'id de la requête pour lui assigner les résultats
|
2009-05-29 17:02:20 +02:00
|
|
|
char *mac = (char *) malloc(18 * sizeof(char));
|
|
|
|
ostringstream oss;
|
|
|
|
|
|
|
|
PGresult *res;
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* */
|
2009-05-29 17:02:20 +02:00
|
|
|
Treatment treat(pos.getAccessPointList(), pos.getReferencePointList());
|
|
|
|
treat.makeMeasurementList(recv_info);
|
|
|
|
|
|
|
|
sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", att_request.mobile_mac_addr_bytes[0],att_request.mobile_mac_addr_bytes[1],
|
|
|
|
att_request.mobile_mac_addr_bytes[2],att_request.mobile_mac_addr_bytes[3],
|
|
|
|
att_request.mobile_mac_addr_bytes[4],att_request.mobile_mac_addr_bytes[5]);
|
|
|
|
|
|
|
|
oss << "SELECT r.id_request FROM request r, mobile m ";
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
oss << "WHERE r.mobile_time = " << timeval_to_ms(att_request.request_time);
|
2009-05-29 17:02:20 +02:00
|
|
|
oss << " AND m.id_mobile = r.id_mobile";
|
2009-07-16 17:25:14 +02:00
|
|
|
oss << " AND m.mobile_addr = '" << mac << "';"; // On recherche dans la BdD la requête consernée
|
2009-05-29 17:02:20 +02:00
|
|
|
|
|
|
|
res = PQexec(conn, oss.str().c_str());
|
2009-07-16 17:25:14 +02:00
|
|
|
id_request = (PQntuples(res) != 0)? from_string<int>(PQgetvalue(res, PQntuples(res) - 1, 0)): -1; // On conserve l'id de la requête
|
2009-05-29 17:02:20 +02:00
|
|
|
PQclear(res);
|
2009-05-29 13:46:49 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* Interlink Networks */
|
2009-05-29 17:02:20 +02:00
|
|
|
solution = treat.interlink(0) ;
|
|
|
|
createResult(solution, id_request, "Interlink Network");
|
2009-05-29 13:46:49 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* RADAR */
|
2009-05-29 17:02:20 +02:00
|
|
|
solution = treat.getkClosestInSs(1, NULL)[0] ;
|
|
|
|
createResult(solution, id_request, "Radar");
|
2009-05-29 13:46:49 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* FBCM */
|
2009-05-29 17:02:20 +02:00
|
|
|
solution = treat.fbcm(0) ;
|
|
|
|
createResult(solution, id_request, "FCBM");
|
2008-06-17 11:08:26 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* 1-NSS + FBCM */
|
2009-05-29 17:02:20 +02:00
|
|
|
solution = treat.getkClosestInSs(1, NULL)[0] ;
|
|
|
|
solution = treat.fbcm_friis(treat.computeFriisFromRefList(solution), solution.getZ()) ;
|
|
|
|
createResult(solution, id_request, "1-NSS + FBCM");
|
2008-04-15 12:19:15 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* 2-NSS */
|
2009-05-29 17:02:20 +02:00
|
|
|
solution = treat.getkWeightedInSs(2, NULL);
|
|
|
|
createResult(solution, id_request, "2-NSS");
|
2008-04-30 11:36:55 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* 3-NSS */
|
2009-05-29 17:02:20 +02:00
|
|
|
solution = treat.getkWeightedInSs(3, NULL);
|
|
|
|
createResult(solution, id_request, "3-NSS");
|
2008-06-20 12:37:25 +02:00
|
|
|
|
2009-05-29 14:07:05 +02:00
|
|
|
/* 5-NSS */
|
2009-05-29 17:02:20 +02:00
|
|
|
solution = treat.getkWeightedInSs(5, NULL);
|
|
|
|
createResult(solution, id_request, "5-NSS");
|
|
|
|
|
|
|
|
sendToClient(solution, mac);
|
|
|
|
free(mac);
|
|
|
|
}
|
2008-06-20 12:37:25 +02:00
|
|
|
|
2009-07-03 14:29:40 +02:00
|
|
|
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* Enregistrement du résultat dans la BdD */
|
2009-05-29 17:02:20 +02:00
|
|
|
void Server::createResult(Point solution, int id_request, string use_algo)
|
|
|
|
{
|
|
|
|
int id_result;
|
|
|
|
string buf;
|
|
|
|
ostringstream oss;
|
|
|
|
|
|
|
|
struct timeval current;
|
|
|
|
|
|
|
|
PGresult *res;
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
gettimeofday(¤t, NULL); // On récupère l'heure du calcul
|
2009-05-29 17:02:20 +02:00
|
|
|
|
|
|
|
buf = "SELECT * FROM result;";
|
|
|
|
|
|
|
|
res = PQexec(conn, buf.c_str());
|
|
|
|
id_result = (PQntuples(res) != 0)? from_string<int>(PQgetvalue(res, PQntuples(res) - 1, 0)) + 1: 1;
|
|
|
|
|
|
|
|
oss << "INSERT INTO result(id_result, x, y, z, calcul_date, using_algo";
|
2009-07-16 17:25:14 +02:00
|
|
|
if (id_request != -1) oss << ", id_request"; // Si la requête n'a pas été trouvé, on enregistre le résultat mais sans associé de requête
|
2009-05-29 17:02:20 +02:00
|
|
|
oss << ") VALUES('";
|
|
|
|
oss << id_result << "','" << solution.getX() << "','" << solution.getY() << "','" << solution.getZ();
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
oss << "','" << timeval_to_ms(current) << "','" << use_algo;
|
2009-07-16 17:25:14 +02:00
|
|
|
if (id_request != -1) oss << "','" << id_request;
|
2009-05-29 17:02:20 +02:00
|
|
|
oss << "');";
|
|
|
|
|
|
|
|
PQexec(conn, oss.str().c_str());
|
|
|
|
PQclear(res);
|
2008-06-12 13:27:34 +02:00
|
|
|
}
|
|
|
|
|
2009-07-03 14:29:40 +02:00
|
|
|
|
|
|
|
|
2009-05-29 17:02:20 +02:00
|
|
|
void Server::sendToClient(Point solution, char *mac)
|
2008-04-11 10:11:29 +02:00
|
|
|
{
|
2009-05-29 17:02:20 +02:00
|
|
|
int sockfd ; // Descripteur de la socket
|
|
|
|
struct sockaddr_in serv;
|
|
|
|
struct sockaddr_in mobile;
|
|
|
|
socklen_t mobile_len = sizeof(mobile);
|
|
|
|
ostringstream oss;
|
|
|
|
float x,y,z;
|
2008-06-12 13:27:34 +02:00
|
|
|
|
2009-05-29 17:02:20 +02:00
|
|
|
PGresult *res;
|
2009-05-29 13:46:49 +02:00
|
|
|
|
2009-05-29 17:02:20 +02:00
|
|
|
oss << "SELECT ip_mobile FROM mobile ";
|
2009-07-16 17:25:14 +02:00
|
|
|
oss << "WHERE mobile_addr = '" << mac << "';"; // On récupére l'adresse IP du mobile
|
2009-05-29 17:02:20 +02:00
|
|
|
|
|
|
|
res = PQexec(conn, oss.str().c_str());
|
|
|
|
if (PQntuples(res) != 0)
|
|
|
|
{
|
|
|
|
/* Ceation de la socket UDP */
|
|
|
|
sockfd = socket(AF_INET, SOCK_DGRAM, 0) ;
|
|
|
|
if (sockfd < 0)
|
2009-05-29 13:46:49 +02:00
|
|
|
{
|
2009-05-29 17:02:20 +02:00
|
|
|
cerr << "Échec de la création de la socket " << endl;
|
|
|
|
exit(1);
|
2009-05-29 13:46:49 +02:00
|
|
|
}
|
2009-05-29 17:02:20 +02:00
|
|
|
|
|
|
|
/* Remise à zéro et initialisation de la structure du server */
|
|
|
|
bzero((char *) &serv, sizeof(serv)) ;
|
|
|
|
serv.sin_family = AF_INET ; // Socket INET
|
|
|
|
serv.sin_addr.s_addr = htonl(INADDR_ANY) ; // Toutes les connexions
|
|
|
|
|
|
|
|
/* Remise à zéro et initialisation de la structure du mobile */
|
|
|
|
bzero((char *) &mobile, sizeof(mobile)) ; // RÀZ
|
|
|
|
mobile.sin_family = AF_INET ; // Socket INET
|
|
|
|
mobile.sin_addr.s_addr = inet_addr(PQgetvalue(res, 0, 0)) ;
|
|
|
|
mobile.sin_port = htons(mobile_port) ;
|
|
|
|
|
|
|
|
x = solution.getX();
|
|
|
|
y = solution.getY();
|
|
|
|
z = solution.getZ();
|
|
|
|
|
2009-07-16 17:25:14 +02:00
|
|
|
/* On envoie les coordonnées de la position */
|
2009-05-29 17:02:20 +02:00
|
|
|
sendto(sockfd, (void *)&x, sizeof(float), 0, (struct sockaddr *)&mobile, mobile_len);
|
|
|
|
sendto(sockfd, (void *)&y, sizeof(float), 0, (struct sockaddr *)&mobile, mobile_len);
|
|
|
|
sendto(sockfd, (void *)&z, sizeof(float), 0, (struct sockaddr *)&mobile, mobile_len);
|
|
|
|
|
|
|
|
close(sockfd);
|
Incorporation de la dernière version de Julien
Extrait de son courriel :
« Par rapport à la précédente j'ai surtout corrigé des bugs. »
Note : la version du listener portable sur Fonera, envoyée en même temps
par Julien, viendra plus tard (le temps que je l'incorpore).
Détail des changements après analyse du code :
aggregator : correction de bogues.
positioning :
* Ajout d'un fichier de config format boost (cfg/config.cfg).
* Makefile : implantation des cibles "install" et "uninstall" ; la cible
"astyle" devient "style".
* accesspoint.{hh,cc}, area.cc, measurement.hh, point.{hh,cc},
referencepoint.{hh,cc} : cosmétique.
* owlps-positioning.c : correction de la lecture du fichier de config
(ajout d'une option permettant de spécifier un fichier alternatif).
* server.cc : essentiellement correction des requêtes.
* libowlps-positioning.{hh,cc} : passage de "unsigned long long" à
"uint64_t" comme type de retour de timeval_to_ms().
writeInDb :
* Ajout de la gestion d'un fichier de config.
* Ajout de deux scripts pour la BDD.
git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@96 785a6c6c-259e-4ff1-8b91-dc31627914f0
2009-07-01 15:39:58 +02:00
|
|
|
cout << "Envoi de la position au client " << mac << " à l'adresse IP " << PQgetvalue(res, 0, 0) << endl;
|
2009-05-29 13:46:49 +02:00
|
|
|
}
|
2009-05-29 17:02:20 +02:00
|
|
|
PQclear(res);
|
2008-04-11 10:11:29 +02:00
|
|
|
}
|