154 lines
4.1 KiB
C++
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);
|
|
}
|
|
}
|
|
}
|