diff --git a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/README.txt b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/README.txt index 87e991c1fe53ab91278f646c8a99c82fb09a6d08..69dc0fc9c447d93fd46965077109b3df85e0bb1e 100644 --- a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/README.txt +++ b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/README.txt @@ -7,7 +7,7 @@ # # Rui Costa <ferreira@eurecom.fr> # -# v1.12 (13 Oct 2014) +# v1.13 (15 Oct 2014) # ######################################## @@ -83,6 +83,14 @@ 2.3. CRM This component of the demo MUST be compiled and installed separately. Check <spectra_root_folder>/CRM/ for more details. + There is a google app that must be running in the google cloud, + and it's url configured in the source code. The local client is based + on the C++ REST framework codenamed "Casablanca". + Furthermore you need to compile the local client components + (CRMClient and CRMMain). + In the CRM client you will find a folder <tosend> which includes some + basic scripts that populate the google app database, and show how to + interact with it. 2.4. TVWS Sensing Measurements There is a server and client for simulating the TVWS measurements and @@ -180,7 +188,7 @@ -######################################## +################################################################################ CHANGELOG v0.99 (03/09/2014) @@ -248,4 +256,15 @@ v1.12 (13/10/2014) - Added final version to openair svn - Reworked README file. +v1.13 (15/10/2014) + - Polishing of the demo + - Added bug fixes on launch scripts for enb1 + - Added feature to put measurements on CRM from enb1 + - Changed readable output of received measurement reports on enb2 + - Added more informative output on the sensingClient (TVWS) + - Demonstration now stops at end of MIH_Link_Actions.confirm + message on MIH_User of enb2 + - Added info on sensing client and CRM + - Reworked README file. +################################################################################ EOF diff --git a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/clientSensing/client/server b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/clientSensing/client/server index 4b6559bfa6a4e92c0dd826805cb19df6c6566bdd..8bea168ace9d6796637245efbac75182bacb3f92 100644 Binary files a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/clientSensing/client/server and b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/clientSensing/client/server differ diff --git a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/clientSensing/client/spectra_deamon.c b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/clientSensing/client/spectra_deamon.c index c4e75d456b74f819b9bacd2fd21fb91b0f66fbac..869f581e986f711b70c883e6b27c9f6414b05be4 100644 --- a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/clientSensing/client/spectra_deamon.c +++ b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/clientSensing/client/spectra_deamon.c @@ -109,10 +109,10 @@ void *connection_handler(int fd) { /* now loop, receiving data and printing what we received */ for (;;) { - printf("---\n Waiting on port %d\n", PORT); + printf("\n[SPECTRA Sensing Module] Started!\n[SPECTRA Sensing Module] ---\n[SPECTRA Sensing Module] Waiting on port %d\n", PORT); recvlen = recvfrom(fd, rawPacket, MAX_PACKET_SIZE, 0, (struct sockaddr *) &remaddr, &addrlen); - printf("Received %d bytes > ", recvlen); + printf("\n[SPECTRA Sensing Module] Received Data (%d bytes) > ", recvlen); for (i=0; i<recvlen;i++){ printf("%x ", (rawPacket[i] & 0xff)); @@ -126,7 +126,7 @@ void *connection_handler(int fd) { } else { request = assembleMessage(&rawPacket); - printf(" > Received spectra packet %i of type %i for function %i with %i parameters\n", + printf("\n[SPECTRA Sensing Module] > Received spectra packet %i of type %i for function %i with %i parameters\n", request.messageID, (uint32_t) request.type, (uint32_t) request.function, (uint32_t) request.numberOfparameters); @@ -135,7 +135,7 @@ void *connection_handler(int fd) { if (request.type == EndProcessing) { returnMessage = createReturnPacket(&request, 0, EndProcessing); - printf("End processing!!!\n"); + printf("\n[SPECTRA Sensing Module] Received: End of cognitive algorithm processing!\n"); fflush(stdout); } else { if (request.function == EnergyDetection) { @@ -143,11 +143,11 @@ void *connection_handler(int fd) { // circular loop over the score list scoreIndex = (scoreIndex < (sizeof(scoresList)/ sizeof(scoresList[0]))) ? scoreIndex : 0; - - printf("Score value: %16llx (%lld)\n", + printf("\n[SPECTRA Sensing Module] Received: Energy Detection Request!\n"); + printf("\n[SPECTRA Sensing Module] Processing Score value: %16llx (%lld)\n", (long long int)scoresList[scoreIndex], (long long int)scoresList[scoreIndex]); - printf("Score host to network value: 0x%016llx (%lld)\n", + printf("\n[SPECTRA Sensing Module] Processing Score host to network value: 0x%016llx (%lld)\n", (long long int)htonll(scoresList[scoreIndex]), (long long int)htonll(scoresList[scoreIndex])); @@ -157,6 +157,7 @@ void *connection_handler(int fd) { } // Sends the answer + printf("\n[SPECTRA Sensing Module] Sending: Reply Message!\n"); int retError = returnSpectraPacket(returnMessage, fd, remaddr); if (retError == -1) { perror("Send failed!!!\n"); @@ -203,7 +204,7 @@ int socketBind() { perror("bind failed"); return 0; } - puts("bind done"); + puts("\n[SPECTRA Sensing Module] Initialization done"); return fd; } diff --git a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb1/mih_user/lte_test_user/enb_lte_user.cpp b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb1/mih_user/lte_test_user/enb_lte_user.cpp index 80fbfe7522b05fd8b069218bb39f42dea0d55425..8b6d45652eae745820b363cb91f3fc9bb8a317a1 100644 --- a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb1/mih_user/lte_test_user/enb_lte_user.cpp +++ b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb1/mih_user/lte_test_user/enb_lte_user.cpp @@ -1395,18 +1395,36 @@ void mih_user::receive_MIH_Link_Parameters_Report(odtone::mih::message& msg, con log_(0, "[MSC_MSG]["+getTimeStamp4Log()+"]["+ msg.source().to_string() +"][--- MIH_Link_Parameters_Report.indication --->]["+msg.destination().to_string()+"]\n"); log_(0, " - LINK_TUPLE_ID - Link identifier: ", link_id2string(link).c_str()); std::cout<<"LINK_TUPLE_ID - Link identifier: "<<link<<std::endl; - + for (odtone::mih::link_param_rpt_list::iterator i=lprl.begin(); i!=lprl.end(); i++) { log_(0, "Meausrement Type: --- 0 => RSRP ----- 1=>RSRQ ---- 2=>CQI ", i->param.type); if(odtone::mih::link_param_val *value = boost::get<odtone::mih::link_param_val>(&i->param.value)) { log_(0, "Meausrement Value: ", (short) *value ); + // ferreira: Upload of measurements to gae-spectra.com + // FIXME This will not work for: more than 3 types of measurements OR out of sequence types of measurements + std::string crmc_cmd_str; + std::stringstream crmc_ss; + std::string result; + if (count % 10 == 0) // All measures at CRM are outdated! do server cleanup! + result = exec ("./CRMClient DEL 2"); + if (count % 3 == 0) // Add 1st measurement (RSRP) + crmc_ss << "./CRMClient PUT 2 meas_no." << count << " " << msg.source().to_string() << "_" << link_id2string(link).c_str() << " RSRP dB " << (short) *value << " 3" ; + if (count % 3 == 1) // Add 2nd measurement (RSRQ) + crmc_ss << "./CRMClient PUT 2 meas_no." << count << " " << msg.source().to_string() << "_" << link_id2string(link).c_str() << " RSRQ dB " << (short) *value << " 3" ; + if (count % 3 == 2) // Add 3rd measurement (CQI) + crmc_ss << "./CRMClient PUT 2 meas_no." << count << " " << msg.source().to_string() << "_" << link_id2string(link).c_str() << " CQI - " << (short) *value << " 3" ; + crmc_cmd_str = crmc_ss.str(); + const char* crmc_cmd_cstr = crmc_cmd_str.c_str(); + char* crmc_cmd_char = new char [strlen(crmc_cmd_cstr)+1]; + strcpy(crmc_cmd_char, crmc_cmd_cstr); + result = exec (crmc_cmd_char); + delete [] crmc_cmd_char; } } log_(0, "MIH_Link_Parameters_Report.indication - End"); - - + //eNB1: Forward the message to UE 2 forward_Parameters_Report_indication(msg); diff --git a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb1/oai_conf/start_enb.bash b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb1/oai_conf/start_enb.bash index 4204ab9b7c7aa23360ddbba03f706c84f34ccb6d..23d02bd58b29dfb034bd4013d2f3592fe87aba89 100644 --- a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb1/oai_conf/start_enb.bash +++ b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb1/oai_conf/start_enb.bash @@ -68,8 +68,8 @@ source $THIS_SCRIPT_PATH/env_802dot21.bash ########################################################### bash_exec "ifconfig $EMULATION_DEV_INTERFACE up $EMULATION_DEV_ADDRESS netmask 255.255.255.0" bash_exec "ifconfig eth2 up 192.168.14.3 netmask 255.255.255.0" -#bash_exec "ip r d default dev eth0" -#bash_exec "ip r a default via 192.168.14.4 dev eth2" +bash_exec "ip r d default via 192.168.14.4 dev eth2" +bash_exec "ip r a default via 192.168.12.100 dev eth0" ########################################################### IPTABLES=/sbin/iptables THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) diff --git a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb2/mih_user/lte_test_user/enb2_lte_user.cpp b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb2/mih_user/lte_test_user/enb2_lte_user.cpp index 87179f2a7f26c309737b7e4be63c40bf94639322..319d68e2e3089a1164917f9457151d9f8969484a 100644 --- a/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb2/mih_user/lte_test_user/enb2_lte_user.cpp +++ b/targets/PROJECTS/SPECTRA/DEMO_SPECTRA/spectra_demo_src/enb2/mih_user/lte_test_user/enb2_lte_user.cpp @@ -1372,13 +1372,15 @@ void mih_user::receive_MIH_Link_Actions_confirm(odtone::mih::message& msg) // #endif // SCENARIO_2 log_(0, "MIH_Link_Actions.confirm - End\n"); + // ferreira: Added sleep time + exit + output to make visible the end of SPECTRA demo if( second_link_activated == 1 ) { unsigned int pause_time = 30; // in seconds to show the result of the demo then proceed log_(0, "\n\n\n\n\t----- Confirmed Configuration of LTE Link for TVWS -----\n"); log_(0, "\n\t----- END OF SPECTRA DEMO ! -----\n"); - log_(0, "\n\n MIH User regular function will resume in (secs) : ", pause_time ); - usleep(pause_time * 1000000); +// log_(0, "\n\n MIH User regular function will resume in (secs) : ", pause_time ); +// usleep(pause_time * 1000000); + exit(1); } } @@ -1422,20 +1424,34 @@ void mih_user::receive_MIH_MN_HO_Candidate_Query_request(odtone::mih::message& m & odtone::mih::tlv_link_identifier(link) & odtone::mih::tlv_link_param_rpt_list(lprl); - log_(0, "MIH_MN_HO_Candidate_Query.request - RECEIVED - Begin"); - log_(0, "\t- LINK CFG STATUS LIST - Length: ", lprl.size()); - log_(0, "[MSC_MSG]["+getTimeStamp4Log()+"]["+ msg.source().to_string() +"][--- MIH_Link_Parameters_Report.indication --->]["+msg.destination().to_string()+"]\n"); - log_(0, " - LINK_TUPLE_ID - Link identifier: ", link_id2string(link).c_str()); +// log_(0, "MIH_MN_HO_Candidate_Query.request - RECEIVED - Begin"); +// log_(0, "\t- LINK CFG STATUS LIST - Length: ", lprl.size()); +// log_(0, "[MSC_MSG]["+getTimeStamp4Log()+"]["+ msg.source().to_string() +"][--- MIH_Link_Parameters_Report.indication --->]["+msg.destination().to_string()+"]\n"); +// log_(0, " - LINK_TUPLE_ID - Link identifier: ", link_id2string(link).c_str()); +// +// for (odtone::mih::link_param_rpt_list::iterator i=lprl.begin(); i!=lprl.end(); i++) +// { +// log_(0, "Meausrement Type: --- 0 => RSRP ----- 1=>RSRQ ---- 2=>CQI ", i->param.type); +// if(odtone::mih::link_param_val *value = boost::get<odtone::mih::link_param_val>(&i->param.value)) +// { +// log_(0, "Meausrement Value: ", (short) *value ); +// } +// } + + + // ferreira: changed output of message for better readability! + log_(0, "\n["+getTimeStamp4Log()+"] [RX] [FROM: "+ msg.source().to_string() +"] [Link ID: "+ link_id2string(link).c_str() +"]"); + log_(0, "\t[MIH_MN_HO_Candidate_Query [MIH_Link_Parameters_Report]]"); - for (odtone::mih::link_param_rpt_list::iterator i=lprl.begin(); i!=lprl.end(); i++) + for (odtone::mih::link_param_rpt_list::iterator i=lprl.begin(); i!=lprl.end(); i++) { - log_(0, "Meausrement Type: --- 0 => RSRP ----- 1=>RSRQ ---- 2=>CQI ", i->param.type); - if(odtone::mih::link_param_val *value = boost::get<odtone::mih::link_param_val>(&i->param.value)) - { - log_(0, "Meausrement Value: ", (short) *value ); - } + if(odtone::mih::link_param_val *value = boost::get<odtone::mih::link_param_val>(&i->param.value)) + { + log_(0, "\t[Measurement Types: RSRP 0|RSRQ 1|CQI 2] [type: ", i->param.type, "| value: ", (short) *value, "]" ); + } } + //eNB2 : Action Power Up the TVWS Link after running the cognitive algorithm //First Phase: Collect the data as input fot the cognitive algorithm @@ -1461,12 +1477,13 @@ void mih_user::receive_MIH_MN_HO_Candidate_Query_request(odtone::mih::message& m // link1.type = type; // send_MIH_Link_Actions_request(link, odtone::mih::link_ac_type_power_up); +// ferreira: commented out the count printouts and changed the comparison value (originally count >= 30 ) //Send ONLY ONCE RRC_Connection_Reconfiguration request to the UE on LTE link 0 // log_(0, "COUNT: ", count ); if (second_link_activated==0) { // log_(0, "COUNT: ", count ); - if (count >= 750) + if (count >= 1500) { // log_(0, "COUNT: ", count ); send_MIH_Link_Action_Power_Up_request(_link_id_list[0]);//Link LTE @@ -1497,21 +1514,34 @@ void mih_user::receive_MIH_Link_Parameters_Report(odtone::mih::message& msg, con & odtone::mih::tlv_link_identifier(link) & odtone::mih::tlv_link_param_rpt_list(lprl); - log_(0, "MIH_Link_Parameters_Report.indication - RECEIVED - Begin"); - log_(0, "\t- LINK CFG STATUS LIST - Length: ", lprl.size()); - log_(0, "[MSC_MSG]["+getTimeStamp4Log()+"]["+ msg.source().to_string() +"][--- MIH_Link_Parameters_Report.indication --->]["+msg.destination().to_string()+"]\n"); - log_(0, " - LINK_TUPLE_ID - Link identifier: ", link_id2string(link).c_str()); - std::cout<<"LINK_TUPLE_ID - Link identifier: "<<link<<std::endl; +// log_(0, "MIH_Link_Parameters_Report.indication - RECEIVED - Begin"); +// log_(0, "\t- LINK CFG STATUS LIST - Length: ", lprl.size()); +// log_(0, "[MSC_MSG]["+getTimeStamp4Log()+"]["+ msg.source().to_string() +"][--- MIH_Link_Parameters_Report.indication --->]["+msg.destination().to_string()+"]\n"); +// log_(0, " - LINK_TUPLE_ID - Link identifier: ", link_id2string(link).c_str()); +// std::cout<<"LINK_TUPLE_ID - Link identifier: "<<link<<std::endl; +// +// for (odtone::mih::link_param_rpt_list::iterator i=lprl.begin(); i!=lprl.end(); i++) +// { +// log_(0, "Meausrement Type: --- 0 => RSRP ----- 1=>RSRQ ---- 2=>CQI ", i->param.type); +// if(odtone::mih::link_param_val *value = boost::get<odtone::mih::link_param_val>(&i->param.value)) +// { +// log_(0, "Meausrement Value: ", (short) *value ); +// } +// } +// log_(0, "MIH_Link_Parameters_Report.indication - End"); + + // ferreira: changed output of message for better readability! + log_(0, "\n["+getTimeStamp4Log()+"] [RX] [FROM: "+ msg.source().to_string() +"] [Link ID: "+ link_id2string(link).c_str() +"]"); + log_(0, "\t[MIH_Link_Parameters_Report]"); for (odtone::mih::link_param_rpt_list::iterator i=lprl.begin(); i!=lprl.end(); i++) { - log_(0, "Meausrement Type: --- 0 => RSRP ----- 1=>RSRQ ---- 2=>CQI ", i->param.type); - if(odtone::mih::link_param_val *value = boost::get<odtone::mih::link_param_val>(&i->param.value)) - { - log_(0, "Meausrement Value: ", (short) *value ); - } + if(odtone::mih::link_param_val *value = boost::get<odtone::mih::link_param_val>(&i->param.value)) + { + log_(0, "\t[Measurement Types: RSRP 0|RSRQ 1|CQI 2] [type: ", i->param.type, "| value: ", (short) *value, "]" ); + } } - log_(0, "MIH_Link_Parameters_Report.indication - End"); +// log_(0, "MIH_Link_Parameters_Report.indication - End"); //eNB1: Forward the message to UE 2 diff --git a/targets/PROJECTS/SPECTRA/start_enb.bash b/targets/PROJECTS/SPECTRA/start_enb.bash index 4204ab9b7c7aa23360ddbba03f706c84f34ccb6d..23d02bd58b29dfb034bd4013d2f3592fe87aba89 100755 --- a/targets/PROJECTS/SPECTRA/start_enb.bash +++ b/targets/PROJECTS/SPECTRA/start_enb.bash @@ -68,8 +68,8 @@ source $THIS_SCRIPT_PATH/env_802dot21.bash ########################################################### bash_exec "ifconfig $EMULATION_DEV_INTERFACE up $EMULATION_DEV_ADDRESS netmask 255.255.255.0" bash_exec "ifconfig eth2 up 192.168.14.3 netmask 255.255.255.0" -#bash_exec "ip r d default dev eth0" -#bash_exec "ip r a default via 192.168.14.4 dev eth2" +bash_exec "ip r d default via 192.168.14.4 dev eth2" +bash_exec "ip r a default via 192.168.12.100 dev eth0" ########################################################### IPTABLES=/sbin/iptables THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))