├── Documentation ├── 0_Plan │ ├── Plan.pdf │ └── Plan.pptx ├── 1_Milestone │ └── 1_Milestone.pdf ├── 2_Milestone │ ├── 2_Milestone.pptx │ └── Interference_scenarios.pdf ├── 3_Milestone │ └── 3.0_Milestone.pptx ├── 4_Report │ ├── Images │ │ ├── TU-Logo-3D-rot.pdf │ │ ├── beacon_frame.png │ │ ├── evari.png │ │ ├── floor.png │ │ ├── rssi.png │ │ ├── rssi_vendor.png │ │ ├── rssi_vendor1.png │ │ ├── tknlogo.pdf │ │ ├── tool_db.png │ │ ├── tool_des.png │ │ ├── tool_floor.png │ │ ├── tool_graph.png │ │ └── tool_jsDoc.png │ ├── RSSI.pdf │ └── RSSI.tex ├── 5_Description │ └── TU Web.gdoc └── _Templates │ ├── LaTex Template │ ├── TU-Logo-3D-rot.pdf │ ├── tknlogo.pdf │ └── tr_cover.tex │ └── TKN_slides.ppt ├── LICENSE ├── README.md └── Source ├── @doc ├── main.css └── out │ ├── api.js │ ├── assets │ ├── css │ │ ├── external-small.png │ │ ├── logo.png │ │ └── main.css │ ├── favicon.png │ ├── img │ │ └── spinner.gif │ ├── index.html │ ├── js │ │ ├── api-filter.js │ │ ├── api-list.js │ │ ├── api-search.js │ │ ├── apidocs.js │ │ └── yui-prettify.js │ └── vendor │ │ └── prettify │ │ ├── CHANGES.html │ │ ├── COPYING │ │ ├── README.html │ │ ├── prettify-min.css │ │ └── prettify-min.js │ ├── classes │ ├── collection.html │ ├── controller.html │ ├── floor.html │ ├── globals.html │ ├── graph.html │ ├── index.html │ ├── utils.html │ └── view.html │ ├── data.json │ ├── files │ ├── index.html │ ├── libs_jquery-ui.js.html │ ├── libs_jquery.js.html │ ├── libs_require.js.html │ ├── plot_lib_jquery.js.html │ ├── plot_lib_semantic.min.js.html │ ├── scripts_app.js.html │ ├── scripts_collection.js.html │ ├── scripts_controller.js.html │ ├── scripts_floor.js.html │ ├── scripts_globals.js.html │ ├── scripts_graph.js.html │ ├── scripts_utils.js.html │ └── scripts_view.js.html │ ├── index.html │ └── modules │ ├── APP.html │ └── index.html ├── README.md ├── css ├── graph.css ├── index.css └── table.css ├── data ├── data.js ├── sigGenStat_11.js ├── sigGenStat_63.js ├── sigGenStat_d9.js ├── sigGenStat_ef.js ├── smallStat_11.js ├── smallStat_63.js ├── smallStat_d9.js ├── smallStat_ef.js ├── wifiStat_11.js ├── wifiStat_63.js ├── wifiStat_d9.js └── wifiStat_ef.js ├── images ├── evarilos-logo.jpg ├── floor_ilab_1.png ├── floor_ilab_2.png ├── floor_twist_2.png ├── floor_twist_3.png ├── floor_twist_4.png ├── iLabt.jpg ├── tkn2.gif ├── twist.jpg ├── twist.png ├── x_floor_ilab.png ├── x_floor_twist_2.png ├── x_floor_twist_3.png └── x_floor_twist_4.png ├── index.html ├── libs ├── amplify.min.js ├── css │ ├── images │ │ ├── animated-overlay.gif │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_2e83ff_256x240.png │ │ ├── ui-icons_454545_256x240.png │ │ ├── ui-icons_888888_256x240.png │ │ └── ui-icons_cd0a0a_256x240.png │ └── jquery-ui.min.css ├── d3.js ├── jquery-ui.js ├── jquery.js ├── require.js └── underscore.js ├── plot ├── CREW_11 │ ├── 11_Ref_Ex_1_Mean.jpg │ ├── 11_Ref_Ex_1_Variance.jpg │ ├── 11_Ref_Ex_2_Mean.jpg │ ├── 11_Ref_Ex_2_Variance.jpg │ ├── 11_Ref_Ex_3_Mean.jpg │ ├── 11_Ref_Ex_3_Variance.jpg │ ├── 11_Ref_Ex_4_Mean.jpg │ ├── 11_Ref_Ex_4_Variance.jpg │ ├── 11_Ref_Group_Variance.jpg │ ├── 11_Sig_Ex_1_Mean.jpg │ ├── 11_Sig_Ex_1_Variance.jpg │ ├── 11_Sig_Ex_2_Mean.jpg │ ├── 11_Sig_Ex_2_Variance.jpg │ ├── 11_Sig_Group_Variance.jpg │ ├── 11_Wifi_Ex_1_Mean.jpg │ ├── 11_Wifi_Ex_1_Variance.jpg │ ├── 11_Wifi_Ex_2_Mean.jpg │ ├── 11_Wifi_Ex_2_Variance.jpg │ ├── 11_Wifi_Group_Variance.jpg │ ├── Plot_11.m │ └── RSSI_11.pdf ├── CREW_63 │ ├── 63_Ref_Ex_1_Mean.jpg │ ├── 63_Ref_Ex_1_Variance.jpg │ ├── 63_Ref_Ex_2_Mean.jpg │ ├── 63_Ref_Ex_2_Variance.jpg │ ├── 63_Ref_Ex_3_Mean.jpg │ ├── 63_Ref_Ex_3_Variance.jpg │ ├── 63_Ref_Ex_4_Mean.jpg │ ├── 63_Ref_Ex_4_Variance.jpg │ ├── 63_Ref_Group_Variance.jpg │ ├── 63_Sig_Ex_1_Mean.jpg │ ├── 63_Sig_Ex_1_Variance.jpg │ ├── 63_Sig_Ex_2_Mean.jpg │ ├── 63_Sig_Ex_2_Variance.jpg │ ├── 63_Sig_Group_Variance.jpg │ ├── 63_Wifi_Ex_1_Mean.jpg │ ├── 63_Wifi_Ex_1_Variance.jpg │ ├── 63_Wifi_Ex_2_Mean.jpg │ ├── 63_Wifi_Ex_2_Variance.jpg │ ├── 63_Wifi_Group_Variance.jpg │ ├── Plot_63.m │ └── RSSI_63.pdf ├── CREW_d9 │ ├── Plot_d9.m │ ├── RSSI_d9.pdf │ ├── d9_Ref_Ex_1_Mean.jpg │ ├── d9_Ref_Ex_1_Variance.jpg │ ├── d9_Ref_Ex_2_Mean.jpg │ ├── d9_Ref_Ex_2_Variance.jpg │ ├── d9_Ref_Ex_3_Mean.jpg │ ├── d9_Ref_Ex_3_Variance.jpg │ ├── d9_Ref_Ex_4_Mean.jpg │ ├── d9_Ref_Ex_4_Variance.jpg │ ├── d9_Ref_Group_Variance.jpg │ ├── d9_Sig_Ex_1_Mean.jpg │ ├── d9_Sig_Ex_1_Variance.jpg │ ├── d9_Sig_Ex_2_Mean.jpg │ ├── d9_Sig_Ex_2_Variance.jpg │ ├── d9_Sig_Group_Variance.jpg │ ├── d9_Wifi_Ex_1_Mean.jpg │ ├── d9_Wifi_Ex_1_Variance.jpg │ ├── d9_Wifi_Ex_2_Mean.jpg │ ├── d9_Wifi_Ex_2_Variance.jpg │ └── d9_Wifi_Group_Variance.jpg ├── CREW_ef │ ├── Plot_ef.m │ ├── RSSI_ef.pdf │ ├── ef_Ref_Ex_1_Mean.jpg │ ├── ef_Ref_Ex_1_Variance.jpg │ ├── ef_Ref_Ex_2_Mean.jpg │ ├── ef_Ref_Ex_2_Variance.jpg │ ├── ef_Ref_Ex_3_Mean.jpg │ ├── ef_Ref_Ex_3_Variance.jpg │ ├── ef_Ref_Ex_4_Mean.jpg │ ├── ef_Ref_Ex_4_Variance.jpg │ ├── ef_Ref_Group_Variance.jpg │ ├── ef_Sig_Ex_1_Mean.jpg │ ├── ef_Sig_Ex_1_Variance.jpg │ ├── ef_Sig_Ex_2_Mean.jpg │ ├── ef_Sig_Ex_2_Variance.jpg │ ├── ef_Sig_Group_Variance.jpg │ ├── ef_Wifi_Ex_1_Mean.jpg │ ├── ef_Wifi_Ex_1_Variance.jpg │ ├── ef_Wifi_Ex_2_Mean.jpg │ ├── ef_Wifi_Ex_2_Variance.jpg │ └── ef_Wifi_Group_Variance.jpg ├── Data │ ├── 11_int1.png │ ├── 11_int2.png │ ├── 11_ref1.png │ ├── 11_ref2.png │ ├── 63_int1.png │ ├── 63_int2.png │ ├── 63_ref1.png │ ├── 63_ref2.png │ ├── d9_int1.png │ ├── d9_int2.png │ ├── d9_ref1.png │ ├── d9_ref2.png │ ├── ef_int1.png │ ├── ef_int2.png │ ├── ef_ref1.png │ ├── ef_ref2.png │ └── tmp.png ├── lib │ ├── jquery.js │ ├── semantic.min.css │ └── semantic.min.js └── plot.html ├── scripts ├── app.js ├── collection.js ├── controller.js ├── floor.js ├── globals.js ├── graph.js ├── utils.js └── view.js └── utils ├── d3_graph.html ├── floor_mapper.html └── rssi_scanner_in_js ├── index.html ├── index.js ├── package.json └── server.js /Documentation/0_Plan/Plan.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/0_Plan/Plan.pdf -------------------------------------------------------------------------------- /Documentation/0_Plan/Plan.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/0_Plan/Plan.pptx -------------------------------------------------------------------------------- /Documentation/1_Milestone/1_Milestone.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/1_Milestone/1_Milestone.pdf -------------------------------------------------------------------------------- /Documentation/2_Milestone/2_Milestone.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/2_Milestone/2_Milestone.pptx -------------------------------------------------------------------------------- /Documentation/2_Milestone/Interference_scenarios.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/2_Milestone/Interference_scenarios.pdf -------------------------------------------------------------------------------- /Documentation/3_Milestone/3.0_Milestone.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/3_Milestone/3.0_Milestone.pptx -------------------------------------------------------------------------------- /Documentation/4_Report/Images/TU-Logo-3D-rot.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/TU-Logo-3D-rot.pdf -------------------------------------------------------------------------------- /Documentation/4_Report/Images/beacon_frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/beacon_frame.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/evari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/evari.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/floor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/floor.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/rssi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/rssi.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/rssi_vendor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/rssi_vendor.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/rssi_vendor1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/rssi_vendor1.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/tknlogo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/tknlogo.pdf -------------------------------------------------------------------------------- /Documentation/4_Report/Images/tool_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/tool_db.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/tool_des.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/tool_des.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/tool_floor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/tool_floor.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/tool_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/tool_graph.png -------------------------------------------------------------------------------- /Documentation/4_Report/Images/tool_jsDoc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/Images/tool_jsDoc.png -------------------------------------------------------------------------------- /Documentation/4_Report/RSSI.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/4_Report/RSSI.pdf -------------------------------------------------------------------------------- /Documentation/5_Description/TU Web.gdoc: -------------------------------------------------------------------------------- 1 | {"url": "https://docs.google.com/open?id=1r6gghYjIGJYJ2rIloOlI__Dcr7msoDaYyhq5NeTQO-Y", "doc_id": "1r6gghYjIGJYJ2rIloOlI__Dcr7msoDaYyhq5NeTQO-Y", "email": "panch.aravinth@gmail.com", "resource_id": "document:1r6gghYjIGJYJ2rIloOlI__Dcr7msoDaYyhq5NeTQO-Y"} -------------------------------------------------------------------------------- /Documentation/_Templates/LaTex Template/TU-Logo-3D-rot.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/_Templates/LaTex Template/TU-Logo-3D-rot.pdf -------------------------------------------------------------------------------- /Documentation/_Templates/LaTex Template/tknlogo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/_Templates/LaTex Template/tknlogo.pdf -------------------------------------------------------------------------------- /Documentation/_Templates/LaTex Template/tr_cover.tex: -------------------------------------------------------------------------------- 1 | \documentclass[11pt,a4paper,headinclude,footinclude,chapterprefix=on]{scrreprt} 2 | \usepackage[utf8]{inputenc} 3 | \usepackage[T1]{fontenc} 4 | \usepackage{tabularx} 5 | \usepackage{multicol} 6 | \usepackage{graphicx} 7 | 8 | \usepackage{tikz} 9 | 10 | % ================================================================ 11 | % Edit this accordingly! 12 | % ================================================================ 13 | 14 | \newcommand{\trnumber}{TKN-13-XX} 15 | \newcommand{\trdate}{Oktober 2013} 16 | \newcommand{\trauthor}{Daniel Happ, Manoj Rege} 17 | \newcommand{\tremail}{\{happ, ravindra\}@tkn.tu-berlin.de} 18 | \newcommand{\trtitle}{Social Sensor Cloud -- Use Cases and Traffic Patterns} 19 | 20 | % ================================================================ 21 | % Page Style 22 | % ================================================================ 23 | 24 | \usepackage{geometry} 25 | \geometry{a4paper, inner=30mm, outer=25mm, top=40mm, bottom=42mm} 26 | 27 | \usepackage[headsepline,plainheadsepline,footsepline,plainfootsepline]{scrpage2} 28 | \clearscrheadfoot 29 | 30 | \ihead[\Large {\scshape TU Berlin }]{\Large {\scshape TU Berlin }} 31 | 32 | \ifoot[{\tiny \begin{minipage}{4.0cm}Copyright at Technical University Berlin.\newline All Rights reserved.\end{minipage}}]{{\tiny \begin{minipage}{4.0cm}Copyright at Technical University Berlin.\newline All Rights reserved.\end{minipage}}} 33 | \cfoot[\scriptsize \trnumber]{\scriptsize \trnumber} 34 | \ofoot[Page \pagemark]{Page \pagemark} 35 | 36 | \pagestyle{scrheadings} 37 | 38 | \usepackage{mathptmx} 39 | \usepackage[scaled=.92]{helvet} 40 | \usepackage{courier} 41 | 42 | \addtokomafont{pagefoot}{\normalfont} 43 | 44 | % ================================================================ 45 | \begin{document} 46 | 47 | \bibliographystyle{plain} 48 | 49 | % ================================================================ 50 | % Cover Sheet 51 | % ================================================================ 52 | { 53 | \sffamily 54 | 55 | \thispagestyle{empty} 56 | 57 | \begin{tabularx}{\columnwidth}{cXc} 58 | \includegraphics[height=1cm]{TU-Logo-3D-rot.pdf} 59 | & & 60 | \includegraphics[height=1cm]{tknlogo.pdf} 61 | \\ 62 | \end{tabularx} 63 | 64 | 65 | \vspace{1.0cm} 66 | 67 | \begin{center} 68 | {\huge 69 | \noindent 70 | Technical University Berlin 71 | 72 | \vspace{0.5cm} 73 | 74 | \noindent 75 | Telecommunication Networks Group 76 | 77 | \begin{center} 78 | \rule{15.5cm}{0.4pt} 79 | \end{center} 80 | } 81 | \end{center} 82 | 83 | \begin{minipage}[][11.0cm][c]{14.5cm} 84 | {\Huge 85 | 86 | \begin{center} 87 | \trtitle 88 | \end{center} 89 | 90 | \begin{center} 91 | \trauthor \\ 92 | {\Large \tremail} 93 | \end{center} 94 | 95 | 96 | \begin{center} 97 | Berlin, \trdate 98 | \end{center} 99 | 100 | 101 | \vspace{0.5cm} 102 | 103 | } 104 | 105 | 106 | \begin{center} 107 | \setlength{\fboxrule}{2pt}\setlength{\fboxsep}{2mm} 108 | \fbox{TKN Technical Report \trnumber} 109 | \end{center} 110 | 111 | \end{minipage} 112 | 113 | \setlength{\fboxrule}{0.4pt} 114 | \setlength{\fboxsep}{0.4pt} 115 | 116 | \begin{center} 117 | 118 | \rule{15.5cm}{0.4pt} 119 | 120 | \vspace{0.5cm} 121 | 122 | {\huge {TKN Technical Reports Series}} 123 | 124 | \vspace{0.5cm} 125 | 126 | {\huge Editor: Prof. Dr.-Ing. Adam Wolisz} 127 | 128 | \vspace{0.5cm} 129 | 130 | \end{center} 131 | 132 | 133 | } 134 | 135 | \begin{abstract} 136 | \subsection*{\abstractname} 137 | Abstract goes here. 138 | \end{abstract} 139 | 140 | \tableofcontents 141 | 142 | % ================================================================ 143 | % Begin here 144 | % ================================================================ 145 | 146 | \chapter{Introduction} 147 | \chapter{Related Work} 148 | \chapter{SSC Overview} 149 | \chapter{SSC Usecases} 150 | 151 | \begin{figure}[hb] 152 | \centering 153 | 154 | \begin{tikzpicture} 155 | \node (is-root) {sensor traffic patterns} [sibling distance=3cm] 156 | child { node {on demand} } 157 | child { 158 | node {event-based} [sibling distance=3cm] 159 | child { node {periodic} } 160 | child { node {aperiodic} } 161 | }; 162 | \end{tikzpicture} 163 | 164 | \caption{Characterization of different sensor traffic patterns.} 165 | \end{figure} 166 | 167 | \chapter{SSC Traffic Patterns} 168 | \chapter{Future Work} 169 | \chapter{Conclusion} 170 | 171 | \pagebreak 172 | 173 | %\bibliography{} 174 | 175 | 176 | 177 | \end{document} 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | -------------------------------------------------------------------------------- /Documentation/_Templates/TKN_slides.ppt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Documentation/_Templates/TKN_slides.ppt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | RSSI based Indoor localization and Raw Ranging Data Visualization 2 | ================================================================== 3 | 4 | DESCRIPTION 5 | -------------------------------------- 6 | This tool is implemented to visualize raw data that are received from experiments and stored in EVARILOS Database. It is a standalone tool that can be viewed in Internet Browser. 7 | 8 | EXPERIMENT 9 | -------------------------------------- 10 | WiFi Beacon packets are transmitted periodically to announce the presence of WiFi. Beacon Packet RSSI is Received Signal Strength Indicator which indicates the power of signal that is received at the receiver. RSSI is used by networking interface card to determine the energy level in the channel. However, RSSI values are extensively used for ranging and localization purpose where accuracy and reliability should be guaranteed. However, previous studies predict that RSSI values changes due to change in distance and various interferences. In oder to analyze whether there is a variation in RSSI values due to different type of interferences, we have designed a reference scenario and two interference scenarios. Experiments were conducted and repeated. It yielded large set of data. In oder to process and analyze the raw data, a visualization tool was implemented. Processed data was analyzed and statistical results were plotted. 11 | 12 | ![Experiment](https://raw.githubusercontent.com/AravinthPanch/rssi/master/Documentation/4_Report/Images/evari.png "Experiment") 13 | 14 | AUTHOR 15 | -------------------------------------- 16 | Aravinth Panchadcharam 17 | 18 | ACKNOWLEDGEMENTS 19 | -------------------------------------- 20 | - Filip Lemić : PhD Candiate of Telecommunication Networks faculty at Technical University of Berlin 21 | - Dr. Arash Behboodi : Telecommunication Networks faculty at Technical University of Berlin 22 | 23 | INSTALLATION 24 | -------------------------------------- 25 | This tools does not have to be installed. Internet Browser that supports HTML5 is needed to run this tool. 26 | 27 | USAGE 28 | -------------------------------------- 29 | - index.html - starts the tool 30 | - @doc/out/index.html - shows the Javascript Doc of the tool 31 | - utils/floor_mapper.html - used to calculate properties of FloorPlan 32 | - utils/rssi_scanner_in_js - nodejs tool to scan rssi in wifi spectrum using Mac Airpot NIC in Mac OSX 33 | 34 | ![DB](https://raw.githubusercontent.com/AravinthPanch/rssi/master/Documentation/4_Report/Images/tool_db.png "DB") 35 | 36 | ![Floor](https://raw.githubusercontent.com/AravinthPanch/rssi/master/Documentation/4_Report/Images/tool_floor.png "Floor") 37 | 38 | ![Graph](https://raw.githubusercontent.com/AravinthPanch/rssi/master/Documentation/4_Report/Images/tool_graph.png "Graph") 39 | 40 | TESTED ON 41 | -------------------------------------- 42 | - Google Chrome 43 | - Mozilla Firefox 44 | - Microsoft Internet Explorer 45 | 46 | CONTACT 47 | -------------------------------------- 48 | If you have problems or querries, please contact 49 | - Aravinth Panchadcharam 50 | - Filip Lemić - 51 | 52 | COPYING / LICENSE 53 | -------------------------------------- 54 | - EVARILOS 55 | - TKN - TU Berlin 56 | -------------------------------------------------------------------------------- /Source/@doc/out/api.js: -------------------------------------------------------------------------------- 1 | YUI.add("yuidoc-meta", function(Y) { 2 | Y.YUIDoc = { meta: { 3 | "classes": [ 4 | "collection", 5 | "controller", 6 | "floor", 7 | "globals", 8 | "graph", 9 | "utils", 10 | "view" 11 | ], 12 | "modules": [ 13 | "APP" 14 | ], 15 | "allModules": [ 16 | { 17 | "displayName": "APP", 18 | "name": "APP", 19 | "description": "Raw Ranging Data Visualization Tool
\nAuthor: Aravinth, S. Panchadcharam
\nDate: 20 November 2013
\nEmail: me@aravinth.info
\nRevised: 08 January 2015
" 20 | } 21 | ] 22 | } }; 23 | }); -------------------------------------------------------------------------------- /Source/@doc/out/assets/css/external-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/@doc/out/assets/css/external-small.png -------------------------------------------------------------------------------- /Source/@doc/out/assets/css/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/@doc/out/assets/css/logo.png -------------------------------------------------------------------------------- /Source/@doc/out/assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/@doc/out/assets/favicon.png -------------------------------------------------------------------------------- /Source/@doc/out/assets/img/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/@doc/out/assets/img/spinner.gif -------------------------------------------------------------------------------- /Source/@doc/out/assets/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Redirector 5 | 6 | 7 | 8 | Click here to redirect 9 | 10 | 11 | -------------------------------------------------------------------------------- /Source/@doc/out/assets/js/api-filter.js: -------------------------------------------------------------------------------- 1 | YUI.add('api-filter', function (Y) { 2 | 3 | Y.APIFilter = Y.Base.create('apiFilter', Y.Base, [Y.AutoCompleteBase], { 4 | // -- Initializer ---------------------------------------------------------- 5 | initializer: function () { 6 | this._bindUIACBase(); 7 | this._syncUIACBase(); 8 | }, 9 | getDisplayName: function(name) { 10 | 11 | Y.each(Y.YUIDoc.meta.allModules, function(i) { 12 | if (i.name === name && i.displayName) { 13 | name = i.displayName; 14 | } 15 | }); 16 | 17 | return name; 18 | } 19 | 20 | }, { 21 | // -- Attributes ----------------------------------------------------------- 22 | ATTRS: { 23 | resultHighlighter: { 24 | value: 'phraseMatch' 25 | }, 26 | 27 | // May be set to "classes" or "modules". 28 | queryType: { 29 | value: 'classes' 30 | }, 31 | 32 | source: { 33 | valueFn: function() { 34 | var self = this; 35 | return function(q) { 36 | var data = Y.YUIDoc.meta[self.get('queryType')], 37 | out = []; 38 | Y.each(data, function(v) { 39 | if (v.toLowerCase().indexOf(q.toLowerCase()) > -1) { 40 | out.push(v); 41 | } 42 | }); 43 | return out; 44 | }; 45 | } 46 | } 47 | } 48 | }); 49 | 50 | }, '3.4.0', {requires: [ 51 | 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources' 52 | ]}); 53 | -------------------------------------------------------------------------------- /Source/@doc/out/assets/js/api-list.js: -------------------------------------------------------------------------------- 1 | YUI.add('api-list', function (Y) { 2 | 3 | var Lang = Y.Lang, 4 | YArray = Y.Array, 5 | 6 | APIList = Y.namespace('APIList'), 7 | 8 | classesNode = Y.one('#api-classes'), 9 | inputNode = Y.one('#api-filter'), 10 | modulesNode = Y.one('#api-modules'), 11 | tabviewNode = Y.one('#api-tabview'), 12 | 13 | tabs = APIList.tabs = {}, 14 | 15 | filter = APIList.filter = new Y.APIFilter({ 16 | inputNode : inputNode, 17 | maxResults: 1000, 18 | 19 | on: { 20 | results: onFilterResults 21 | } 22 | }), 23 | 24 | search = APIList.search = new Y.APISearch({ 25 | inputNode : inputNode, 26 | maxResults: 100, 27 | 28 | on: { 29 | clear : onSearchClear, 30 | results: onSearchResults 31 | } 32 | }), 33 | 34 | tabview = APIList.tabview = new Y.TabView({ 35 | srcNode : tabviewNode, 36 | panelNode: '#api-tabview-panel', 37 | render : true, 38 | 39 | on: { 40 | selectionChange: onTabSelectionChange 41 | } 42 | }), 43 | 44 | focusManager = APIList.focusManager = tabviewNode.plug(Y.Plugin.NodeFocusManager, { 45 | circular : true, 46 | descendants: '#api-filter, .yui3-tab-panel-selected .api-list-item a, .yui3-tab-panel-selected .result a', 47 | keys : {next: 'down:40', previous: 'down:38'} 48 | }).focusManager, 49 | 50 | LIST_ITEM_TEMPLATE = 51 | '
  • ' + 52 | '{displayName}' + 53 | '
  • '; 54 | 55 | // -- Init --------------------------------------------------------------------- 56 | 57 | // Duckpunch FocusManager's key event handling to prevent it from handling key 58 | // events when a modifier is pressed. 59 | Y.before(function (e, activeDescendant) { 60 | if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { 61 | return new Y.Do.Prevent(); 62 | } 63 | }, focusManager, '_focusPrevious', focusManager); 64 | 65 | Y.before(function (e, activeDescendant) { 66 | if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { 67 | return new Y.Do.Prevent(); 68 | } 69 | }, focusManager, '_focusNext', focusManager); 70 | 71 | // Create a mapping of tabs in the tabview so we can refer to them easily later. 72 | tabview.each(function (tab, index) { 73 | var name = tab.get('label').toLowerCase(); 74 | 75 | tabs[name] = { 76 | index: index, 77 | name : name, 78 | tab : tab 79 | }; 80 | }); 81 | 82 | // Switch tabs on Ctrl/Cmd-Left/Right arrows. 83 | tabviewNode.on('key', onTabSwitchKey, 'down:37,39'); 84 | 85 | // Focus the filter input when the `/` key is pressed. 86 | Y.one(Y.config.doc).on('key', onSearchKey, 'down:83'); 87 | 88 | // Keep the Focus Manager up to date. 89 | inputNode.on('focus', function () { 90 | focusManager.set('activeDescendant', inputNode); 91 | }); 92 | 93 | // Update all tabview links to resolved URLs. 94 | tabview.get('panelNode').all('a').each(function (link) { 95 | link.setAttribute('href', link.get('href')); 96 | }); 97 | 98 | // -- Private Functions -------------------------------------------------------- 99 | function getFilterResultNode() { 100 | return filter.get('queryType') === 'classes' ? classesNode : modulesNode; 101 | } 102 | 103 | // -- Event Handlers ----------------------------------------------------------- 104 | function onFilterResults(e) { 105 | var frag = Y.one(Y.config.doc.createDocumentFragment()), 106 | resultNode = getFilterResultNode(), 107 | typePlural = filter.get('queryType'), 108 | typeSingular = typePlural === 'classes' ? 'class' : 'module'; 109 | 110 | if (e.results.length) { 111 | YArray.each(e.results, function (result) { 112 | frag.append(Lang.sub(LIST_ITEM_TEMPLATE, { 113 | rootPath : APIList.rootPath, 114 | displayName : filter.getDisplayName(result.highlighted), 115 | name : result.text, 116 | typePlural : typePlural, 117 | typeSingular: typeSingular 118 | })); 119 | }); 120 | } else { 121 | frag.append( 122 | '
  • ' + 123 | 'No ' + typePlural + ' found.' + 124 | '
  • ' 125 | ); 126 | } 127 | 128 | resultNode.empty(true); 129 | resultNode.append(frag); 130 | 131 | focusManager.refresh(); 132 | } 133 | 134 | function onSearchClear(e) { 135 | 136 | focusManager.refresh(); 137 | } 138 | 139 | function onSearchKey(e) { 140 | var target = e.target; 141 | 142 | if (target.test('input,select,textarea') 143 | || target.get('isContentEditable')) { 144 | return; 145 | } 146 | 147 | e.preventDefault(); 148 | 149 | inputNode.focus(); 150 | focusManager.refresh(); 151 | } 152 | 153 | function onSearchResults(e) { 154 | var frag = Y.one(Y.config.doc.createDocumentFragment()); 155 | 156 | if (e.results.length) { 157 | YArray.each(e.results, function (result) { 158 | frag.append(result.display); 159 | }); 160 | } else { 161 | frag.append( 162 | '
  • ' + 163 | 'No results found. Maybe you\'ll have better luck with a ' + 164 | 'different query?' + 165 | '
  • ' 166 | ); 167 | } 168 | 169 | 170 | focusManager.refresh(); 171 | } 172 | 173 | function onTabSelectionChange(e) { 174 | var tab = e.newVal, 175 | name = tab.get('label').toLowerCase(); 176 | 177 | tabs.selected = { 178 | index: tab.get('index'), 179 | name : name, 180 | tab : tab 181 | }; 182 | 183 | switch (name) { 184 | case 'classes': // fallthru 185 | case 'modules': 186 | filter.setAttrs({ 187 | minQueryLength: 0, 188 | queryType : name 189 | }); 190 | 191 | search.set('minQueryLength', -1); 192 | 193 | // Only send a request if this isn't the initially-selected tab. 194 | if (e.prevVal) { 195 | filter.sendRequest(filter.get('value')); 196 | } 197 | break; 198 | 199 | case 'everything': 200 | filter.set('minQueryLength', -1); 201 | search.set('minQueryLength', 1); 202 | 203 | if (search.get('value')) { 204 | search.sendRequest(search.get('value')); 205 | } else { 206 | inputNode.focus(); 207 | } 208 | break; 209 | 210 | default: 211 | // WTF? We shouldn't be here! 212 | filter.set('minQueryLength', -1); 213 | search.set('minQueryLength', -1); 214 | } 215 | 216 | if (focusManager) { 217 | setTimeout(function () { 218 | focusManager.refresh(); 219 | }, 1); 220 | } 221 | } 222 | 223 | function onTabSwitchKey(e) { 224 | var currentTabIndex = tabs.selected.index; 225 | 226 | if (!(e.ctrlKey || e.metaKey)) { 227 | return; 228 | } 229 | 230 | e.preventDefault(); 231 | 232 | switch (e.keyCode) { 233 | case 37: // left arrow 234 | if (currentTabIndex > 0) { 235 | tabview.selectChild(currentTabIndex - 1); 236 | inputNode.focus(); 237 | } 238 | break; 239 | 240 | case 39: // right arrow 241 | if (currentTabIndex < (Y.Object.size(tabs) - 2)) { 242 | tabview.selectChild(currentTabIndex + 1); 243 | inputNode.focus(); 244 | } 245 | break; 246 | } 247 | } 248 | 249 | }, '3.4.0', {requires: [ 250 | 'api-filter', 'api-search', 'event-key', 'node-focusmanager', 'tabview' 251 | ]}); 252 | -------------------------------------------------------------------------------- /Source/@doc/out/assets/js/api-search.js: -------------------------------------------------------------------------------- 1 | YUI.add('api-search', function (Y) { 2 | 3 | var Lang = Y.Lang, 4 | Node = Y.Node, 5 | YArray = Y.Array; 6 | 7 | Y.APISearch = Y.Base.create('apiSearch', Y.Base, [Y.AutoCompleteBase], { 8 | // -- Public Properties ---------------------------------------------------- 9 | RESULT_TEMPLATE: 10 | '
  • ' + 11 | '' + 12 | '

    {name}

    ' + 13 | '{resultType}' + 14 | '
    {description}
    ' + 15 | '{class}' + 16 | '
    ' + 17 | '
  • ', 18 | 19 | // -- Initializer ---------------------------------------------------------- 20 | initializer: function () { 21 | this._bindUIACBase(); 22 | this._syncUIACBase(); 23 | }, 24 | 25 | // -- Protected Methods ---------------------------------------------------- 26 | _apiResultFilter: function (query, results) { 27 | // Filter components out of the results. 28 | return YArray.filter(results, function (result) { 29 | return result.raw.resultType === 'component' ? false : result; 30 | }); 31 | }, 32 | 33 | _apiResultFormatter: function (query, results) { 34 | return YArray.map(results, function (result) { 35 | var raw = Y.merge(result.raw), // create a copy 36 | desc = raw.description || ''; 37 | 38 | // Convert description to text and truncate it if necessary. 39 | desc = Node.create('
    ' + desc + '
    ').get('text'); 40 | 41 | if (desc.length > 65) { 42 | desc = Y.Escape.html(desc.substr(0, 65)) + ' …'; 43 | } else { 44 | desc = Y.Escape.html(desc); 45 | } 46 | 47 | raw['class'] || (raw['class'] = ''); 48 | raw.description = desc; 49 | 50 | // Use the highlighted result name. 51 | raw.name = result.highlighted; 52 | 53 | return Lang.sub(this.RESULT_TEMPLATE, raw); 54 | }, this); 55 | }, 56 | 57 | _apiTextLocator: function (result) { 58 | return result.displayName || result.name; 59 | } 60 | }, { 61 | // -- Attributes ----------------------------------------------------------- 62 | ATTRS: { 63 | resultFormatter: { 64 | valueFn: function () { 65 | return this._apiResultFormatter; 66 | } 67 | }, 68 | 69 | resultFilters: { 70 | valueFn: function () { 71 | return this._apiResultFilter; 72 | } 73 | }, 74 | 75 | resultHighlighter: { 76 | value: 'phraseMatch' 77 | }, 78 | 79 | resultListLocator: { 80 | value: 'data.results' 81 | }, 82 | 83 | resultTextLocator: { 84 | valueFn: function () { 85 | return this._apiTextLocator; 86 | } 87 | }, 88 | 89 | source: { 90 | value: '/api/v1/search?q={query}&count={maxResults}' 91 | } 92 | } 93 | }); 94 | 95 | }, '3.4.0', {requires: [ 96 | 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources', 97 | 'escape' 98 | ]}); 99 | -------------------------------------------------------------------------------- /Source/@doc/out/assets/js/yui-prettify.js: -------------------------------------------------------------------------------- 1 | YUI().use('node', function(Y) { 2 | var code = Y.all('.prettyprint.linenums'); 3 | if (code.size()) { 4 | code.each(function(c) { 5 | var lis = c.all('ol li'), 6 | l = 1; 7 | lis.each(function(n) { 8 | n.prepend(''); 9 | l++; 10 | }); 11 | }); 12 | var h = location.hash; 13 | location.hash = ''; 14 | h = h.replace('LINE_', 'LINENUM_'); 15 | location.hash = h; 16 | } 17 | }); 18 | -------------------------------------------------------------------------------- /Source/@doc/out/assets/vendor/prettify/CHANGES.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Change Log 5 | 6 | 7 | README 8 | 9 |

    Known Issues

    10 | 22 | 23 |

    Change Log

    24 |

    29 March 2007

    25 | 56 |

    4 Jul 2008

    57 | 63 |

    5 Jul 2008

    64 | 67 |

    14 Jul 2008

    68 | 76 |

    6 Jan 2009

    77 | 93 |

    21 May 2009

    94 | 101 |

    14 August 2009

    102 | 105 |

    3 October 2009

    106 | 109 |

    19 July 2010

    110 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /Source/@doc/out/assets/vendor/prettify/README.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | Javascript code prettifier 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | Languages : CH 20 |

    Javascript code prettifier

    21 | 22 |

    Setup

    23 |
      24 |
    1. Download a distribution 25 |
    2. Include the script and stylesheets in your document 26 | (you will need to make sure the css and js file are on your server, and 27 | adjust the paths in the script and link tag) 28 |
       29 | <link href="prettify.css" type="text/css" rel="stylesheet" />
       30 | <script type="text/javascript" src="prettify.js"></script>
      31 |
    3. Add onload="prettyPrint()" to your 32 | document's body tag. 33 |
    4. Modify the stylesheet to get the coloring you prefer
    5. 34 |
    35 | 36 |

    Usage

    37 |

    Put code snippets in 38 | <pre class="prettyprint">...</pre> 39 | or <code class="prettyprint">...</code> 40 | and it will automatically be pretty printed. 41 | 42 | 43 | 44 | 47 |
    The original 45 | Prettier 46 |
    class Voila {
     49 | public:
     50 |   // Voila
     51 |   static const string VOILA = "Voila";
     52 | 
     53 |   // will not interfere with embedded tags.
     54 | }
    55 | 56 |
    class Voila {
     57 | public:
     58 |   // Voila
     59 |   static const string VOILA = "Voila";
     60 | 
     61 |   // will not interfere with embedded tags.
     62 | }
    63 |
    64 | 65 |

    FAQ

    66 |

    Which languages does it work for?

    67 |

    The comments in prettify.js are authoritative but the lexer 68 | should work on a number of languages including C and friends, 69 | Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles. 70 | It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl 71 | and Ruby, but, because of commenting conventions, doesn't work on 72 | Smalltalk, or CAML-like languages.

    73 | 74 |

    LISPy languages are supported via an extension: 75 | lang-lisp.js.

    77 |

    And similarly for 78 | CSS, 80 | Haskell, 82 | Lua, 84 | OCAML, SML, F#, 86 | Visual Basic, 88 | SQL, 90 | Protocol Buffers, and 92 | WikiText.. 94 | 95 |

    If you'd like to add an extension for your favorite language, please 96 | look at src/lang-lisp.js and file an 97 | issue including your language extension, and a testcase.

    99 | 100 |

    How do I specify which language my code is in?

    101 |

    You don't need to specify the language since prettyprint() 102 | will guess. You can specify a language by specifying the language extension 103 | along with the prettyprint class like so:

    104 |
    <pre class="prettyprint lang-html">
    106 |   The lang-* class specifies the language file extensions.
    107 |   File extensions supported by default include
    108 |     "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
    109 |     "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
    110 |     "xhtml", "xml", "xsl".
    111 | </pre>
    112 | 113 |

    It doesn't work on <obfuscated code sample>?

    114 |

    Yes. Prettifying obfuscated code is like putting lipstick on a pig 115 | — i.e. outside the scope of this tool.

    116 | 117 |

    Which browsers does it work with?

    118 |

    It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4. 119 | Look at the test page to see if it 120 | works in your browser.

    121 | 122 |

    What's changed?

    123 |

    See the change log

    124 | 125 |

    Why doesn't Prettyprinting of strings work on WordPress?

    126 |

    Apparently wordpress does "smart quoting" which changes close quotes. 127 | This causes end quotes to not match up with open quotes. 128 |

    This breaks prettifying as well as copying and pasting of code samples. 129 | See 130 | WordPress's help center for info on how to stop smart quoting of code 132 | snippets.

    133 | 134 |

    How do I put line numbers in my code?

    135 |

    You can use the linenums class to turn on line 136 | numbering. If your code doesn't start at line number 1, you can 137 | add a colon and a line number to the end of that class as in 138 | linenums:52. 139 | 140 |

    For example 141 |

    <pre class="prettyprint linenums:4"
    142 | >// This is line 4.
    143 | foo();
    144 | bar();
    145 | baz();
    146 | boo();
    147 | far();
    148 | faz();
    149 | <pre>
    150 | produces 151 |
    // This is line 4.
    153 | foo();
    154 | bar();
    155 | baz();
    156 | boo();
    157 | far();
    158 | faz();
    159 | 
    160 | 161 |

    How do I prevent a portion of markup from being marked as code?

    162 |

    You can use the nocode class to identify a span of markup 163 | that is not code. 164 |

    <pre class=prettyprint>
    165 | int x = foo();  /* This is a comment  <span class="nocode">This is not code</span>
    166 |   Continuation of comment */
    167 | int y = bar();
    168 | </pre>
    169 | produces 170 |
    171 | int x = foo();  /* This is a comment  This is not code
    172 |   Continuation of comment */
    173 | int y = bar();
    174 | 
    175 | 176 |

    For a more complete example see the issue22 177 | testcase.

    178 | 179 |

    I get an error message "a is not a function" or "opt_whenDone is not a function"

    180 |

    If you are calling prettyPrint via an event handler, wrap it in a function. 181 | Instead of doing 182 |

    183 | addEventListener('load', prettyPrint, false); 185 |
    186 | wrap it in a closure like 187 |
    188 | addEventListener('load', function (event) { prettyPrint() }, false); 190 |
    191 | so that the browser does not pass an event object to prettyPrint which 192 | will confuse it. 193 | 194 |


    195 | 196 | 202 | 203 | 204 | -------------------------------------------------------------------------------- /Source/@doc/out/assets/vendor/prettify/prettify-min.css: -------------------------------------------------------------------------------- 1 | .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} -------------------------------------------------------------------------------- /Source/@doc/out/classes/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Redirector 5 | 6 | 7 | 8 | Click here to redirect 9 | 10 | 11 | -------------------------------------------------------------------------------- /Source/@doc/out/files/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Redirector 5 | 6 | 7 | 8 | Click here to redirect 9 | 10 | 11 | -------------------------------------------------------------------------------- /Source/@doc/out/files/scripts_app.js.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | scripts/app.js 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
    15 |
    16 |
    17 |

    18 |
    19 |
    20 | API Docs for: 21 |
    22 |
    23 |
    24 | 25 |
    26 | 57 |
    58 |
    59 |
    60 | Show: 61 | 65 | 66 | 70 | 71 | 75 | 79 | 80 |
    81 | 82 |
    83 |
    84 |
    85 |

    File: scripts/app.js

    86 | 87 |
    88 |
     89 |                         /**
     90 |                          * Raw Ranging Data Visualization Tool <br />
     91 |                          * Author: Aravinth, S. Panchadcharam <br />
     92 |                          * Date: 20 November 2013 <br />
     93 |                          * Email: me@aravinth.info <br />
     94 |                          * Revised: 08 January 2015 <br />
     95 |                         
     96 |                          @module APP
     97 |                          */
     98 |                         
     99 |                         /**
    100 |                          * APP is started after DOM is READY.
    101 |                          *
    102 |                          */
    103 |                         $(function () {
    104 |                             app.view.initialize();
    105 |                             app.controller.initialize();
    106 |                         });
    107 |                         
    108 |                         
    109 |                             
    110 |
    111 |
    112 |
    113 |
    114 |
    115 |
    116 |
    117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /Source/@doc/out/files/scripts_utils.js.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | scripts/utils.js 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
    15 |
    16 |
    17 |

    18 |
    19 |
    20 | API Docs for: 21 |
    22 |
    23 |
    24 | 25 |
    26 | 57 |
    58 |
    59 |
    60 | Show: 61 | 65 | 66 | 70 | 71 | 75 | 79 | 80 |
    81 | 82 |
    83 |
    84 |
    85 |

    File: scripts/utils.js

    86 | 87 |
    88 |
     89 |                         /**
     90 |                          * Util contains functions of Javascript functions which are used in APP.
     91 |                          * There are also other standalone utilities have been used which can be found under /utils/*.html
     92 |                          *
     93 |                          * @class utils
     94 |                          */
     95 |                         app.utils = {
     96 |                             /**
     97 |                              It calculates statistics such as mean, variance, deviation of RSSI
     98 |                              @method statisticsCalculator
     99 |                              @param {Array} data An Array of RSSI values
    100 |                              @return {Number, Array} Statistics
    101 |                              **/
    102 |                             statisticsCalculator: function (a) {
    103 |                                 var r = {mean: 0, variance: 0, deviation: 0}, t = a.length;
    104 |                                 if(a.length == 0){
    105 |                                     r.deviation = 'No Data'
    106 |                                     r.variance = 'No Data'
    107 |                                     r.deviation = 'No Data'
    108 |                                     return r.deviation,r;
    109 |                                 }else{
    110 |                                     for (var m, s = 0, l = t; l--; s += a[l]);
    111 |                                     for (m = r.mean = s / t, l = t, s = 0; l--; s += Math.pow(a[l] - m, 2));
    112 |                                     return r.deviation = Math.sqrt(r.variance = s / t), r;
    113 |                                 }
    114 |                             },
    115 |                         
    116 |                             dumpPlotData: function (data) {
    117 |                                 app.plotData.experiment = '';
    118 |                                 app.plotData.x_axis = [];
    119 |                                 app.plotData.y_axis = [];
    120 |                                 app.plotData.mean = [];
    121 |                                 app.plotData.variance = [];
    122 |                                 app.plotData.rssi = [];
    123 |                                 app.plotData.repeat = [];
    124 |                         
    125 |                                 $.each(data, function (key, val) {
    126 |                                     app.plotData.experiment = app.selectedCollection.name.replace(/_/g, ' ')
    127 |                                     app.plotData.x_axis.push(val.receiver_location.coordinate_x)
    128 |                                     app.plotData.y_axis.push(val.receiver_location.coordinate_y)
    129 |                         
    130 |                                     var rawRSSI = [];
    131 |                                     $.each(val.raw_measurement, function (key, val) {
    132 |                                         if (val.sender_bssid == "64:70:02:3e:9f:63" && val.sender_id == "CREW") {
    133 |                                             rawRSSI.push(val.rssi)
    134 |                                         }
    135 |                         //                if (val.sender_bssid == "64:70:02:3e:aa:11" && val.sender_ssid == "CREW") {
    136 |                         //                    rawRSSI.push(val.rssi)
    137 |                         //                }
    138 |                         //                if (val.sender_bssid == "64:70:02:3e:aa:d9" && val.sender_ssid == "CREW") {
    139 |                         //                    rawRSSI.push(val.rssi)
    140 |                         //                }
    141 |                         //                if (val.sender_bssid == "64:70:02:3e:aa:ef" && val.sender_ssid == "CREW") {
    142 |                         //                    rawRSSI.push(val.rssi)
    143 |                         //                }
    144 |                                     });
    145 |                                     app.plotData.rssi.push(rawRSSI)
    146 |                         
    147 |                                     var stat = app.utils.statisticsCalculator(rawRSSI);
    148 |                                     app.plotData.mean.push(d3.round(stat.mean, 2))
    149 |                                     app.plotData.variance.push(d3.round(stat.variance, 2))
    150 |                         
    151 |                                     var mean = d3.round(stat.mean, 2)
    152 |                                     var variance = d3.round(stat.variance, 2)
    153 |                         
    154 |                                     app.plotData.repeat.push({
    155 |                                         'x': val.receiver_location.coordinate_x,
    156 |                                         'y': val.receiver_location.coordinate_y,
    157 |                                         'room': val.receiver_location.room_label,
    158 |                                         'rssi': rawRSSI,
    159 |                                         'mean': mean,
    160 |                                         'variance': variance
    161 |                                     })
    162 |                         
    163 |                                     app.plotData.repeat = _.sortBy(app.plotData.repeat, function (data) {
    164 |                                         return data.x;
    165 |                                     });
    166 |                         
    167 |                         
    168 |                                     app.eventBus.publish("plot:data:retrieved")
    169 |                                 });
    170 |                         
    171 |                         
    172 |                             }
    173 |                         }
    174 |                         
    175 |                         
    176 |                             
    177 |
    178 |
    179 |
    180 |
    181 |
    182 |
    183 |
    184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | -------------------------------------------------------------------------------- /Source/@doc/out/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
    15 |
    16 |
    17 |

    18 |
    19 |
    20 | API Docs for: 21 |
    22 |
    23 |
    24 | 25 |
    26 | 57 |
    58 |
    59 |
    60 | Show: 61 | 65 | 66 | 70 | 71 | 75 | 79 | 80 |
    81 | 82 |
    83 |
    84 |
    85 |
    86 |
    87 |

    88 | Browse to a module or class using the sidebar to view its API documentation. 89 |

    90 | 91 |

    Keyboard Shortcuts

    92 | 93 |
      94 |
    • Press s to focus the API search box.

    • 95 | 96 |
    • Use Up and Down to select classes, modules, and search results.

    • 97 | 98 |
    • With the API search box or sidebar focused, use -Left or -Right to switch sidebar tabs.

    • 99 | 100 |
    • With the API search box or sidebar focused, use Ctrl+Left and Ctrl+Right to switch sidebar tabs.

    • 101 |
    102 |
    103 |
    104 | 105 | 106 |
    107 |
    108 |
    109 |
    110 |
    111 |
    112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /Source/@doc/out/modules/APP.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | APP 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
    15 |
    16 |
    17 |

    18 |
    19 |
    20 | API Docs for: 21 |
    22 |
    23 |
    24 | 25 |
    26 | 57 |
    58 |
    59 |
    60 | Show: 61 | 65 | 66 | 70 | 71 | 75 | 79 | 80 |
    81 | 82 |
    83 |
    84 |
    85 |

    APP Module

    86 |
    87 | 88 | 89 |
    90 | Defined in: scripts/view.js:1 91 |
    92 | 93 |
    94 | 95 | 96 |
    97 |

    Raw Ranging Data Visualization Tool
    98 | Author: Aravinth, S. Panchadcharam
    99 | Date: 20 November 2013
    100 | Email: me@aravinth.info
    101 | Revised: 08 January 2015

    102 | 103 |
    104 | 105 | 106 |
    107 |
    108 |

    This module provides the following classes:

    109 | 110 | 147 |
    148 | 149 |
    150 |
    151 |
    152 |
    153 |
    154 |
    155 |
    156 |
    157 |
    158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /Source/@doc/out/modules/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Redirector 5 | 6 | 7 | 8 | Click here to redirect 9 | 10 | 11 | -------------------------------------------------------------------------------- /Source/README.md: -------------------------------------------------------------------------------- 1 | RAW RANGING DATA VISUALIZATION TOOL v1.0 2 | ================================================================== 3 | 4 | DESCRIPTION 5 | -------------------------------------- 6 | This tool is implemented to visualize raw data that are received from experiments and stored in EVARILOS Database. It is a standalone tool that can be viewed in Internet Browser. 7 | 8 | EXPERIMENT 9 | -------------------------------------- 10 | WiFi Beacon packets are transmitted periodically to announce the presence of WiFi. Beacon Packet RSSI is Received Signal Strength Indicator which indicates the power of signal that is received at the receiver. RSSI is used by networking interface card to determine the energy level in the channel. However, RSSI values are extensively used for ranging and localization purpose where accuracy and reliability should be guaranteed. However, previous studies predict that RSSI values changes due to change in distance and various interferences. In oder to analyze whether there is a variation in RSSI values due to different type of interferences, we have designed a reference scenario and two interference scenarios. Experiments were conducted and repeated. It yielded large set of data. In oder to process and analyze the raw data, a visualization tool was implemented. Processed data was analyzed and statistical results were plotted. 11 | 12 | AUTHOR 13 | -------------------------------------- 14 | Aravinth, Sivalingam Panchadcharam - 15 | 16 | ACKNOWLEDGEMENTS 17 | -------------------------------------- 18 | - Filip Lemić : PhD Candiate of Telecommunication Networks faculty at Technical University of Berlin 19 | - Dr. Arash Behboodi : Telecommunication Networks faculty at Technical University of Berlin 20 | 21 | INSTALLATION 22 | -------------------------------------- 23 | This tools does not have to be installed. Internet Browser that supports HTML5 is needed to run this tool. 24 | 25 | USAGE 26 | -------------------------------------- 27 | - index.html - starts the tool 28 | - @doc/out/index.html - shows the Javascript Doc of the tool 29 | - utils/floor_mapper.html - used to calculate properties of FloorPlan 30 | - utils/rssi_scanner_in_js - nodejs tool to scan rssi in wifi spectrum using Mac Airpot NIC in Mac OSX 31 | 32 | TESTED ON 33 | -------------------------------------- 34 | - Google Chrome 35 | - Mozilla Firefox 36 | - Microsoft Internet Explorer 37 | 38 | CONTACT 39 | -------------------------------------- 40 | If you have problems or querries, please contact 41 | - Filip Lemić - 42 | - Aravinth, Sivalingam Panchadcharam - 43 | 44 | COPYING / LICENSE 45 | -------------------------------------- 46 | - EVARILOS 47 | - TKN - TU Berlin 48 | -------------------------------------------------------------------------------- /Source/css/graph.css: -------------------------------------------------------------------------------- 1 | .bar rect { 2 | fill: steelblue; 3 | shape-rendering: crispEdges; 4 | } 5 | 6 | .bar rect:hover { 7 | fill: brown; 8 | } 9 | 10 | .bar text { 11 | fill: #fff; 12 | } 13 | 14 | .axis path, .axis line { 15 | fill: none; 16 | stroke: #000; 17 | shape-rendering: crispEdges; 18 | } 19 | 20 | svg { 21 | border: solid #000000 1px; 22 | } 23 | 24 | .axisLabel { 25 | font: 15px sans-serif; 26 | } -------------------------------------------------------------------------------- /Source/css/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-size: 62.5%; 3 | font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif"; 4 | } 5 | 6 | table { 7 | font-size: 1em; 8 | } 9 | 10 | .ui-draggable, .ui-droppable { 11 | background-position: top; 12 | } 13 | 14 | #loader { 15 | display: none; 16 | position: fixed; 17 | left: 600px; 18 | top: 300px; 19 | height: 60px; 20 | width: 200px; 21 | background-color: #d3d3d3; 22 | border: solid 1px; 23 | z-index: 20; 24 | text-align: center; 25 | padding-top: 30px; 26 | font-size: 20px; 27 | } 28 | 29 | .selectableList .ui-selecting { 30 | background: #d3d3d3; 31 | } 32 | 33 | .selectableList .ui-selected { 34 | background: steelblue; 35 | color: white; 36 | } 37 | 38 | .selectableList { 39 | list-style-type: none; 40 | margin: 0; 41 | padding: 0; 42 | width: auto; 43 | overflow-wrap: break-word; 44 | } 45 | 46 | .selectableList li { 47 | margin: 3px; 48 | padding: 0.4em; 49 | font-size: 1.1em; 50 | height: auto; 51 | } 52 | 53 | .selectableList { 54 | cursor: pointer; 55 | } 56 | 57 | .selectablePoints .ui-selecting { 58 | background: #d3d3d3; 59 | } 60 | 61 | .selectablePoints .ui-selected { 62 | background: steelblue; 63 | border: solid 1px 64 | } 65 | 66 | .selectablePoints { 67 | list-style-type: none; 68 | margin: 0; 69 | padding: 0; 70 | position: relative; 71 | } 72 | 73 | .selectablePoints li { 74 | background: brown; 75 | border: none 76 | } 77 | 78 | /*-------------------------------------------- Index Tab ----*/ 79 | #titleTabs { 80 | margin-bottom: 5px; 81 | } 82 | 83 | #indexTab { 84 | height: 60px; 85 | } 86 | 87 | #indexTab #title { 88 | float: right; 89 | font-family: Impact; 90 | font-size: 48px; 91 | color: steelblue; 92 | letter-spacing: 2px; 93 | margin-top: 5px; 94 | } 95 | 96 | #indexTab #title { 97 | float: left; 98 | font-family: Impact; 99 | font-size: 45px; 100 | color: steelblue; 101 | letter-spacing: 2px; 102 | } 103 | 104 | #indexTab #tkn { 105 | float: right; 106 | background-image: url(../images/tkn2.gif); 107 | height: 33px; 108 | width: 100px; 109 | margin-top: 20px; 110 | } 111 | 112 | #indexTab #twist { 113 | float: right; 114 | background-image: url(../images/twist.png); 115 | height: 60px; 116 | width: 100px; 117 | background-size: contain; 118 | margin-right: 5px; 119 | display: none; 120 | } 121 | 122 | #indexTab #iMind { 123 | float: right; 124 | background-image: url(../images/iLabt.jpg); 125 | height: 44px; 126 | width: 150px; 127 | margin-top: 10px; 128 | margin-right: 5px; 129 | display: none; 130 | } 131 | 132 | #indexTab #evarilos { 133 | float: right; 134 | background-image: url(../images/evarilos-logo.jpg); 135 | height: 60px; 136 | width: 150px; 137 | background-size: contain; 138 | margin-right: 5px; 139 | display: none; 140 | } 141 | 142 | /*-------------------------------------------- Dashboard Tab ----*/ 143 | #servers { 144 | float: left; 145 | width: 20%; 146 | height: 95%; 147 | } 148 | 149 | #databases { 150 | float: left; 151 | width: 20%; 152 | height: 95%; 153 | margin-left: 10px; 154 | } 155 | 156 | #collections { 157 | float: left; 158 | width: 35%; 159 | height: 95%; 160 | margin-left: 10px; 161 | overflow: scroll; 162 | } 163 | 164 | #floorPlans { 165 | float: left; 166 | width: 20%; 167 | height: 95%; 168 | margin-left: 10px; 169 | } 170 | 171 | /*-------------------------------------------- Floor Plan Tab ----*/ 172 | 173 | .node { 174 | position: absolute; 175 | height: 14px; 176 | width: 14px; 177 | border-radius: 7px; 178 | cursor: pointer; 179 | } 180 | 181 | .node .xy { 182 | left: 0px; 183 | top: 366px; 184 | } 185 | 186 | #floorContainer { 187 | width: 65%; 188 | float: left; 189 | } 190 | 191 | #floor { 192 | border: solid 1px #000000; 193 | width: 960px; 194 | height: 480px; 195 | background-size: 100% 100%; 196 | } 197 | 198 | .defaultFloor { 199 | background-image: url(../images/floor_twist_2.png); 200 | } 201 | 202 | .twist2Floor { 203 | background-image: url(../images/floor_twist_2.png); 204 | } 205 | 206 | .twist3Floor { 207 | background-image: url(../images/floor_twist_3.png); 208 | } 209 | 210 | .twist4Floor { 211 | background-image: url(../images/floor_twist_4.png); 212 | } 213 | 214 | .iLab1 { 215 | background-image: url(../images/floor_ilab_1.png); 216 | } 217 | 218 | .iLab2 { 219 | background-image: url(../images/floor_ilab_2.png); 220 | } 221 | 222 | .ui-menu { 223 | width: 100px; 224 | margin: 10px; 225 | } 226 | 227 | #channelMenu { 228 | display: none; 229 | } 230 | 231 | #accesspoints { 232 | float: right; 233 | margin-left: 10px; 234 | margin-bottom: 10px; 235 | width: 25%; 236 | height: 68%; 237 | overflow: scroll; 238 | } 239 | 240 | .accessPointUri { 241 | color: darkblue; 242 | font-size: 12px; 243 | font-weight: bold; 244 | cursor: pointer; 245 | margin: 2px; 246 | } 247 | 248 | #floorInfoTabs { 249 | float: right; 250 | margin-left: 10px; 251 | width: 25%; 252 | height: 27%; 253 | } 254 | 255 | /*-------------------------------------------- Graph Tab ----*/ 256 | #graph { 257 | float: left; 258 | } 259 | 260 | #graphInfoTabs { 261 | float: right; 262 | margin-left: 10px; 263 | margin-bottom: 10px; 264 | width: 325px; 265 | height: 96%; 266 | overflow-wrap: break-word; 267 | } 268 | 269 | 270 | 271 | -------------------------------------------------------------------------------- /Source/css/table.css: -------------------------------------------------------------------------------- 1 | .CSSTableGenerator { 2 | margin:0px;padding:0px; 3 | width:100%; box-shadow: 10px 10px 5px #888888; 4 | border:1px solid #000000; 5 | 6 | -moz-border-radius-bottomleft:0px; 7 | -webkit-border-bottom-left-radius:0px; 8 | border-bottom-left-radius:0px; 9 | 10 | -moz-border-radius-bottomright:0px; 11 | -webkit-border-bottom-right-radius:0px; 12 | border-bottom-right-radius:0px; 13 | 14 | -moz-border-radius-topright:0px; 15 | -webkit-border-top-right-radius:0px; 16 | border-top-right-radius:0px; 17 | 18 | -moz-border-radius-topleft:0px; 19 | -webkit-border-top-left-radius:0px; 20 | border-top-left-radius:0px; 21 | }.CSSTableGenerator table{ 22 | width:100%; 23 | height:100%; 24 | margin:0px;padding:0px; 25 | }.CSSTableGenerator tr:last-child td:last-child { 26 | -moz-border-radius-bottomright:0px; 27 | -webkit-border-bottom-right-radius:0px; 28 | border-bottom-right-radius:0px; 29 | } 30 | .CSSTableGenerator table tr:first-child td:first-child { 31 | -moz-border-radius-topleft:0px; 32 | -webkit-border-top-left-radius:0px; 33 | border-top-left-radius:0px; 34 | } 35 | .CSSTableGenerator table tr:first-child td:last-child { 36 | -moz-border-radius-topright:0px; 37 | -webkit-border-top-right-radius:0px; 38 | border-top-right-radius:0px; 39 | }.CSSTableGenerator tr:last-child td:first-child{ 40 | -moz-border-radius-bottomleft:0px; 41 | -webkit-border-bottom-left-radius:0px; 42 | border-bottom-left-radius:0px; 43 | }.CSSTableGenerator tr:hover td{ 44 | 45 | }.CSSTableGenerator tr:nth-child(odd){ background-color:#e5e5e5; } 46 | .CSSTableGenerator tr:nth-child(even) { background-color:#ffffff; } 47 | .CSSTableGenerator td{ 48 | vertical-align:middle; 49 | 50 | 51 | border:1px solid #000000; 52 | border-width:0px 1px 1px 0px; 53 | text-align:left; 54 | padding:7px; 55 | font-size:10px; 56 | font-family:arial; 57 | font-weight:normal; 58 | color:#000000; 59 | }.CSSTableGenerator tr:last-child td{ 60 | border-width:0px 1px 0px 0px; 61 | }.CSSTableGenerator tr td:last-child{ 62 | border-width:0px 0px 1px 0px; 63 | }.CSSTableGenerator tr:last-child td:last-child{ 64 | border-width:0px 0px 0px 0px; 65 | } 66 | .CSSTableGenerator tr:first-child td{ 67 | background:-o-linear-gradient(bottom, #cccccc 5%, #b2b2b2 100%); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #cccccc), color-stop(1, #b2b2b2) ); background:-moz-linear-gradient( center top, #cccccc 5%, #b2b2b2 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#cccccc", endColorstr="#b2b2b2"); background: -o-linear-gradient(top,#cccccc,b2b2b2); 68 | background-color:#cccccc; 69 | border:0px solid #000000; 70 | text-align:center; 71 | border-width:0px 0px 1px 1px; 72 | font-size:14px; 73 | font-family:arial; 74 | font-weight:bold; 75 | color:#000000; 76 | } 77 | .CSSTableGenerator tr:first-child:hover td{ 78 | background:-o-linear-gradient(bottom, #cccccc 5%, #b2b2b2 100%); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #cccccc), color-stop(1, #b2b2b2) ); background:-moz-linear-gradient( center top, #cccccc 5%, #b2b2b2 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#cccccc", endColorstr="#b2b2b2"); background: -o-linear-gradient(top,#cccccc,b2b2b2); 79 | background-color:#cccccc; 80 | } 81 | .CSSTableGenerator tr:first-child td:first-child{ 82 | border-width:0px 0px 1px 0px; 83 | } 84 | .CSSTableGenerator tr:first-child td:last-child{ 85 | border-width:0px 0px 1px 1px; 86 | } 87 | 88 | .groupVariance{ 89 | border: solid red 2px; 90 | font-weight: bold; 91 | font-size: 12px; 92 | padding: 5px; 93 | text-align: center; 94 | } 95 | -------------------------------------------------------------------------------- /Source/images/evarilos-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/evarilos-logo.jpg -------------------------------------------------------------------------------- /Source/images/floor_ilab_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/floor_ilab_1.png -------------------------------------------------------------------------------- /Source/images/floor_ilab_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/floor_ilab_2.png -------------------------------------------------------------------------------- /Source/images/floor_twist_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/floor_twist_2.png -------------------------------------------------------------------------------- /Source/images/floor_twist_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/floor_twist_3.png -------------------------------------------------------------------------------- /Source/images/floor_twist_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/floor_twist_4.png -------------------------------------------------------------------------------- /Source/images/iLabt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/iLabt.jpg -------------------------------------------------------------------------------- /Source/images/tkn2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/tkn2.gif -------------------------------------------------------------------------------- /Source/images/twist.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/twist.jpg -------------------------------------------------------------------------------- /Source/images/twist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/twist.png -------------------------------------------------------------------------------- /Source/images/x_floor_ilab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/x_floor_ilab.png -------------------------------------------------------------------------------- /Source/images/x_floor_twist_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/x_floor_twist_2.png -------------------------------------------------------------------------------- /Source/images/x_floor_twist_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/x_floor_twist_3.png -------------------------------------------------------------------------------- /Source/images/x_floor_twist_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AravinthPanch/rssi/0e111c0958d11cf8699279af67d98fa64d62dc1a/Source/images/x_floor_twist_4.png -------------------------------------------------------------------------------- /Source/libs/amplify.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Amplify 1.1.2 3 | * 4 | * Copyright 2011 - 2013 appendTo LLC. (http://appendto.com/team) 5 | * Dual licensed under the MIT or GPL licenses. 6 | * http://appendto.com/open-source-licenses 7 | * 8 | * http://amplifyjs.com 9 | */ 10 | (function(e,t){var n=[].slice,r={},i=e.amplify={publish:function(e){if(typeof e!="string")throw new Error("You must provide a valid topic to publish.");var t=n.call(arguments,1),i,s,o,u=0,a;if(!r[e])return!0;i=r[e].slice();for(o=i.length;u=0;f--)if(r[e][f].priority<=i){r[e].splice(f+1,0,l),a=!0;break}a||r[e].unshift(l)}return n},unsubscribe:function(e,t,n){if(typeof e!="string")throw new Error("You must provide a valid topic to remove a subscription.");arguments.length===2&&(n=t,t=null);if(!r[e])return;var i=r[e].length,s=0;for(;s 3 | * Author: Aravinth, S. Panchadcharam
    4 | * Date: 20 November 2013
    5 | * Email: me@aravinth.info
    6 | * Revised: 08 January 2015
    7 | 8 | @module APP 9 | */ 10 | 11 | /** 12 | * APP is started after DOM is READY. 13 | * 14 | */ 15 | $(function () { 16 | app.view.initialize(); 17 | app.controller.initialize(); 18 | }); 19 | 20 | -------------------------------------------------------------------------------- /Source/scripts/collection.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Collection deals with the process of retrieving JSON data from backend and processing them according to the requirement 3 | * 4 | * @class collection 5 | */ 6 | app.collection = { 7 | 8 | /** 9 | It retrieves the list of Databases from backend in Local or Remote Machine based on the selection 10 | @method getDatabaseList 11 | @param {String} databaseURL The URL of the selected Server in Local or Remote machine 12 | **/ 13 | getDatabaseList: function (data) { 14 | app.view.showLoader(); 15 | app.view.createDatabaseListUi(); 16 | $.getJSON(data, function (results) { 17 | app.view.hideLoader(); 18 | app.databaseList = results; 19 | app.metadataUri = results.metadata; 20 | app.eventBus.publish("databaseList:retrieved") 21 | }) 22 | }, 23 | 24 | 25 | /** 26 | It retrieves the list of Collections from backend 27 | @method getCollectionList 28 | @param {String} databaseUri The URI of the selected Database 29 | **/ 30 | getCollectionList: function (data) { 31 | app.view.showLoader(); 32 | app.view.clearCollectionList(); 33 | app.view.createCollectionListUi(); 34 | $.getJSON(data, function (results) { 35 | app.view.hideLoader(); 36 | app.collectionList = results; 37 | 38 | app.collectionList = []; 39 | $.each(results, function (key, val) { 40 | app.collectionList.push({collection: key, uri: val}) 41 | }); 42 | app.collectionList = _.sortBy(app.collectionList, function (val) { 43 | return val.collection.toLowerCase(); 44 | }); 45 | app.eventBus.publish("collectionList:retrieved") 46 | }) 47 | }, 48 | 49 | 50 | /** 51 | It retrieves the internal list of the selected Collection from backend 52 | @method getSelectedCollectionData 53 | @param {String} collectionUri The URI of the selected Collection 54 | **/ 55 | getSelectedCollectionData: function (data) { 56 | $.getJSON(data, function (results) { 57 | app.selectedCollectionData = results; 58 | app.metadataId = results[0].metadata_id; 59 | app.eventBus.publish("selectedCollectionData:retrieved") 60 | }) 61 | }, 62 | 63 | 64 | /** 65 | It retrieves the complete RawData of the selected Collection from backend 66 | @method getRawData 67 | @param {Array} selectedCollectionUrls The Internal URLs of the selected Collection 68 | **/ 69 | getRawData: function (data) { 70 | app.rawData = []; 71 | $.each(data, function (key, val) { 72 | $.ajax({ 73 | url: val.URI, 74 | async: false 75 | }).done(function (results) { 76 | results = JSON.parse(results); 77 | results.receiver_location = results.raw_measurement[0].receiver_location; 78 | app.rawData.push(results); 79 | }); 80 | }); 81 | app.rawData = _.sortBy(app.rawData, function (res) { 82 | return res.receiver_location.coordinate_x; 83 | }); 84 | app.eventBus.publish("rawData:retrieved") 85 | }, 86 | 87 | 88 | /** 89 | It filters the RawData based on the selected Floor Plan 90 | @method filterRawDataByFloor 91 | @param {Array} rawData The rawData of the selected Collection 92 | **/ 93 | filterRawDataByFloor: function (data) { 94 | var zAxis; 95 | app.filteredRawDataByFloor = []; 96 | switch (app.selectedFloorPlan) { 97 | case 'twist2Floor': 98 | zAxis = 9.53; 99 | break; 100 | case 'twist3Floor': 101 | zAxis = 12.37; 102 | break; 103 | case 'twist4Floor': 104 | zAxis = 16.05; 105 | break; 106 | case 'iLab1': 107 | zAxis = 3; 108 | break; 109 | case 'iLab2': 110 | zAxis = 0; 111 | break; 112 | } 113 | $.each(data, function (key, val) { 114 | if (val.receiver_location.coordinate_z == zAxis) { 115 | app.filteredRawDataByFloor.push(val) 116 | } 117 | }) 118 | }, 119 | 120 | 121 | /** 122 | It gets the data of the selected Node in the FloorPlan 123 | @method getSelectedNodeData 124 | @param {String} selectedNodeId The Id of the selected Node in the FloorPlan 125 | **/ 126 | getSelectedNodeData: function (data) { 127 | $.each(app.rawData, function (key, val) { 128 | if (val.data_id == data) { 129 | app.selectedNodeData = val 130 | } 131 | }) 132 | }, 133 | 134 | 135 | /** 136 | It groups the data of the selected Node based on Channel Number and sorted ascending 137 | @method groupNodeDataByChannel 138 | @param {Array} selectedNodeData The Data of the selected Node in the FloorPlan 139 | **/ 140 | groupNodeDataByChannel: function (data) { 141 | if ('channel' in data.raw_measurement[0]) { 142 | var nodeDataGroupedByChannel = _.groupBy(data.raw_measurement, function (val) { 143 | return val.channel 144 | }); 145 | 146 | app.groupedNodeDataByChannel = []; 147 | app.channelList = []; 148 | 149 | $.each(nodeDataGroupedByChannel, function (key, val) { 150 | app.channelList.push(key); 151 | app.groupedNodeDataByChannel.push({channel: key, data: val}) 152 | }); 153 | app.channelList = _.sortBy(app.channelList) 154 | 155 | } else { 156 | app.groupedNodeDataByChannel = []; 157 | app.channelList = ['unknown']; 158 | app.groupedNodeDataByChannel.push({channel: 'unknown', data: data.raw_measurement}) 159 | } 160 | }, 161 | 162 | 163 | /** 164 | It gets the data of the selected Channel 165 | @method getSelectedChannelData 166 | @param {String} selectedChannel The Number of the selected Channel 167 | **/ 168 | getSelectedChannelData: function (data) { 169 | $.each(app.groupedNodeDataByChannel, function (key, val) { 170 | if (val.channel == data) { 171 | app.selectedChannelData = val 172 | } 173 | }) 174 | }, 175 | 176 | 177 | /** 178 | It groups the data of the selected Channel based on SSID_BSSID and then sorted alphabetically 179 | @method groupSelectedChannelDataBySsid 180 | @param {Array} selectedChannelData The Data of of the selected Channel 181 | **/ 182 | groupSelectedChannelDataBySsid: function (data) { 183 | var rssiDataGrouped = _.groupBy(data.data, function (val) { 184 | return val.sender_id + '_' + val.sender_bssid 185 | }) 186 | 187 | var rssiDataArrayed = []; 188 | 189 | $.each(rssiDataGrouped, function (key, val) { 190 | rssiDataArrayed.push({ssid: key, data: val}) 191 | }) 192 | 193 | app.groupedSsidData = _.sortBy(rssiDataArrayed, function (val) { 194 | return val.ssid.toLowerCase() 195 | }) 196 | }, 197 | 198 | /** 199 | It picks only rssi valued from the data of the selected AccessPoint to feed to the Chart 200 | @method processGraphData 201 | @param {Array} selectedSsidData The SSID_BSSID Data of the selected AccessPoint 202 | **/ 203 | processGraphData: function (data) { 204 | $.each(app.groupedSsidData, function (key, val) { 205 | if (val.ssid == data) { 206 | app.selectedSsidData = val; 207 | app.graphData = _.map(app.selectedSsidData.data, function (d) { 208 | return d.rssi 209 | }) 210 | } 211 | }) 212 | }, 213 | 214 | 215 | /** 216 | It retrieves the Metadata from backend 217 | @method getMetadata 218 | @param {String} metadataId The MetadataId of the selected collection 219 | **/ 220 | getMetadata: function (data) { 221 | $.getJSON(app.metadataUri, function (results) { 222 | var uri = results[app.selectedDatabase.name]; 223 | $.getJSON(uri, function (results) { 224 | $.each(results, function (key, val) { 225 | if (val.metadata_id == data) { 226 | $.getJSON(val.URI, function (results) { 227 | app.metadata = results; 228 | app.eventBus.publish("metadata:retrieved") 229 | }) 230 | } 231 | 232 | }) 233 | }) 234 | }) 235 | } 236 | 237 | }; 238 | 239 | -------------------------------------------------------------------------------- /Source/scripts/controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Controller is the hub of APP. APP is implemented with the Event-Driven-Architecture. 3 | * Controller is responsible for capturing events and sets the respective callbacks for every events which are triggered 4 | * throughout APP. 5 | * 6 | * @class controller 7 | */ 8 | app.controller = { 9 | 10 | /** 11 | It initialises the controller to process the captured events. These events are triggered in various parts of APP 12 | and captured by the controller 13 | @method initialize 14 | **/ 15 | initialize: function () { 16 | 17 | /** 18 | Triggered when a server is selected by user 19 | @event server:selected 20 | @param {String} serverId The name of the selected Server 21 | **/ 22 | app.eventBus.subscribe("server:selected", function (serverId) { 23 | app.controller.serverSelected(serverId); 24 | }); 25 | 26 | 27 | /** 28 | Triggered when database is retrieved from the Remote API 29 | @event databaseList:retrieved 30 | **/ 31 | app.eventBus.subscribe("databaseList:retrieved", function () { 32 | app.view.updateDatabaseListUi(app.databaseList); 33 | }); 34 | 35 | 36 | /** 37 | Triggered when a Database is selected by user 38 | @event database:selected 39 | @param {String} databaseUri The URI of the selected Database 40 | **/ 41 | app.eventBus.subscribe("database:selected", function (databaseUri) { 42 | app.collection.getCollectionList(databaseUri); 43 | }); 44 | 45 | 46 | /** 47 | Triggered when list of Collections is retrieved from backend 48 | @event collectionList:retrieved 49 | **/ 50 | app.eventBus.subscribe("collectionList:retrieved", function () { 51 | app.view.updateCollectionListUi(app.collectionList); 52 | }); 53 | 54 | 55 | /** 56 | Triggered when a Collection is selected by user 57 | @event collection:selected 58 | @param {String} collectionUri The URI of the selected Collection 59 | **/ 60 | app.eventBus.subscribe("collection:selected", function (collectionUri) { 61 | app.view.showLoader(); 62 | app.collection.getSelectedCollectionData(collectionUri); 63 | }); 64 | 65 | 66 | /** 67 | Triggered when internal list of the selected Collection is retrieved from backend 68 | @event selectedCollectionData:retrieved 69 | **/ 70 | app.eventBus.subscribe("selectedCollectionData:retrieved", function () { 71 | app.collection.getRawData(app.selectedCollectionData); 72 | }); 73 | 74 | /** 75 | Triggered when complete RawData of the selected Collection is retrieved from backend 76 | @event rawData:retrieved 77 | **/ 78 | app.eventBus.subscribe("rawData:retrieved", function () { 79 | app.view.hideLoader(); 80 | app.collection.getMetadata(app.metadataId); 81 | //app.utils.dumpPlotData(app.rawData); 82 | }); 83 | 84 | app.eventBus.subscribe("plot:data:retrieved", function () { 85 | app.view.updatePlotData(); 86 | app.view.updatePlotDataRepeat(); 87 | }); 88 | //getSmallRepeatability(); 89 | //getWifiStatRepeatability(); 90 | //getSigGenRepeatability(); 91 | 92 | /** 93 | Triggered when Metadata of the selected collection is retrieved from backend 94 | @event metadata:retrieved 95 | **/ 96 | app.eventBus.subscribe("metadata:retrieved", function () { 97 | app.view.updateMetadataUi(app.metadata); 98 | }); 99 | 100 | 101 | /** 102 | Triggered when a Floor Plan is selected by user 103 | @event floorPlan:selected 104 | **/ 105 | app.eventBus.subscribe("floorPlan:selected", function () { 106 | app.collection.filterRawDataByFloor(app.rawData); 107 | app.floor.mapCoordinates(app.filteredRawDataByFloor); 108 | }); 109 | 110 | 111 | /** 112 | Triggered when coordinates are mapped to the selected Floor Plan 113 | @event coordinates:mapped 114 | **/ 115 | app.eventBus.subscribe("coordinates:mapped", function () { 116 | app.view.updateNodeUi(app.filteredRawDataByFloor); 117 | app.view.updateFloorInfo(app.selectedNodeData); 118 | app.view.showFloorPanel(); 119 | }); 120 | 121 | 122 | /** 123 | Triggered when a Node in the FloorPlan is selected by user 124 | @event node:selected 125 | @param {String} selectedNodeId The Id of the selected Node in the FloorPlan 126 | **/ 127 | app.eventBus.subscribe("node:selected", function (selectedNodeId) { 128 | app.collection.getSelectedNodeData(selectedNodeId); 129 | app.collection.groupNodeDataByChannel(app.selectedNodeData); 130 | app.view.updateFloorInfo(app.selectedNodeData); 131 | app.view.updateChannelList(app.channelList); 132 | }); 133 | 134 | 135 | /** 136 | Triggered when a Channel is selected by user 137 | @event channel:selected 138 | @param {Integer} selectedChannel The number of the selected channel 139 | **/ 140 | app.eventBus.subscribe("channel:selected", function (selectedChannel) { 141 | app.collection.getSelectedChannelData(selectedChannel); 142 | app.collection.groupSelectedChannelDataBySsid(app.selectedChannelData); 143 | app.view.updateAccessPointUi(app.groupedSsidData); 144 | }); 145 | 146 | 147 | /** 148 | Triggered when an AccessPoint is selected by user 149 | @event accessPoint:selected 150 | @param {String} selectedSsidData The SSID_BSSID of the selected AccessPoint 151 | **/ 152 | app.eventBus.subscribe("accessPoint:selected", function (selectedSsidData) { 153 | app.collection.processGraphData(selectedSsidData); 154 | app.view.showGraphPanel(); 155 | app.view.updateGraphInfoUi(app.selectedNodeData.receiver_location); 156 | app.graph.draw(app.graphData); 157 | 158 | }); 159 | 160 | 161 | }, 162 | 163 | /** 164 | It is a callback for an event when a server is selected by user 165 | @method serverSelected 166 | @param {String} serverId The name of the selected Server 167 | **/ 168 | serverSelected: function (data) { 169 | app.view.clearDatabaseList(); 170 | app.view.clearCollectionList(); 171 | app.view.resetFloorPlanList(); 172 | switch (data) { 173 | case "server1" : 174 | app.collection.getDatabaseList(app.dataBaseUriLocal); 175 | break; 176 | case "server2" : 177 | app.collection.getDatabaseList(app.dataBaseUriRemote); 178 | break; 179 | case "server3" : 180 | app.rawData = staticData; 181 | app.selectedFloorPlan = 'twist2Floor'; 182 | app.floor.mapCoordinates(app.rawData); 183 | break; 184 | } 185 | } 186 | 187 | }; 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /Source/scripts/floor.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Floor translates and maps the coordinates of the location information that is included in the RawData. 3 | * This is achieved based on Offset and Units which are calculated from every Floor Plan image. 4 | * FloorPlan Image properties are calculated using utils/floor_mapper.html and stored under globals.js 5 | * 6 | * @class floor 7 | */ 8 | app.floor = { 9 | 10 | /** 11 | It maps the coordinates of location in RawData to the selected Floor Plan 12 | @method mapCoordinates 13 | @param {Array} rawData The RawData of the selected collection 14 | **/ 15 | mapCoordinates: function (data) { 16 | app.filteredRawDataByFloor = $.each(data, function (key, val) { 17 | var axis; 18 | switch (app.selectedFloorPlan) { 19 | case 'twist2Floor': 20 | axis = app.floor.pixelConverter(val.receiver_location.coordinate_x, val.receiver_location.coordinate_y, 21 | app.floorPlanScale.twist2Floor.x_unit, app.floorPlanScale.twist2Floor.y_unit, 22 | app.floorPlanScale.twist2Floor.left_offset_px, 23 | (app.floorPlanScale.twist2Floor.top_offset_px + app.floorPlanScale.twist2Floor.height_px )); 24 | 25 | break; 26 | 27 | case 'twist3Floor': 28 | axis = app.floor.pixelConverter(val.receiver_location.coordinate_x, val.receiver_location.coordinate_y, 29 | app.floorPlanScale.twist3Floor.x_unit, app.floorPlanScale.twist3Floor.y_unit, 30 | app.floorPlanScale.twist3Floor.left_offset_px, 31 | (app.floorPlanScale.twist3Floor.top_offset_px + app.floorPlanScale.twist3Floor.height_px )); 32 | break; 33 | 34 | case 'twist4Floor': 35 | axis = app.floor.pixelConverter(val.receiver_location.coordinate_x, val.receiver_location.coordinate_y, 36 | app.floorPlanScale.twist4Floor.x_unit, app.floorPlanScale.twist4Floor.y_unit, 37 | app.floorPlanScale.twist4Floor.left_offset_px, 38 | (app.floorPlanScale.twist4Floor.top_offset_px + app.floorPlanScale.twist4Floor.height_px )); 39 | break; 40 | 41 | case 'iLab1': 42 | axis = app.floor.pixelConverter(val.receiver_location.coordinate_x, val.receiver_location.coordinate_y, 43 | app.floorPlanScale.iLab1.x_unit, app.floorPlanScale.iLab1.y_unit, 44 | app.floorPlanScale.iLab1.left_offset_px, 45 | (app.floorPlanScale.iLab1.top_offset_px + app.floorPlanScale.iLab1.height_px )); 46 | break; 47 | 48 | //iLab2 has (0,0) at top, hence no need to add the height to top_offset 49 | 50 | case 'iLab2': 51 | axis = app.floor.pixelConverter(val.receiver_location.coordinate_x, val.receiver_location.coordinate_y, 52 | app.floorPlanScale.iLab2.x_unit, app.floorPlanScale.iLab2.y_unit, 53 | app.floorPlanScale.iLab2.left_offset_px, 54 | (app.floorPlanScale.iLab2.top_offset_px)); 55 | break; 56 | } 57 | val.receiver_location.coordinate_x_translated = axis[0]; 58 | val.receiver_location.coordinate_y_translated = axis[1]; 59 | }); 60 | app.eventBus.publish("coordinates:mapped") 61 | }, 62 | 63 | 64 | /** 65 | It translates the original coordinates according to the size of the Floor Plan 66 | @method pixelConverter 67 | @param {Number} x Original X axis of the location 68 | @param {Number} y Original Y axis of the location 69 | @param {Number} x_unit One Unit of X Axis of the location in pixels of Floor Plan 70 | @param {Number} y_unit One Unit of Y Axis of the location in pixels of Floor Plan 71 | @param {Number} left_offset Offset of the Floor Plan Image from left 72 | @param {Number} top_offset Offset of the Floor Plan Image from top 73 | @return {Object} Translated X and Y axis 74 | **/ 75 | pixelConverter: function (x, y, x_unit, y_unit, left_offset, top_offset) { 76 | 77 | var xPix = x * x_unit; 78 | var yPix = y * y_unit; 79 | 80 | var xAxis = left_offset + xPix; 81 | var yAxis; 82 | 83 | //iLab2 has (0,0) at top 84 | if (app.selectedFloorPlan == 'iLab2') { 85 | yAxis = top_offset + yPix; 86 | } else { 87 | yAxis = top_offset - yPix; 88 | } 89 | 90 | var xAxis = d3.round(xAxis, 2); 91 | var yAxis = d3.round(yAxis, 2); 92 | 93 | var axis = [xAxis, yAxis]; 94 | return axis; 95 | } 96 | 97 | }; 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Source/scripts/globals.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Globals contains properties, constants and variables used in APP. 3 | * Important data used during the lifecycle of APP are stored under Globals for the purpose having clean global variables and debugging. 4 | * 5 | * @class globals 6 | */ 7 | var app = { 8 | 9 | /** 10 | AmplifyJS global variable is assigned as Eventbus 11 | 12 | @property eventBus 13 | @type Object 14 | **/ 15 | eventBus: amplify, 16 | 17 | /** 18 | URL of the remote server 19 | 20 | @property dataBaseUriRemote 21 | @type String 22 | **/ 23 | dataBaseUriRemote: 'http://ec2-54-217-136-137.eu-west-1.compute.amazonaws.com:5000/evarilos/raw_data/v1.0/database', 24 | 25 | /** 26 | URL of the local server 27 | 28 | @property dataBaseUriLocal 29 | @type String 30 | **/ 31 | dataBaseUriLocal: 'http://localhost:5000/evarilos/raw_data/v1.0/database', 32 | 33 | /** 34 | URL of the metadata collection 35 | 36 | @property metadataUri 37 | @type String 38 | **/ 39 | metadataUri: '', 40 | 41 | /** 42 | metadataId of the selected experiment 43 | 44 | @property metadataId 45 | @type String 46 | **/ 47 | metadataId: '', 48 | 49 | /** 50 | Metadata of the selected experiment 51 | 52 | @property metadata 53 | @type Object 54 | **/ 55 | metadata: {}, 56 | 57 | /** 58 | List of databases of selected server 59 | 60 | @property databaseList 61 | @type Array 62 | **/ 63 | databaseList: [], 64 | 65 | /** 66 | Name and URI of the selected database 67 | 68 | @property selectedDatabase 69 | @type Object 70 | **/ 71 | selectedDatabase: {}, 72 | 73 | /** 74 | List of collections of the selected database 75 | 76 | @property collectionList 77 | @type Array 78 | **/ 79 | collectionList: [], 80 | 81 | /** 82 | Name and URI of the selected collection 83 | 84 | @property selectedCollection 85 | @type Object 86 | **/ 87 | selectedCollection: {}, 88 | 89 | /** 90 | Internal URI List of the selected collection 91 | 92 | @property selectedCollectionData 93 | @type Array 94 | **/ 95 | selectedCollectionData: [], 96 | 97 | /** 98 | RawData of the selected collection which is a list of RawData from all measurement points of the selected experiment 99 | 100 | @property rawData 101 | @type Array 102 | **/ 103 | rawData: [], 104 | 105 | /** 106 | Name of the selected floor plan 107 | 108 | @property selectedFloorPlan 109 | @type String 110 | **/ 111 | selectedFloorPlan: {}, 112 | 113 | /** 114 | RawData filtered by FloorPlan. Even though FloorPlan is selected by USER, some Big collections have data of various FloorPlans altogether 115 | In order to filter such RawData, extra function is implemented and the result stored in this variable 116 | 117 | @property filteredRawDataByFloor 118 | @type Array 119 | **/ 120 | filteredRawDataByFloor: {}, 121 | 122 | /** 123 | List of all measurement points of the selected collection. Measurement Points are defined as nodes through out APP 124 | 125 | @property nodeList 126 | @type Array 127 | **/ 128 | nodeList: [], 129 | 130 | /** 131 | Data of the selected node 132 | 133 | @property selectedNodeData 134 | @type Array 135 | **/ 136 | selectedNodeData: [], 137 | 138 | /** 139 | List of Channel Number which are extracted from the selectedNodeData, if available 140 | 141 | @property channelList 142 | @type Array 143 | **/ 144 | channelList: [], 145 | 146 | /** 147 | Data of selected Node grouped by Channel number 148 | 149 | @property groupedNodeDataByChannel 150 | @type Array 151 | **/ 152 | groupedNodeDataByChannel: [], 153 | 154 | /** 155 | Data of selected Channel 156 | 157 | @property selectedChannelData 158 | @type Object 159 | **/ 160 | selectedChannelData: [], 161 | 162 | /** 163 | RSSI Data grouped by SSID_BSSID 164 | 165 | @property groupedSsidData 166 | @type Array 167 | **/ 168 | groupedSsidData: [], 169 | 170 | /** 171 | RSSI Data of the selected SSID_BSSID 172 | 173 | @property selectedSsidData 174 | @type Object 175 | **/ 176 | selectedSsidData: [], 177 | 178 | /** 179 | Extracted RSSI values of the selected SSID_BSSID that will be fed to the graph 180 | 181 | @property graphData 182 | @type Array 183 | **/ 184 | graphData: [], 185 | 186 | /** 187 | Properties of FloorPlans that contains size of the FloorPlan Image and One Unit of X,Y Axis of the location in pixels of Floor Plan, 188 | Offset of the Floor Plan Image from left and top. These properties are calculated using utils/floor_mapper.html 189 | 190 | @property floorPlanScale 191 | @type Object 192 | **/ 193 | floorPlanScale: { 194 | twist2Floor: { 195 | width_px: 736.67, //x_25_units 196 | height_px: 411, //y_15_units 197 | x_unit: 29.47, 198 | y_unit: 27.45, 199 | left_offset_px: (20 - 20), //adjusted due to unknown or incorrect (0,0) origin 200 | top_offset_px: 23 201 | }, 202 | twist3Floor: { 203 | width_px: 733.67, //x_25_units 204 | height_px: 416.67, //y_15_units 205 | x_unit: 29.35, 206 | y_unit: 27.78, 207 | left_offset_px: 22, 208 | top_offset_px: 21 209 | }, 210 | twist4Floor: { 211 | width_px: 733.4, //x_25_units 212 | height_px: 418.4, //y_15_units 213 | x_unit: 29.34, 214 | y_unit: 27.9, 215 | left_offset_px: 22, 216 | top_offset_px: 21 217 | }, 218 | iLab1: { 219 | width_px: 948, //x_57.5_units 220 | height_px: 415, //y_16.8_units 221 | x_unit: 14, 222 | y_unit: 25, 223 | left_offset_px: 15, 224 | top_offset_px: 20 225 | }, 226 | iLab2: { 227 | width_px: 918, //x_52.5_units 228 | height_px: 387, //y_16.5_units 229 | x_unit: 17.48, 230 | y_unit: 23.45, 231 | left_offset_px: 35, 232 | top_offset_px: 45 233 | } 234 | }, 235 | 236 | floorPlanScale_with_old_images: { 237 | twist2Floor: { 238 | width_px: 782, 239 | height_px: 360, 240 | x_unit: 26.07, 241 | y_unit: 24, 242 | left_offset_px: (67 - 15), //adjusted to calibrate 243 | top_offset_px: 38 244 | }, 245 | twist3Floor: { 246 | width_px: 778, 247 | height_px: 339, 248 | x_unit: 25.9, 249 | y_unit: 22.6, 250 | left_offset_px: 40, 251 | top_offset_px: 34 252 | }, 253 | twist4Floor: { 254 | width_px: 807, 255 | height_px: 370, 256 | x_unit: 26.9, 257 | y_unit: 24.6, 258 | left_offset_px: 40, 259 | top_offset_px: 28 260 | }, 261 | iLab1: { 262 | width_px: 944, 263 | height_px: 412, 264 | x_unit: 17.92, 265 | y_unit: 23.13, 266 | left_offset_px: 15, 267 | top_offset_px: 49 268 | } 269 | }, 270 | 271 | plotData : {} 272 | 273 | } 274 | -------------------------------------------------------------------------------- /Source/scripts/graph.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Graph gets an Array of RSSI values and draws a Histogram using D3.JS 3 | * 4 | * @class graph 5 | */ 6 | app.graph = { 7 | 8 | /** 9 | It draws the SVG based Graph 10 | @method draw 11 | @param {Array} rssi RSSI values of the selected accesspoint 12 | **/ 13 | draw: function (values) { 14 | 15 | app.view.clearGraph() 16 | 17 | var width = 930; 18 | var height = 470; 19 | var padding = 60; 20 | var barWidth = 30; 21 | 22 | var startValue = d3.max(values); 23 | var endValue = d3.min(values); 24 | var binTicks = 10; 25 | 26 | if ((startValue - endValue) > 10) { 27 | binTicks = startValue - endValue 28 | } else { 29 | startValue += 9 - (startValue - endValue) 30 | } 31 | 32 | var x = d3.scale.linear() 33 | .domain([ startValue + 1 , endValue - 1]) 34 | .range([0, width - 2 * padding]); 35 | 36 | var data = d3.layout.histogram() 37 | .bins(x.ticks(binTicks)) 38 | (values); 39 | 40 | var y = d3.scale.linear() 41 | .domain([0, d3.max(data, function (d) { 42 | return d.y + 1; 43 | })]) 44 | .range([height - 2 * padding, 0]); 45 | 46 | 47 | var xAxis = d3.svg.axis(); 48 | 49 | xAxis.scale(x) 50 | .orient("bottom"); 51 | 52 | xAxis.ticks(binTicks) 53 | 54 | var yAxis = d3.svg.axis(); 55 | 56 | yAxis.scale(y) 57 | .orient("left"); 58 | 59 | yAxis.ticks(d3.max(data, function (d) { 60 | return d.y + 1; 61 | })); 62 | 63 | var svg = d3.select("#graph").append("svg") 64 | .attr("width", width) 65 | .attr("height", height) 66 | 67 | var bar = svg.selectAll(".bar") 68 | .data(data) 69 | .enter() 70 | .append("g") 71 | .attr("class", "bar"); 72 | 73 | bar.append("rect") 74 | .attr("x", function (d) { 75 | return x(d.x) + padding - (barWidth / 2) 76 | }) 77 | .attr("y", height) 78 | .attr("width", barWidth) 79 | .transition() 80 | .delay(function (d, i) { 81 | return i * 50; 82 | }) 83 | .duration(500) 84 | .attr("height", function (d) { 85 | return height - 2 * padding - y(d.y); 86 | }) 87 | .attr("y", function (d) { 88 | return y(d.y) + padding 89 | }); 90 | 91 | bar.append("text") 92 | .attr("x", function (d) { 93 | return x(d.x) + padding 94 | }) 95 | .attr("y", function (d) { 96 | return y(d.y) + padding + 15 97 | }) 98 | .attr("text-anchor", "middle") 99 | .text(function (d) { 100 | return d.y 101 | }); 102 | 103 | svg.append("g") 104 | .attr("class", "x axis") 105 | .attr("transform", "translate(" + padding + "," + (height - padding) + ")") 106 | .call(xAxis) 107 | .append("text") 108 | .attr("class", "axisLabel") 109 | .attr("x", (width - 2 * padding) / 2) 110 | .attr("y", padding - 20) 111 | .style("text-anchor", "middle") 112 | .text("RSSI Values in dBm"); 113 | 114 | svg.append("g") 115 | .attr("class", "y axis") 116 | .attr("transform", "translate(" + padding + "," + padding + ")") 117 | .call(yAxis) 118 | .append("text") 119 | .attr("transform", "rotate(-90)") 120 | .attr("class", "axisLabel") 121 | .attr("y", 0 - padding + 20) 122 | .attr("x", 0 - (height / 2)) 123 | .text("Number of Beacon Packets"); 124 | 125 | } 126 | } 127 | 128 | -------------------------------------------------------------------------------- /Source/scripts/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Util contains functions of Javascript functions which are used in APP. 3 | * There are also other standalone utilities have been used which can be found under /utils/*.html 4 | * 5 | * @class utils 6 | */ 7 | app.utils = { 8 | /** 9 | It calculates statistics such as mean, variance, deviation of RSSI 10 | @method statisticsCalculator 11 | @param {Array} data An Array of RSSI values 12 | @return {Number, Array} Statistics 13 | **/ 14 | statisticsCalculator: function (a) { 15 | var r = {mean: 0, variance: 0, deviation: 0}, t = a.length; 16 | if(a.length == 0){ 17 | r.deviation = 'No Data' 18 | r.variance = 'No Data' 19 | r.deviation = 'No Data' 20 | return r.deviation,r; 21 | }else{ 22 | for (var m, s = 0, l = t; l--; s += a[l]); 23 | for (m = r.mean = s / t, l = t, s = 0; l--; s += Math.pow(a[l] - m, 2)); 24 | return r.deviation = Math.sqrt(r.variance = s / t), r; 25 | } 26 | }, 27 | 28 | dumpPlotData: function (data) { 29 | app.plotData.experiment = ''; 30 | app.plotData.x_axis = []; 31 | app.plotData.y_axis = []; 32 | app.plotData.mean = []; 33 | app.plotData.variance = []; 34 | app.plotData.rssi = []; 35 | app.plotData.repeat = []; 36 | 37 | $.each(data, function (key, val) { 38 | app.plotData.experiment = app.selectedCollection.name.replace(/_/g, ' ') 39 | app.plotData.x_axis.push(val.receiver_location.coordinate_x) 40 | app.plotData.y_axis.push(val.receiver_location.coordinate_y) 41 | 42 | var rawRSSI = []; 43 | $.each(val.raw_measurement, function (key, val) { 44 | if (val.sender_bssid == "64:70:02:3e:9f:63" && val.sender_id == "CREW") { 45 | rawRSSI.push(val.rssi) 46 | } 47 | // if (val.sender_bssid == "64:70:02:3e:aa:11" && val.sender_ssid == "CREW") { 48 | // rawRSSI.push(val.rssi) 49 | // } 50 | // if (val.sender_bssid == "64:70:02:3e:aa:d9" && val.sender_ssid == "CREW") { 51 | // rawRSSI.push(val.rssi) 52 | // } 53 | // if (val.sender_bssid == "64:70:02:3e:aa:ef" && val.sender_ssid == "CREW") { 54 | // rawRSSI.push(val.rssi) 55 | // } 56 | }); 57 | app.plotData.rssi.push(rawRSSI) 58 | 59 | var stat = app.utils.statisticsCalculator(rawRSSI); 60 | app.plotData.mean.push(d3.round(stat.mean, 2)) 61 | app.plotData.variance.push(d3.round(stat.variance, 2)) 62 | 63 | var mean = d3.round(stat.mean, 2) 64 | var variance = d3.round(stat.variance, 2) 65 | 66 | app.plotData.repeat.push({ 67 | 'x': val.receiver_location.coordinate_x, 68 | 'y': val.receiver_location.coordinate_y, 69 | 'room': val.receiver_location.room_label, 70 | 'rssi': rawRSSI, 71 | 'mean': mean, 72 | 'variance': variance 73 | }) 74 | 75 | app.plotData.repeat = _.sortBy(app.plotData.repeat, function (data) { 76 | return data.x; 77 | }); 78 | 79 | 80 | app.eventBus.publish("plot:data:retrieved") 81 | }); 82 | 83 | 84 | } 85 | } 86 | 87 | -------------------------------------------------------------------------------- /Source/utils/d3_graph.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 33 | 34 |
    35 | 36 | 153 | -------------------------------------------------------------------------------- /Source/utils/floor_mapper.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 17 | 18 | 175 | 176 | 177 | 178 | 179 | 180 |
    181 | 182 | 183 | 184 | 185 |
    186 |
    187 | 188 | 189 | 190 | -------------------------------------------------------------------------------- /Source/utils/rssi_scanner_in_js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    9 | 10 | -------------------------------------------------------------------------------- /Source/utils/rssi_scanner_in_js/index.js: -------------------------------------------------------------------------------- 1 | var str = ''; 2 | $(function(){ 3 | var ws = new WebSocket('ws://localhost:6587'); 4 | ws.onmessage = function (event) { 5 | str = '

    ' + event.data + '

    ' 6 | // $('#content').html(str); 7 | console.log(event.data) 8 | }; 9 | }) -------------------------------------------------------------------------------- /Source/utils/rssi_scanner_in_js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rssiScanner", 3 | "version": "0.0.1", 4 | "dependencies": { 5 | "shelljs": "~0.2.6", 6 | "ws": "~0.4.31" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Source/utils/rssi_scanner_in_js/server.js: -------------------------------------------------------------------------------- 1 | var shell = require('shelljs') 2 | var airport = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/' 3 | shell.cd(airport) 4 | 5 | 6 | var WebSocketServer = require('ws').Server 7 | , wss = new WebSocketServer({port: 6587}); 8 | 9 | console.log('Websocket is opened at 6587...'); 10 | 11 | wss.on('connection', function(ws) { 12 | 13 | setInterval(function(){ 14 | shell.exec('./airport -s', {async:true, silent:true}, function(code, output) { 15 | ws.send(output) 16 | }); 17 | },4000) 18 | 19 | }); 20 | 21 | --------------------------------------------------------------------------------