diff --git a/GuiNuMo-server/Makefile b/GuiNuMo-server/Makefile new file mode 100644 index 0000000..621727c --- /dev/null +++ b/GuiNuMo-server/Makefile @@ -0,0 +1,35 @@ +GXX=g++ +GXXFLAGS=-Wall -O2 +LD=g++ +LDFLAGS= -lm -O2 + +all: test + +clientinfo.o: clientinfo.cc clientinfo.hh point.hh + $(GXX) $(GXXFLAGS) clientinfo.cc -c -o clientinfo.o + +server.o: server.cc server.hh clientinfo.hh referencepoint.hh accesspoint.hh point.hh measurement.hh + $(GXX) $(GXXFLAGS) server.cc -c -o server.o + +referencepoint.o: referencepoint.cc referencepoint.hh measurement.hh point.hh + $(GXX) $(GXXFLAGS) referencepoint.cc -c -o referencepoint.o + +accesspoint.o: accesspoint.cc accesspoint.hh point.hh + $(GXX) $(GXXFLAGS) accesspoint.cc -c -o accesspoint.o + +point.o: point.cc point.hh + $(GXX) $(GXXFLAGS) point.cc -c -o point.o + +measurement.o: measurement.cc measurement.hh + $(GXX) $(GXXFLAGS) measurement.cc -c -o measurement.o + +test.o: test.cc point.hh measurement.hh accesspoint.hh referencepoint.hh clientinfo.hh server.hh + $(GXX) $(GXXFLAGS) test.cc -c -o test.o + +test: test.o point.o measurement.o accesspoint.o referencepoint.o clientinfo.o server.o + $(LD) $(LDFLAGS) -o test test.o point.o measurement.o accesspoint.o referencepoint.o clientinfo.o server.o + +clean: + rm -fv *~ + rm -fv *.o + rm -fv test diff --git a/GuiNuMo-server/access_points.cfg b/GuiNuMo-server/access_points.cfg new file mode 100644 index 0000000..2efb7ba --- /dev/null +++ b/GuiNuMo-server/access_points.cfg @@ -0,0 +1,5 @@ +#mac@;x;y;z;antenna;power +00:09:5b:42:ed:5b;4.50;22.00;0.00;5.00;20.00 +00:13:10:1f:77:5f;1.50;5.50;3.00;2.00;20.00 +00:18:39:c5:c3:26;25.00;20.00;0.00;2.00;20.00 + diff --git a/GuiNuMo-server/accesspoint.cc b/GuiNuMo-server/accesspoint.cc new file mode 100644 index 0000000..c889a83 --- /dev/null +++ b/GuiNuMo-server/accesspoint.cc @@ -0,0 +1,67 @@ +#include "accesspoint.hh" + +AccessPoint::AccessPoint() +{ + coordinates.setX(0); + coordinates.setY(0); + coordinates.setZ(0); + ap_addr = ""; + friis_index = 0; + freq = 2412; + antenna_gain = 2; //a good value + output_power = 20; //another good value, eq. to 100mW +} + +AccessPoint::AccessPoint(string addr, float fidx, Point coords, unsigned int f, float antg, float outp) +{ + coordinates = coords; + ap_addr = addr; + friis_index = fidx; + freq = f; + antenna_gain = antg; + output_power = outp; +} + +AccessPoint::AccessPoint(const AccessPoint &ap) +{ + coordinates = ap.coordinates; + ap_addr = ap.ap_addr; + friis_index = ap.friis_index; + freq = ap.freq; + antenna_gain = ap.antenna_gain; + output_power = ap.output_power; +} + +bool AccessPoint::operator==(const AccessPoint &ap)const +{ + if(ap_addr == ap.ap_addr) + return true; + return false; +} + +bool AccessPoint::operator!=(const AccessPoint &ap)const +{ + if(ap_addr != ap.ap_addr) + return true; + return false; +} + +AccessPoint AccessPoint::operator=(const AccessPoint &ap) +{ + if(this == &ap) + return *this; + ap_addr = ap.ap_addr; + friis_index = ap.friis_index; + return *this; +} + +ostream &operator<<(ostream & os, AccessPoint & ap) +{ + os << "MAC Address: " << ap.ap_addr << endl; + os << "Coordinates: " << ap.coordinates << endl; + os << "Frequency: " << ap.freq << " Hz" << endl; + os << "Antenna gain: " << ap.antenna_gain << "dBi" << endl; + os << "Output power: " << ap.output_power << "dBm" << endl; + + return os; +} diff --git a/GuiNuMo-server/accesspoint.hh b/GuiNuMo-server/accesspoint.hh new file mode 100644 index 0000000..d6f1056 --- /dev/null +++ b/GuiNuMo-server/accesspoint.hh @@ -0,0 +1,45 @@ +#ifndef _ACCESSPOINT_HH_ +#define _ACCESSPOINT_HH_ + +#include +#include +#include "point.hh" + +using namespace std; +using std::string; + +class AccessPoint +{ + protected: + Point coordinates; + string ap_addr; + float friis_index; + unsigned int freq; + float antenna_gain; + float output_power; + + public: + AccessPoint(); + AccessPoint(string addr, float fidx, Point coords, unsigned int f, float antg, float outp); + AccessPoint(const AccessPoint &ap); + ~AccessPoint() {}; + string getApAddr()const { return ap_addr; }; + float getFriisIndex()const { return friis_index; }; + Point getCoordinates()const { return coordinates; }; + float getAntennaGain()const { return antenna_gain; }; + unsigned int getFrequency()const { return freq; }; + float getOutputPower()const { return output_power; }; + void setApAddr(string addr) { ap_addr = addr; }; + void setFriisIndex(float fidx) { friis_index = fidx; }; + void setCoordinates(Point apc) { coordinates = apc; }; + void setCoordinates(float x, float y, float z) { Point apc(x, y, z); coordinates = apc; }; + void setFrequency(unsigned int f) { freq = f; }; + void setAntennaGain(float antg) { antenna_gain = antg; }; + void setOutputPower(float outp) {output_power = outp; }; + bool operator==(const AccessPoint &ap)const; + bool operator!=(const AccessPoint &ap)const; + AccessPoint operator=(const AccessPoint &ap); + friend ostream &operator<<(ostream & os, AccessPoint & ap); +}; + +#endif diff --git a/GuiNuMo-server/accesspoints.cfg b/GuiNuMo-server/accesspoints.cfg new file mode 100644 index 0000000..67326ba --- /dev/null +++ b/GuiNuMo-server/accesspoints.cfg @@ -0,0 +1,3 @@ +00:09:5b:42:ed:5b;3.50;22.50;0.00;2462000000;5.0;20.0 +00:13:10:1f:77:5f;1.70;4.70;3.00;2462000000;2.1;20.0 +00:18:39:c5:c3:26;27.0;20.0;0.00;2462000000;2.1;20.0 diff --git a/GuiNuMo-server/area.cc b/GuiNuMo-server/area.cc new file mode 100644 index 0000000..786fe5e --- /dev/null +++ b/GuiNuMo-server/area.cc @@ -0,0 +1,41 @@ +#include "area.hh" + +Area::Area() +{ + area_name = "None"; + x_min = 0; + x_max = 0; + y_min = 0; + y_max = 0; + z_min = 0; + z_max = 0; +} + +Area::Area(string an, float x1, float x2, float y1, float y2, float z1, float z2) +{ + area_name = an; + x_min = x1; + x_max = x2; + y_min = y1; + y_max = y2; + z_min = z1; + z_max = z2; +} + +Area::Area(const Area &a) +{ + area_name = a.area_name; + x_min = a.x_min; + x_max = a.x_max; + y_min = a.y_min; + y_max = a.y_max; + z_min = a.z_min; + z_max = a.z_max; +} + +bool Area::containsPoint(Point p)const +{ + if((p.getX()>=x_min)&&(p.getX()<=x_max)&&(p.getY()>=y_min)&&(p.getY()<=y_max)&&(p.getZ()>=z_min)&&(p.getZ()<=z_max)) + return true; + return false; +} diff --git a/GuiNuMo-server/area.hh b/GuiNuMo-server/area.hh new file mode 100644 index 0000000..9c8f8c9 --- /dev/null +++ b/GuiNuMo-server/area.hh @@ -0,0 +1,43 @@ +#ifndef _AREA_HH_ +#define _AREA_HH_ + +#include +#include + +using namespace std; +using std::string; + +class Area +{ +protected: + string area_name; + float x_min; + float x_max; + float y_min; + float y_max; + float z_min; + float z_max; + +public: + Area(); + Area(string an, float x1, float x2, float y1, float y2, float z1, float z2); + Area(const Area &a); + ~Area() {}; + bool containsPoint(Point p)const; + string getLabel()const { return label; }; + float getXmin()const { return x_min; }; + float getXmax()const { return x_max; }; + float getYmin()const { return y_min; }; + float getYmax()const { return y_max; }; + float getZmin()const { return z_min; }; + float getZmax()const { return z_max; }; + void setLabel(string l) { label = l; }; + void setXmin(float v) { x_min = v; }; + void setXmax(float v) { x_max = v; }; + void setYmin(float v) { y_min = v; }; + void setYmax(float v) { y_max = v; }; + void setZmin(float v) { z_min = v; }; + void setZmax(float v) { z_max = v; }; +}; + +#endif diff --git a/GuiNuMo-server/clientinfo.cc b/GuiNuMo-server/clientinfo.cc new file mode 100644 index 0000000..1723923 --- /dev/null +++ b/GuiNuMo-server/clientinfo.cc @@ -0,0 +1,26 @@ +#include "clientinfo.hh" + +ClientInfo::ClientInfo() +{ + client_ip = "127.0.0.1"; + antenna_gain = 2; //good default value + client_listen_port = CLIENT_DEFAULT_PORT; + for(int i=0;i<5;i++) + viterbi_distances[i] = 0; +} + +ClientInfo::ClientInfo(string ip, int port, float antg) +{ + client_ip = ip; + antenna_gain = antg; + client_listen_port = port; + for(int i=0;i<5;i++) + viterbi_distances[i] = 0; +} + +ClientInfo::~ClientInfo() +{ + viterbi_vector1.clear(); + viterbi_vector2.clear(); +} + diff --git a/GuiNuMo-server/clientinfo.hh b/GuiNuMo-server/clientinfo.hh new file mode 100644 index 0000000..b7249e1 --- /dev/null +++ b/GuiNuMo-server/clientinfo.hh @@ -0,0 +1,31 @@ +#ifndef _CLIENTINFO_HH_ +#define _CLIENTINFO_HH_ + +#include +#include +#include +#include "point.hh" + +using namespace std; +using std::string; + +#define CLIENT_DEFAULT_PORT 7778 + +class ClientInfo +{ +protected: + string client_ip; + float antenna_gain; + int client_listen_port; + vector viterbi_vector1; /* Previous vector */ + vector viterbi_vector2; /* Last vector */ + float viterbi_distances[5]; + +public: + ClientInfo(); + ClientInfo(string ip, int port, float antg); + ~ClientInfo(); + float getAntennaGain()const { return antenna_gain; }; +}; + +#endif diff --git a/GuiNuMo-server/measurement.cc b/GuiNuMo-server/measurement.cc new file mode 100644 index 0000000..d9a17ea --- /dev/null +++ b/GuiNuMo-server/measurement.cc @@ -0,0 +1,33 @@ +#include "measurement.hh" + +void Measurement::addSsValue(int ssv) +{ + float ss_mwatts = pow(10, (float) ssv / 10.0) + (ss_list.size() * pow(10, average_ss / 10.0)); + + ss_list.push_back(ssv); + average_ss = 10 * log10(ss_mwatts / ss_list.size()); +} + +float Measurement::getSsSquareDistance(float ss)const +{ + return ((ss - average_ss) * (ss - average_ss)); +} + +ostream &operator<<(ostream &os, Measurement &m) +{ + unsigned int i; + + os << m.mac_addr << "->"; + if(m.ss_list.size() == 0) + os << "No values"; + else + for(i=0;i +#include +#include +#include + +using namespace std; +using std::string; + +class Measurement +{ + protected: + string mac_addr; + float average_ss; + vector ss_list; + + public: + Measurement() { mac_addr = "ff:ff:ff:ff:ff:ff"; average_ss = 0; }; + Measurement(string ma, float avg, vector ssl) { mac_addr = ma; average_ss = avg, ss_list = ssl; }; + Measurement(const Measurement &m) { mac_addr = m.mac_addr; average_ss = m.average_ss; ss_list = m.ss_list; }; + ~Measurement() { ss_list.clear(); }; + vector getSsList()const { return ss_list; }; + float getAverage()const { return average_ss; }; + string getMacAddr()const { return mac_addr; }; + void addSsValue(int ssv); + void setMacAddr(string ma) { mac_addr = ma; }; + float getSsSquareDistance(float ss)const; + friend ostream &operator<<(ostream &os, Measurement &m); +}; + +#endif diff --git a/GuiNuMo-server/point.cc b/GuiNuMo-server/point.cc new file mode 100644 index 0000000..976b1d7 --- /dev/null +++ b/GuiNuMo-server/point.cc @@ -0,0 +1,31 @@ +#include "point.hh" + +Point Point::operator=(const Point &p) +{ + if(this == &p) + return *this; + x = p.x; + y = p.y; + z = p.z; + return *this; +} + +bool Point::operator==(const Point &p)const +{ + if((x == p.x)&&(y == p.y)&&(z == p.z)) + return true; + return false; +} + +bool Point::operator!=(const Point &p)const +{ + if((x == p.x)&&(y == p.y)&&(z == p.z)) + return false; + return true; +} + +ostream &operator<<(ostream &os, const Point &p) +{ + os << "(" << p.x << ";" << p.y << ";" << p.z << ")"; + return os; +} diff --git a/GuiNuMo-server/point.hh b/GuiNuMo-server/point.hh new file mode 100644 index 0000000..dba68d1 --- /dev/null +++ b/GuiNuMo-server/point.hh @@ -0,0 +1,36 @@ +#ifndef _POINT_HH_ +#define _POINT_HH_ + +#include +#include + +using namespace std; + +class Point +{ + protected: + float x; + float y; + float z; + + public: + Point() { x = 0; y = 0; z = 0; }; + Point(const Point &p) { x = p.x; y = p.y; z = p.z; } ; + Point(float my_x, float my_y, float my_z) { x = my_x; y = my_y; z = my_z; }; + ~Point() {}; + float getX()const { return x; }; + float getY()const { return y; }; + float getZ()const { return z; }; + void setX(float my_x) { x = my_x; }; + void setY(float my_y) { y = my_y; }; + void setZ(float my_z) { z = my_z; }; + float squareDistance(const Point &p)const { return ((x-p.x)*(x-p.x))+((y-p.y)*(y-p.y))+((z-p.z)*(z-p.z)); }; + float squareDistance(float mx, float my, float mz)const { return ((x-mx)*(x-mx))+((y-my)*(y-my))+((z-mz)*(z-mz)); }; + float distance(const Point &p)const { return sqrt(((x-p.x)*(x-p.x))+((y-p.y)*(y-p.y))+((z-p.z)*(z-p.z))); }; + Point operator=(const Point &p); + bool operator==(const Point &p)const; + bool operator!=(const Point &p)const; + friend ostream &operator<<(ostream & os, const Point &p); +}; + +#endif diff --git a/GuiNuMo-server/referencepoint.cc b/GuiNuMo-server/referencepoint.cc new file mode 100644 index 0000000..0a56c24 --- /dev/null +++ b/GuiNuMo-server/referencepoint.cc @@ -0,0 +1,82 @@ +#include "referencepoint.hh" + +float ReferencePoint::getSsSquareDistance(vector m)const +{ + unsigned int i, j; + float ret = 0; + bool found; + + for(i=0;i +#include +#include "point.hh" +#include "measurement.hh" + +using namespace std; + +class ReferencePoint +{ +protected: + Point coordinates; + vector measurement_list; + +public: + ReferencePoint() { coordinates.setX(0); coordinates.setY(0); coordinates.setZ(0); }; + ReferencePoint(const ReferencePoint &rp) { coordinates = rp.coordinates; measurement_list = rp.measurement_list; }; + ReferencePoint(float x, float y, float z) { coordinates.setX(x); coordinates.setY(y); coordinates.setZ(z); }; + ReferencePoint(Point c) { coordinates = c; }; + ~ReferencePoint() { measurement_list.clear(); }; + float getSsSquareDistance(vector m)const; + Point getCoordinates()const { return coordinates; }; + void addMeasurement(string mac_a, int value); + void setCoordinates(Point p) { coordinates = p; }; + ReferencePoint operator=(const ReferencePoint &rp); + friend ostream &operator<<(ostream &os, ReferencePoint &rp); + vector getMeasurementList()const { return measurement_list; }; + bool getPowerForAp(string ap_mac, float * p)const; +}; + +#endif diff --git a/GuiNuMo-server/server.cc b/GuiNuMo-server/server.cc new file mode 100644 index 0000000..fe9fae4 --- /dev/null +++ b/GuiNuMo-server/server.cc @@ -0,0 +1,738 @@ +#include "server.hh" + +/* Misc. very usefull functions */ +/* Explodes a string into substrings based on separator sep. Returns a string vector. */ +inline vector explode(string input, char sep) +{ + vector vs; + string tmp; + unsigned int i; + + for(i=0;i>tmp; + return tmp; +} + +/* Function to convert a string to an unsigned integer */ +inline unsigned int string2uint(string nb) +{ + istringstream iss(nb); + + unsigned int tmp; + iss>>tmp; + return tmp; +} + +/* Function to convert a string to a float */ +inline float string2float(string nb) +{ + istringstream iss(nb); + + float tmp; + iss>>tmp; + return tmp; +} + +/* Function extracts ints from string */ +inline vector extractValues(string buff) +{ + unsigned int ptr = 0; + vector ret; + string tmp_field; + + if(buff[buff.size()-1] != ';') + buff.push_back(';'); + + while(ptr < buff.size()) + { + if(buff[ptr] != ';') + tmp_field.push_back(buff[ptr]); + else + { + ret.push_back(string2int(tmp_field)); + tmp_field.clear(); + } + ptr++; + } + return ret; +} + +inline vector extractReferencePointInfoFromBuffer(string buffer_in) +{ + unsigned int i = 0; + string tmp_field; + vector ret; + + /* Extract coordinates */ + /* x */ + while(buffer_in[i] != ';') + { + tmp_field.push_back(buffer_in[i]); + i++; + } + ret.push_back(tmp_field); + tmp_field.clear(); + i++; //go after the ';' + + /* y */ + while(buffer_in[i] != ';') + { + tmp_field.push_back(buffer_in[i]); + i++; + } + ret.push_back(tmp_field); + tmp_field.clear(); + i++; + + /* Extract direction (not used now) */ + while(buffer_in[i] != ';') + { + tmp_field.push_back(buffer_in[i]); + i++; + } + ret.push_back(tmp_field); + tmp_field.clear(); + i++; + + /* Extract mac address */ + while(buffer_in[i] != ';') + { + tmp_field.push_back(buffer_in[i]); + i++; + } + ret.push_back(tmp_field); + tmp_field.clear(); + i++; + + /* Extract scan list */ + while(i < buffer_in.size()) + { + tmp_field.push_back(buffer_in[i]); + i++; + } + ret.push_back(tmp_field); + tmp_field.clear(); + + /* Return the vector with each data */ + return ret; +} +/* ***************************************************************** */ + +Server::Server() +{ + /* Open socket */ + sockListen = socket(PF_INET, SOCK_DGRAM, 0); + sockSend = socket(PF_INET, SOCK_DGRAM, 0); + + /* Set addr */ + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(DEFAULT_LISTEN_PORT); + server_addr.sin_addr.s_addr = inet_addr(DEFAULT_IP); + memset(server_addr.sin_zero, '\0', sizeof(server_addr.sin_zero)); + + /* Bind */ + bind(sockListen, (struct sockaddr *)&server_addr, sizeof(server_addr)); +} + +Server::Server(string ip_addr, int listen_port, int send_port) +{ + /* Open socket */ + sockListen = socket(PF_INET, SOCK_DGRAM, 0); + sockSend = socket(PF_INET, SOCK_DGRAM, 0); + + /* Set addr */ + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(listen_port); + server_addr.sin_addr.s_addr = inet_addr(ip_addr.c_str()); + memset(server_addr.sin_zero, '\0', sizeof(server_addr.sin_zero)); + + /* Bind */ + bind(sockListen, (struct sockaddr *)&server_addr, sizeof(server_addr)); +} + +Server::~Server() +{ + client_list.clear(); + reference_point_list.clear(); + access_point_list.clear(); + close(sockListen); + close(sockSend); +} + +void Server::send_to_client(int cl) +{ + /* Do not forget to implement later: usefull for a demo */ +} + +int Server::receive_data() +{ + /* Do not forget to implement later: usefull for a demo */ + return 0; +} + +bool Server::pointExists(float x, float y, float z)const +{ + Point p(x, y, z); + unsigned int i; + + for(i=0;i Server::getkClosestInSs(vector m, unsigned int k, bool ignore_point, Point point_ignored)const +{ + unsigned int i, j, min_idx; + vector distances_vector; + vector points_vector; + Point tmp_pt; + float tmp_distance = 0, dist_max = 10000000, tmp_min; + + for(i=0;i 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[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 Server::getkWeightedInSs(vector m, unsigned int k, bool ignore_point, Point point_ignored)const +{ + unsigned int i, j; + vector distances_vector; + vector points_vector; + float tmp_distance = 0, dist_max = 10000000; + Point ret; + float total = 0, x = 0, y = 0, z = 0; + + for(i=0;i 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 vp)const +{ + unsigned int i; + float x=0, y=0, z=0; + Point p; + + for(i=0;i m, int client_idx)const +{ + Point ret(0, 0, 0); + vector addr; + vector dist_vect; + vector centres; + unsigned int i, ap_idx; + float constant_term, minmax_res, minmax_max; + float x = MINMAX_X_START, y = MINMAX_Y_START; + + i = 0; + //cout << "FBCM: "; + for(i=0;i minmax_max) + minmax_max = centres[i].squareDistance(x, y, 3) - (dist_vect[i]*dist_vect[i]); + if(minmax_max < minmax_res) + { + ret.setX(x); + ret.setY(y); + minmax_res = minmax_max; + } + } + + /* Clear all vectors */ + addr.clear(); + dist_vect.clear(); + centres.clear(); + + /* Return position */ + return ret; +} + +Point Server::interlink(vector m, int client_idx)const +{ + Point ret(0, 0, 0); + vector addr; + vector dist_vect; + vector centres; + unsigned int i, ap_idx; + float constant_term, minmax_res, minmax_max; + float x = MINMAX_X_START, y = MINMAX_Y_START; + + i = 0; + for(i=0;i minmax_max) + minmax_max = centres[i].squareDistance(x, y, 3) - (dist_vect[i]*dist_vect[i]); + if(minmax_max < minmax_res) + { + ret.setX(x); + ret.setY(y); + minmax_res = minmax_max; + } + } + + /* Clear all vectors */ + addr.clear(); + dist_vect.clear(); + centres.clear(); + + /* Return position */ + return ret; +} + +void Server::makeReferencePointListFromFile(string filename) +{ + ifstream input_file; + char buffer[BUFFER_LENGTH]; + string lecture_fichier; + ReferencePoint rp; + Point tmp_point; + float x, y; + unsigned int i, pt_idx; + string cpp_buffer, tmp_mes; + vector measures_vector; + vector infos; + + input_file.open(filename.c_str()); + while(!input_file.eof()) + { + input_file.getline(buffer, BUFFER_LENGTH); + if ((input_file.rdstate() & ifstream::eofbit ) == 0 ) + { + /* Extract fields */ + cpp_buffer = buffer; + infos = extractReferencePointInfoFromBuffer(cpp_buffer); + x = string2float(infos[0]); + y = string2float(infos[1]); + /* Set point coordinates */ + tmp_point.setX(x); + tmp_point.setY(y); + tmp_point.setZ(DEFAULT_Z); + /* Use C++ string format */ + if(!pointExists(tmp_point)) + { + rp.setCoordinates(tmp_point); + reference_point_list.push_back(rp); + } + pt_idx = pointIndex(tmp_point); + measures_vector = extractValues(infos[4]); + for(i=0;i ap_infos; + AccessPoint tmp_ap; + + input_file.open(filename.c_str()); + while(!input_file.eof()) + { + input_file.getline(buffer, BUFFER_LENGTH); + if ((input_file.rdstate() & ifstream::eofbit ) == 0 ) + { + ap_infos = explode(buffer, ';'); + cout << buffer << endl; + for(unsigned int i=0;i 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; + + for(i=0;i " << (friis_sum / friis_idx_list.size()) << endl; + friis_idx_list.clear(); + } +} + +/* + * Function computes new cumulative distances for each running viterbi instance, + * Returns the solution (type: Point) of the last ended viterbi. + * Distances are grouped by line corresponding to an instance. + * vk MUST be the same as last.size() and current.size() ! + */ +Point Server::viterbiLike(float ** dists, unsigned short vk, unsigned short vn, vector last, vector current) +{ + unsigned int i, j, k; + float min; + vector last_dists; + Point position; + + /* Compute the ending viterbi: line 0 */ + for(i=0;i solutions; + Point solution, solution_kw, ref_coords; + unsigned int i; + vector vm; + + makeReferencePointListFromFile("complete-scan.csv"); + makeApListFromFile("accesspoints.cfg"); + computeFriisFromRefList(); + + /* Open a log file */ + logfile.open("radar_exp.csv"); + + /* Column names */ + logfile << "Coordinates\t2-kss\t(Error)\t3-kss\t(Error)\t4-kss\t(Error)\t5-kss\t(Error)\tnss\t(Error)\tInterlink\t(Error)\tFBCM\t(Error)" << endl; + + for(i=0;i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "clientinfo.hh" +#include "referencepoint.hh" +#include "accesspoint.hh" +#include "point.hh" +#include "measurement.hh" + +using namespace std; +using std::string; + +#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 -1 +#define MINMAX_Y_START -1 +#define MINMAX_X_STOP 15 +#define MINMAX_Y_STOP 45 +#define BUFFER_LENGTH 1024 +#define DEFAULT_Z 3 +#define DEFAULT_VITERBI_K 5 + +class Server +{ +protected: + vector client_list; + vector reference_point_list; + vector access_point_list; + struct sockaddr_in server_addr; + int sockListen; + int sockSend; + +public: + Server(); + Server(string ip_addr, int listen_port, int send_port); + ~Server(); + void send_to_client(int cl); + int receive_data(); + bool pointExists(float x, float y, float z)const; + unsigned int pointIndex(float x, float y, float z)const; + bool pointExists(Point p)const; + bool apExists(string ap_addr)const; + unsigned int apIndex(string ap_addr)const; + unsigned int pointIndex(Point p)const; + vector getkClosestInSs(vector m, unsigned int k, bool ignore_point, Point point_ignored)const; + Point getkWeightedInSs(vector m, unsigned int k, bool ignore_point, Point point_ignored)const; + Point kPointsAverage(vector vp)const; + Point fbcm(vector m, int client_idx)const; + Point interlink(vector m, int client_idx)const; + void makeReferencePointListFromFile(string filename); + void makeApListFromFile(string filename); + void printReferencePointList(); + void printAccessPointList(); + void computeFriisFromRefList(); + unsigned int getNbReferencePoints()const { return reference_point_list.size(); }; + /* For experimentation purpose only ! */ + void radar_exp(); +}; + +#endif diff --git a/GuiNuMo-server/test.bash b/GuiNuMo-server/test.bash new file mode 100644 index 0000000..b86003c --- /dev/null +++ b/GuiNuMo-server/test.bash @@ -0,0 +1,3 @@ +#!/bin/bash + +./test 1060-scan.csv 1080-scan.csv 1100-scan.csv 1070-scan.csv 1090-scan.csv couloir-scan.csv diff --git a/GuiNuMo-server/test.cc b/GuiNuMo-server/test.cc new file mode 100644 index 0000000..11d1686 --- /dev/null +++ b/GuiNuMo-server/test.cc @@ -0,0 +1,25 @@ +#include +#include +#include +#include "referencepoint.hh" +#include "measurement.hh" +#include "accesspoint.hh" +#include "clientinfo.hh" +#include "server.hh" +#include "point.hh" + +using namespace std; +using std::string; + +#define BUFFER_LENGTH 1024 + +int main(int argc, char ** argv) +{ + ofstream output_file; + string read_file; + Server my_server; + + my_server.radar_exp(); + + return 0; +}