owlps/owlps-positioning/server.cc

154 lines
4.1 KiB
C++

#include "server.hh"
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 ;
}
Server::Server(int port)
{
listen_port = port;
client_len = sizeof(client);
/* Création d'une socket UDP */
listen_socket = socket(AF_INET, SOCK_DGRAM, 0) ;
if (listen_socket < 0)
{
cerr << "Échec de la création de la socket " << endl;
exit(1);
}
/* 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
/* Réservation du port */
if (bind(listen_socket, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)
{
cerr << "Impossible de créer la socket (bind) " << endl;
close(listen_socket) ;
exit(1);
}
}
int Server::initFile(const string &apfile, const string &ptfile, const string &topofile, const string &wayfile)
{
calcul.makeTopologyFromFile(topofile.c_str());
calcul.makeWaypointListFromFile(wayfile.c_str());
calcul.makeReferencePointListFromFile(ptfile.c_str(), true);
if (!calcul.checkTopology())
{
cerr << "Erreur lors de la création de la topology" << endl;
exit(1);
}
calcul.makeReferencePointDistances();
calcul.makeApListFromFile(apfile.c_str());
return 0;
}
int Server::start()
{
cout << "Serveur prêt" << endl;
/* Récupération des données envoyées par le client */
while (true)
{
if (recvfrom(listen_socket, &att_request, sizeof(att_request), 0, (struct sockaddr *) &client, &client_len) < 0)
{
cerr << "Aucun message reçu du client" << endl;
close(listen_socket);
return 1;
}
recv_info.resize(att_request.nb_couples);
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);
treatment(att_request, recv_info);
recv_info.clear();
}
}
void Server::treatment(request att_request, vector<couple_info> recv_info)
{
Treatment treat(calcul.getAccessPointList(), calcul.getReferencePointList());
Point solution;
makeMeasurementList(recv_info);
/* Interlink Networks */
solution = treat.interlink(point_list, 0) ;
cout << "Interlink Networks : "<< solution << endl;
/* RADAR */
solution = treat.getkClosestInSs(point_list, 1, NULL)[0] ;
cout << "RADAR : " << solution << endl;
/* FBCM */
solution = treat.fbcm(point_list, 0) ;
cout << "FBCM : " << solution << endl;
/* 1-NSS + FBCM */
solution = treat.getkClosestInSs(point_list, 1, NULL)[0] ;
solution = treat.fbcm_friis(point_list, treat.computeFriisFromRefList(solution, point_list), solution.getZ()) ;
cout << "1-NSS + FBCM : " << solution << endl;
/* 2-NSS */
solution = treat.getkWeightedInSs(point_list, 2, NULL);
cout << "2-NSS : " << solution << endl;
/* 3-NSS */
solution = treat.getkWeightedInSs(point_list, 3, NULL);
cout << "3-NSS : " << solution << endl;
/* 5-NSS */
solution = treat.getkWeightedInSs(point_list, 5, NULL);
cout << "5-NSS : " << solution << endl;
cout << endl ;
point_list.clear();
}
void Server::makeMeasurementList(vector<couple_info> recv_info)
{
Measurement m;
bool inserted = false;
for (unsigned int i = 0; i < recv_info.size(); i++)
{
string mac_a = mac_bytes_to_string(recv_info.at(i).ap_mac_addr_bytes);
int value = recv_info.at(i).antenna_signal_dbm;
for (unsigned int j = 0 ; j < point_list.size() ; j++)
if (point_list[j].getMacAddr() == mac_a)
{
point_list[j].addSsValue(value);
inserted = true;
break;
}
if (inserted == false)
{
m.setMacAddr(mac_a);
m.addSsValue(value);
point_list.push_back(m);
}
}
}