\documentclass[fleqn,11pt,aspectratio=1610]{beamer} \usepackage[english]{babel} \usepackage[utf8x]{inputenc} \usepackage{graphicx} \usepackage{tabularx} \usepackage{pgfgantt} % Schedule \usepackage{tikz} \usepackage{tikz-uml} \usepackage{booktabs} \usepackage{pdflscape} \usepackage{ifthen} \usepackage{subfig} \usepackage{bytefield} \usepackage[nolist,printonlyused]{acronym} \usetikzlibrary{positioning,fit,arrows,decorations.pathreplacing} \usetikzlibrary{shapes,shapes.misc,positioning,circuits.ee.IEC} \tikzstyle{system}=[shape=rounded rectangle,fill=tubsBlueLight20,text centered,draw] \tikzstyle{sensor}=[rectangle,fill=tubsOrangeLight20,text centered,draw] \tikzstyle{processor}=[rectangle,fill=tubsBlueLight20,text centered,draw] \tikzstyle{connector}=[rectangle,fill=tubsGreenLight20,text centered,draw] \tikzstyle{memory}=[rectangle,fill=tubsGreenLight20,text centered,draw] \tikzstyle{radio}=[rectangle,fill=tubsBlue20,text centered,draw] \tikzstyle{bus}=[<->,color=black,draw] \tikzstyle{buslabel}=[near end,color=black,font=\tiny,auto] \tikzstyle{vcc}=[->,color=tubsRed,font=\tiny,draw,text=black] \newcommand{\fitlab}{\emph{FIT IoT-LAB} } \usetheme[% blue, % secondary color (yellow/orange/blue/green/violet) dark, % brightness (light,medium,dark) tocinheader, % toc in header nosubsectionsinheader, % no subsections in header toc nexus, % corporate design font lnum, % NOTE: only available since tubslatex 1.01, % use "Versalziffern" instead of "Mediaevalziffern" ]{tubs} \title{Evaluating transient node failures with FIT IoT-Lab} \subtitle{Bachelor's Thesis} \author{Tim Schubert} \titlegraphic[scaled]{\includegraphics{../images/ibr_logos/title_iz_corner.jpg}} \logo{\includegraphics{../images/ibr_logos/ibr_en.pdf}} \begin{document} \begin{frame}[plain] \titlepage \end{frame} \section{Introduction} \subsection{RPL} \begin{frame}{RPL} \begin{columns} \column{.5\textwidth} \begin{itemize} \item <1-> WSN \begin{itemize} \item<2-> available energy limits network lifetime \item<3-> small overhead vs. quick recovery \end{itemize} \item<4-> RPL \begin{itemize} \item<5-> widespread use in applications \item<7-> DODAG \item<8-> DIS $\rightarrow$ DIO $\rightarrow$ DAO \item<11-> Trickle timer \item<12-> repair network $\rightarrow$ \textcolor{tubsRed}{increased energy usage} \end{itemize} \end{itemize} \column{.5\textwidth} \begin{figure} \centering \begin{tikzpicture}[node distance=30] \node[circle,fill=tubsLightGreen40] (s) {s}; \node[circle,fill=tubsLightBlue40,below of=s,left of=s] (r11) {}; \node[circle,fill=tubsLightBlue40,below of=s,right of=s] (r12) {}; \node[circle,fill=tubsLightBlue40,above of=s,left of=s] (r13) {}; \node[circle,fill=tubsLightBlue40,above of=s,right of=s] (r14) {}; \node[circle,fill=tubsLightBlue40,below of=s] (r15) {}; \node[circle,fill=tubsLightBlue40,above of=s] (r16) {}; \node[circle,fill=tubsLightBlue40,left of=s] (r17) {}; \node[circle,fill=tubsLightBlue40,right of=s] (r18) {}; \node[circle,fill=tubsLightBlue40,left of=r11] (r21) {}; \node[circle,fill=tubsLightBlue40,below of=r11] (r22) {}; \node[circle,fill=tubsLightBlue40,below of=r12] (r23) {}; \node[circle,fill=tubsLightBlue40,right of=r12] (r24) {}; \node[circle,fill=tubsLightBlue40,left of=r13] (r25) {}; \node[circle,fill=tubsLightBlue40,above of=r13] (r26) {}; \node[circle,fill=tubsLightBlue40,above of=r14] (r27) {}; \node[circle,fill=tubsLightBlue40,right of=r14] (r28) {}; \node[circle,fill=tubsLightBlue40,above of=r16] (r30) {}; \node[circle,fill=tubsLightBlue40,right of=r18] (r31) {}; \node[circle,fill=tubsLightBlue40,left of=r17] (r32) {}; \node[circle,fill=tubsLightBlue40,below of=r15] (r34) {}; \path<8->[draw,<-] (s) -- (r16); \path<8->[draw,<-] (s) -- (r18); \path<8->[draw,<-] (s) -- (r15); \path<8->[draw,<-] (s) -- (r17); \path<9->[draw,<-] (r16) -- (r13); \path<9->[draw,<-] (r16) -- (r30); \path<9->[draw,<-] (r18) -- (r14); \path<9->[draw,<-] (r18) -- (r28); \path<9->[draw,<-] (r18) -- (r31); \path<9->[draw,<-] (r18) -- (r12); \path<9->[draw,<-] (r15) -- (r22); \path<9->[draw,<-] (r15) -- (r11); \path<9->[draw,<-] (r17) -- (r32); \path<9->[draw,<-] (r17) -- (r21); \path<9->[draw,<-] (r17) -- (r25); \path<10->[draw,<-] (r12) -- (r24); \path<10->[draw,<-] (r12) -- (r23); \path<10->[draw,<-] (r30) -- (r27); \path<10->[draw,<-] (r30) -- (r26); \path<10->[draw,<-] (r22) -- (r34); \end{tikzpicture} \end{figure} \end{columns} \end{frame} \subsection{Transient Node Failures} \begin{frame}{Transient Node Failures} \begin{columns} \column{.5\textwidth} \begin{enumerate} \item <2-> hardware glitch or programming error \begin{itemize} \item \textcolor{tubsDarkGreen}{single node reset} \item \textcolor{tubsRed}{repeated node restarts} \end{itemize} \item <3-> detection by children (NUD / Layer 2 ACK) \begin{itemize} \item \textcolor{tubsDarkGreen}{early detection} \item \textcolor{tubsRed}{late detection $\rightarrow$ high packet loss} \end{itemize} \item <4-> Trickle timers reset, nodes select new parents (DIS + DIO) \begin{itemize} \item \textcolor{tubsDarkGreen}{resetting node selects parent before children} \item \textcolor{tubsRed}{child is selected as parent $\rightarrow$ DAO loop $\rightarrow$ repair DAG (rank)} \end{itemize} \item <5-> advertise destinations (DAO) \begin{itemize} \item \textcolor{tubsDarkGreen}{only resetting node must be advertised} \item \textcolor{tubsRed}{complete sub-DODAG must be advertised} \end{itemize} \end{enumerate} \column{.5\textwidth} \begin{figure} \tikzstyle{root} = [draw,circle,fill=tubsLightGreen40] \tikzstyle{parent} = [draw,circle,fill=tubsRed!20] \tikzstyle{child} = [draw,circle,fill=tubsLightBlue40] \centering \begin{tikzpicture}[node distance=30] \node[root] (r) {s}; \node[parent,below of=r] (p) {p}; \node[child,below of=p,left of=p] (c1) {1}; \node[child,below of=p,right of=p] (c2) {2}; \path<1>[->,draw] (p) -- (r); \path<1-2>[->,draw] (c1) -- node {} (p); \path<1-2>[->,draw] (c2) -- node {} (p); \path<2>[-,draw,color=tubsRed,line width=5pt] (p) -- (r); \path<3>[-,draw,color=tubsRed,line width=5pt] (c1) --(p); \path<3>[-,draw,color=tubsRed,line width=5pt] (c2) -- (p); \path<3->[->,draw] (p) -- (r); \path<4->[->,draw] (c1) -- (p); \path<4->[->,draw] (c2) -- (p); \end{tikzpicture} \end{figure} \centering \visible<6->{\textcolor{tubsDarkBlue}{we want fewer messages and quick recovery}} \end{columns} \end{frame} \subsection{Persistent Routing Information} \begin{frame}{Persistent Routing Information} \begin{columns} \column{.6\textwidth} \begin{itemize} \item<1-> implemented and evaluated using simulations by Silas Müller \item<2-> ported to \fitlab hardware \item<3-> store latest updates to RPL state (DIO) in persistent memory \item<4-> restore state / replay changes after restart \item<5-> \textcolor{tubsDarkGreen}{$\rightarrow$ quicker recovery with less (radio) overhead} \item<6-> extension: use clocks and UIDs to validate state \end{itemize} \column{.4\textwidth} \begin{figure} \begin{bytefield}{20} \wordbox[tlr]{1}{\small{Magic Byte}} \\ \wordbox[tlr]{1}{\small{Constant Parameters}} \\ \wordbox[tlr]{1}{\small{Neighbor Addresses \ldots}} \\ \wordbox[tlr]{1}{\small{Neighbor Count}} \\ \wordbox[tlr]{1}{\small{DIO Interval}} \\ \wordbox[tlr]{1}{\small{Neighbor Updates (DIO) \ldots}} \end{bytefield} \end{figure} \end{columns} \end{frame} \subsection{FIT IoT-LAB} \begin{frame}{FIT IoT-LAB} \begin{columns} \column{.6\textwidth} \begin{itemize} \item<1-> very large scale (> 2000 nodes) automated testbed for WSN applications by \emph{Inria} \item<2-> federates with other testlabs (\emph{OneLab}) \item<3-> API \begin{itemize} \item create experiments \item program nodes \item access results \end{itemize} \item<4-> Site Server \begin{itemize} \item collects and stores logs \item gateway to testlab nodes \end{itemize} \end{itemize} \column{.4\textwidth} \centering \includegraphics<1->[height=.4\textheight]{../images/lille_8032.png} \visible<3->{% \begin{figure} \centering \usetikzlibrary{fit} \scalebox{.5}{% \begin{tikzpicture} \node (U) at (0,0) [shape=circle,draw,fill=tubsLightGreen20] {User}; \node (A) at (3,0) [fill=tubsLightOrange20,shape=rounded rectangle,draw] {API}; \node (S) at (6,0) [fill=tubsLightOrange20,shape=rectangle,draw] {Site Server}; \path (U) edge [arrows=<->,auto,swap] node {REST} (A); \path (U) edge [arrows=<->,bend left] node [auto,swap] {SSH} (S); \path (A) edge [arrows=<->] (S); \node (n1) at (8.5,-1) [fill=tubsLightBlue20,shape=ellipse,draw] {Node}; \node (n2) at (8.5,0) [fill=tubsLightBlue20,shape=ellipse,draw] {Node}; \node (n3) at (8.5,1) [fill=tubsLightBlue20,shape=ellipse,draw] {Node}; \foreach \n in {n1,n2,n3} \path (\n) edge [arrows=<->,auto,swap] (S); \path (A) edge [arrows=<->] (S); \begin{pgfonlayer}{background} \node [label=above:Intranet,fill opacity=0.2,shape=rounded rectangle,fill=tubsLightViolet80,fit=(n1)(n2)(n3)(S)] {}; \node [label=below left:Internet,fill opacity=0.2,shape=rounded rectangle,fill=tubsLightBlue80,fit=(U)(A)(S)] {}; \end{pgfonlayer} \end{tikzpicture} } \end{figure} } \end{columns} \end{frame} \begin{frame}{M3 Open Sensor Node} \begin{columns} \column{.6\textwidth} \begin{itemize} \item <1-> ON \begin{itemize} \item CPU: STM32F103REY (32-bit, ARM Cortex-M3) \item Memory: N25Q128 (128MByte, external NOR-Flash) \item Radio: AT86RF231 (2.4 GHz, IEEE 802.15.4 support) \end{itemize} \item <2-> CN \begin{itemize} \item accesses sensors \item controls power supply \item flashes the node \end{itemize} \item <3-> GW \begin{itemize} \item forwards serial output to TCP socket \item provides remote debugger \end{itemize} \end{itemize} \column{.4\textwidth} \centering \resizebox{!}{.6\textheight}{% \begin{tikzpicture} \node[processor] (cpu)[minimum width=50,minimum height=50] {M3}; %STM32F103RKEY \node[memory] (flash) [below of=cpu,below=0.5] {Flash}; %N25Q128A \draw[bus,transform canvas={xshift=-10}] (flash) edge node[buslabel] {GPIO} (cpu); \draw[bus,transform canvas={xshift=10}] (flash) edge node[buslabel] {SPI} (cpu); \node[radio] (wireless) [right of=cpu,above of=cpu,right=0.4] {Radio}; %AT86RF231 \path[bus] (wireless.240) |- node[buslabel,above] {GPIO} (cpu.10); \path[bus] (wireless) |- node[buslabel] {SPI} (cpu); \node[system] (usbb) [above of=cpu,above=1] {USB Bridge}; \path[bus] (usbb) edge node[buslabel] {JTAG} (cpu); \path[bus,transform canvas={xshift= 20}] (usbb) edge node[buslabel] {UART} (cpu); \node[connector] (oc) [above of=usbb,above=1,minimum width=100] {Open Node Connector}; \path[bus] (usbb) edge node[buslabel]{USB} (oc) ; \path[bus] (oc.190) |- node[buslabel]{GPIO} (cpu.160) ; \node[connector] (usb) [right of=oc,below of=oc,right=0.5] {USB}; \path[bus] (oc) |- (usb); \node[processor] (pm) [below of=usb] {Power}; \node[sensor] (light) [minimum width=80,below left of=oc,left=1.5] {Light Sensor}; %ISL29020 \node[sensor] (pressure)[minimum width=80,below of=light] {Pressure Sensor}; %LPS331AP \node[sensor] (gyro) [minimum width=80,below of=pressure] {Gyroscope}; %L3G4200D \node[sensor] (magneto) [minimum width=80,below of=gyro] {Magnetometer}; %LSM303DLHC \path[bus] (oc.188) |- (light); \path[bus] (oc.188) |- (gyro); \path[bus] (oc.188) |- (magneto); \path[bus] (oc.188) |- (pressure); \path[bus] (oc.188) |- node[buslabel,below] {I2C} (cpu.190); \path[bus] (gyro) -| node[buslabel,below] {GPIO} (cpu.120); \path[bus] (magneto.10)-| (cpu.120); \path[vcc] (pm.210) |- node[below] {+3.3 V} (usbb); \path[vcc,orange,text=black] (pm) -- node[auto] {+3.3 V mon.} (wireless); \path[vcc] (usb) -- node[left] {+5} (pm); \path[vcc] (oc.340) |- node[near start,auto] {+3.3} (pm.165); \path[vcc,orange,text=black] (oc.330) |- node[near start,left] {+5} (pm.175); \path[vcc,orange,text=black] (pm) |- (1,1.8) -| (cpu.70); \path[vcc,orange,text=black] (pm) |- (1,1.8) -- (0.5,1.8); \node[rounded rectangle,right of=pm,right=0.1] (gnd) {GND}; \path[vcc,<->] (pm) -- (gnd); \end{tikzpicture} } \visible<2->{% \centering \resizebox{!}{.2\textheight}{% \begin{tikzpicture}[node/.style={circle,draw}] \begin{scope}[node distance=2cm] \node (a) {ON}; \node (b) [right=of a] {CN}; \node (c) [right=of b] {GW}; \end{scope} \begin{scope}[<->,>=stealth',auto] \path (a) edge[bend left] (b) (b) edge (c); \end{scope} \node[draw,dotted,fit=(b)(c)](group){}; \draw[line width=1pt,black,decorate,decoration={amplitude=7pt,brace,mirror}] (group.south west) -- (group.south east); \node[below=of group,anchor=center]{Host Node}; \end{tikzpicture} } } \end{columns} \end{frame} \section{Measurement Setup} \begin{frame}{Measurement Setup} \begin{columns} \column{.3\textwidth} \begin{enumerate} \item <1-> setup experiment using API \item <2-> collect results from shared server \item <3-> parse, aggregate and save results into database \item <4-> analyze and visualize results \end{enumerate} \column{.7\textwidth} \begin{figure} \centering \scalebox{.4}{% \begin{tikzpicture} \tikzumlset{fill component=tubsLightBlue20, fill port=tubsLightBlue40} \begin{umlcomponent}[x=-0.5,y=15,fill=white]{Testlab Node} \end{umlcomponent} \begin{umlcomponent}[x=3.5,y=15,fill=white]{Testlab Node} \end{umlcomponent} \begin{umlcomponent}[x=7.5,y=15,fill=white]{Testlab Node} \end{umlcomponent} \begin{umlcomponent}[x=-1,y=14,fill=white]{Testlab Node} \end{umlcomponent} \begin{umlcomponent}[x=3,y=14,fill=white]{Testlab Node} \end{umlcomponent} \begin{umlcomponent}[x=7,y=14,fill=white]{Testlab Node} \end{umlcomponent} \begin{umlcomponent}[y=1]{Testlab Node} \begin{umlcomponent}{Open Node} \umlbasiccomponent{UDP Sink / Source} \umlbasiccomponent[y=3]{Logger} \umlbasiccomponent[y=6]{Powertrace} \end{umlcomponent} \begin{umlcomponent}[x=6]{Host Node} \umlbasiccomponent{Consumption} \umlbasiccomponent[y=2.5]{RSSI} \umlbasiccomponent[y=5]{Event Log} \umlbasiccomponent[y=7.5]{Sniffer} \umlbasiccomponent[y=10]{Forwarded Serial} \end{umlcomponent} \end{umlcomponent} \begin{umlcomponent}[y=1,x=14.5]{Shared Server} \umlbasiccomponent[y=2.5]{Log files} \umlbasiccomponent[y=5]{Sniffer Aggregator} \umlbasiccomponent[y=7.5]{Serial Aggregator} \end{umlcomponent} \begin{umlcomponent}[y=1,x=20,fill=tubsLightGreen20]{Local Computer} \umlbasiccomponent[y=12]{Orchestration} \umlbasiccomponent[y=8]{Database} \umlbasiccomponent[y=4]{Analysis} \begin{umlcomponent}[y=0]{Presentation} \umlactor[scale=0.5]{User} \end{umlcomponent} \umlassemblyconnector[interface=Parser]{Database-north-port}{Orchestration-south-port} \umlassemblyconnector[interface=SQL]{Analysis-north-port}{Database-south-port} \umlassemblyconnector[interface=Python]{Presentation-north-port}{Analysis-south-port} \end{umlcomponent} \umlbasiccomponent[x=14.5,y=14,fill=tubsLightBlue20]{API Server} \umlassemblyconnector[interface=REST,with port]{Orchestration-west-port}{API Server} \umlassemblyconnector[interface=SSH,with port]{API Server-south-port}{Shared Server-north-port} \umlassemblyconnector[interface=SSH,with port]{Orchestration}{Shared Server} \umlassemblyconnector[interface=ON Con,with port]{Host Node}{Open Node} %\umlHVHassemblyconnector[interface=Configuration,with port]{API}{Host Node} \umlHVHassemblyconnector[with port,arm2=+2cm]{Log files}{Consumption} \umlassemblyconnector[interface=Log Collection,with port]{Log files}{RSSI} \umlHVHassemblyconnector[with port,arm2=+2cm]{Log files}{Event Log} \umlassemblyconnector[interface=TCP,with port]{Serial Aggregator}{Forwarded Serial} \umlassemblyconnector[interface=TCP,with port]{Sniffer Aggregator}{Sniffer} \end{tikzpicture} } \end{figure} \end{columns} \end{frame} \section{Evaluation} \subsection{Configurations} \begin{frame}{Configurations} \begin{columns} \column{.6\textwidth} \begin{itemize} \item<1-> 44 nodes, 50 runs \item<2-> phases \begin{itemize} \item N - default \emph{Contiki}-RPL \item H - \emph{Contiki}-RPL with restoring of persistent state \item HS - H + validation \item *R - single node reset at random time \item 60 s guard interval at beginning and end of phase \end{itemize} \item<3-> compare different phases \begin{itemize} \item same experiment with different firmware settings \item run different firmwares in close succession \item reconstruct beginning / end of each phase from log files \end{itemize} \end{itemize} \column{.4\textwidth} \begin{table}[h] \centering \footnotesize \begin{tabular}{r c c c} \toprule Test run & Hardened & Validity & Resets \\ \midrule N & & & \\ R & & & X \\ H & X & & \\ HR & X & & X \\ HS & X & X & \\ HSR & X & X & X \\ \end{tabular} \end{table} \end{columns} \end{frame} \begin{frame}{Route stability} \begin{figure} \centering \includegraphics[height=\textheight]{../images/routes.pdf} \end{figure} \end{frame} \subsection{Topology} \begin{frame}{Route changes} \begin{columns} \column{.5\textwidth} \begin{itemize} \item<1-> changes increase \textcolor{tubsRed}{energy consumption} \item<2-> restoring previous state causes additional (unwanted) changes \item<3-> still (!) H and HS reduce number of changes enough to get below R \item<4-> \textcolor{tubsDarkGreen}{$\rightarrow$ persistence reduces effect of reset on DAG} \end{itemize} \column{.5\textwidth} \begin{figure} \centering \includegraphics[width=\textwidth]{../images/stability.pdf} \end{figure} \end{columns} \end{frame} \begin{frame}{Convergence Time} \begin{columns} \column{.5\textwidth} \begin{itemize} \item<1-> time until last node has acquired a default route \item<2-> large error due to restoring state \item<3-> validation in HS saves some time \item<4-> setup process is similar to repair process (\textcolor{tubsRed}{recovery time}) \end{itemize} \column{.5\textwidth} \begin{figure} \centering \includegraphics[width=\textwidth]{../images/convergence.pdf} \end{figure} \end{columns} \end{frame} \subsection{Network Performance} \begin{frame}{End-to-End} \begin{columns} \column{.5\textwidth} \begin{itemize} \item<1-> single trip from source to sink (root) \item<2-> delay: no significant difference \item<3-> loss \begin{itemize} \item<4-> HS[R] takes longer to recover \item<5-> HS[R] less affected by resets \end{itemize} \end{itemize} \column{.5\textwidth} \begin{figure} \includegraphics<1>[width=\textwidth]{../images/performance-delay.pdf} \includegraphics<3->[width=\textwidth]{../images/performance-loss.pdf} \end{figure} \end{columns} \end{frame} \begin{frame}{Message Overhead} \begin{columns} \column{.5\textwidth} \begin{itemize} \item<1-> large part of \textcolor{tubsRed}{energy consumption} \item<2-> default implementation creates the fewest messages \begin{itemize} \item old state was restored, then invalidated \end{itemize} \item<3-> HS most messages and largest error \begin{itemize} \item validation of restored state \end{itemize} \item<5-> \textcolor{tubsDarkGreen}{restore state $\rightarrow$ reduces overhead from reset} \end{itemize} \column{.5\textwidth} \begin{figure} \centering \includegraphics[width=\textwidth]{../images/performance-overhead.pdf} \end{figure} \end{columns} \end{frame} \subsection{Energy Consumption} \begin{frame}{Energy Consumption} \begin{columns} \column{.5\textwidth} \begin{itemize} \item<1-> N, H, HS \begin{itemize} \item default implementation consumes less energy (old state is restored) \end{itemize} \item<2-> *R \begin{itemize} \item small improvement over default implementation \item validation consumes more energy than it saves \end{itemize} \item<3-> measurement error between phases \begin{itemize} \item see measurement series for individual nodes \item unrelated to single node restart \item $\rightarrow$ issue with HN? \end{itemize} \end{itemize} \column{.5\textwidth} \begin{figure} \centering \includegraphics[width=\textwidth]{../images/consumption-phases.pdf} \end{figure} \end{columns} \end{frame} \section{Demo} \begin{frame}{Demo} \end{frame} \section{Conclusion} \begin{frame}{Conclusion} \begin{itemize} \item<1-> analyze effect of transient node failures \item<2-> automated deployment, collection, analysis, visualisation \item<3-> ported hardened RPL version to \fitlab hardware \item<4-> unwanted repairs after intentional restarts \begin{itemize} \item how to tell node that restart was intentional? \end{itemize} \item<5-> persistence improves \begin{itemize} \item number of changes \item consumption \item overhead \end{itemize} \item<6-> additional validation \begin{itemize} \item no practical advantage \item consumes more energy \item slower recovery \end{itemize} \end{itemize} \end{frame} %\bibliographystyle{abbrv} %\bibliography{../bibliography} \begin{frame}{Consumption} \begin{table} \centering \begin{tabular}{lp{140pt}} \toprule Component & Current Consumption (3.3 V) \\ \midrule CPU & 70 mA \\ Radio & SLEEP 20 $\mu$A \newline OFF 0.4 mA \newline RX 10.3 mA \newline TX 10 mA\\ Flash & 20 mA \end{tabular} \label{tab:consum} \end{table} \end{frame} \tikzstyle{cnode}=[circle,fill=tubsLightOrange100,text centered,font=\tiny,fill opacity=0.5,draw opacity=0.5,text opacity=1.0] \tikzstyle{snode}=[circle,fill=tubsGray20,text centered,font=\tiny,fill opacity=0.2,draw opacity=0.2,text opacity=1.0] \tikzstyle{pnode}=[circle split,draw,text centered,fill=tubsLightOrange20,draw opacity=0.1,text opacity=1.0,fill opacity=0.1,font=\tiny] %TODO latex number vs strings wtf \newcommand{\fitnode}[3]{% \ifthenelse {#3 = 47 \OR #3 = 49 \OR #3 = 51 \OR #3 = 53 \OR #3 = 57 \OR #3 = 59 \OR #3 = 83 \OR #3 = 85 \OR #3 = 87 \OR #3 = 89 \OR #3 = 91 \OR #3 = 93 \OR #3 = 95 \OR #3 = 123 \OR #3 = 127 \OR #3 = 131 \OR #3 = 133 \OR #3 = 151 \OR #3 = 153 \OR #3 = 155 \OR #3 = 157 \OR #3 = 159 \OR #3 = 161 \OR #3 = 192 \OR #3 = 194 \OR #3 = 196 \OR #3 = 198 \OR #3 = 200 \OR #3 = 202 \OR #3 = 204 \OR #3 = 218 \OR #3 = 220 \OR #3 = 222 \OR #3 = 224 \OR #3 = 226 \OR #3 = 228 \OR #3 = 230 \OR #3 = 244 \OR #3 = 246 \OR #3 = 248 \OR #3 = 250 \OR #3 = 252 \OR #3 = 254 \OR #3 = 256}%\isin{47}{ \OR #3 = 47 \OR #3 = 49 \OR #3 = 51 \OR #3 = 53 \OR #3 = 57 \OR #3 = 59 \OR #3 = 83 \OR #3 = 85 \OR #3 = 87 \OR #3 = 89 \OR #3 = 91 \OR #3 = 93 \OR #3 = 95 \OR #3 = 123 \OR #3 = 127 \OR #3 = 131 \OR #3 = 133 \OR #3 = 151 \OR #3 = 153 \OR #3 = 155 \OR #3 = 157 \OR #3 = 159 \OR #3 = 161 \OR #3 = 192 \OR #3 = 194 \OR #3 = 196 \OR #3 = 198 \OR #3 = 200 \OR #3 = 202 \OR #3 = 204 \OR #3 = 218 \OR #3 = 220 \OR #3 = 222 \OR #3 = 224 \OR #3 = 226 \OR #3 = 228 \OR #3 = 230 \OR #3 = 244 \OR #3 = 246 \OR #3 = 248 \OR #3 = 250 \OR #3 = 252 \OR #3 = 254 \OR #3 = 256}} {\node at (#1,#2) [cnode] {#3};} {\node at (#1,#2) [snode] {#3};} } \begin{frame}{Topology} \begin{figure} \centering \usetikzlibrary{shapes} \resizebox{!}{.9\textheight}{% \begin{tikzpicture} \draw [black!20] (-0.3,13) -- (7.5,13) -- (7.5,4.8) -- (8.7,4.8) -- (8.7,0.8) -- (4.2,0.8) -- (4.2,-0.6) -- (-0.3,-0.6) -- cycle; \draw [tubsBlack!20] (8.7,13) -- (13.2,13) -- (13.2,-0.6) -- (8.7,-0.6) -- cycle; \fill [tubsLightGreen] (4.7,12.4) rectangle (5.3,12.9); \fill [tubsBlack!20] (-0.3,9.2) rectangle (-0.2,11.9); \fill [tubsBlack!20] (-0.3,0.2) rectangle (-0.2,2.6); \fill [tubsBlack!20] (0,13) rectangle (2.2,13.1); \draw [tubsBlack!20] (-0.4,3.95) rectangle (-0.3,4.1); \draw [tubsBlack!20] (-0.4,7.95) rectangle (-0.3,8.10); \draw [tubsBlack!20] (4.05,3.75) rectangle (4.2,3.9); \draw [tubsBlack!20] (4.05,8.05) rectangle (4.2,8.2); \draw [tubsBlack!20] (7.40,8.05) rectangle (7.55,8.2); \draw [tubsBlack!20] (8.65,3.75) rectangle (8.80,3.9); \foreach \x in {0,1,...,4} { \foreach \y in {0,1,...,12} { \pgfmathparse{int(29+\x*18+(12-\y))} \edef\p{\pgfmathresult} \fitnode{\x}{\y}{\p} } } \foreach \x in {0,1,...,2} { \foreach \y in {1,2,...,12} { \pgfmathparse{int(123+\x*14+(12-\y))} \edef\p{\pgfmathresult} \fitnode{\x+5}{\y}{\p} } } \foreach \y in {1,2,...,7} { \pgfmathparse{int(190-\y)} \edef\p{\pgfmathresult} \fitnode{8}{\y}{\p} } \foreach \y in {9,10,...,12} { \pgfmathparse{int(191-\y)} \edef\p{\pgfmathresult} \fitnode{8}{\y}{\p} } \foreach \x in {0,1,...,4} { \foreach \y in {0,1,...,12} { \pgfmathparse{int(256-(4-\x)*13-\y)} \edef\p{\pgfmathresult} \fitnode{\x+9}{\y}{\p} } } \foreach \y in {0,2,...,24} { \pgfmathparse{int(25-\y)} \edef\p{\pgfmathresult} \pgfmathparse{int(\p+1)} \edef\q{\pgfmathresult} \node at (-0.3,\y/2) [pnode] {\p \nodepart{lower} \q}; } \node at (0,13) [pnode] {27 \nodepart{lower} 28}; \node at (1,13) [pnode] {45 \nodepart{lower} 46}; \node at (2,13) [pnode] {63 \nodepart{lower} 64}; \node at (3,13) [pnode] {81 \nodepart{lower} 82}; \node at (4,13) [pnode] {99 \nodepart{lower} 100}; \node at (0,-1) [pnode] {42,43 \nodepart{lower} 44}; \node at (1,-1) [pnode] {60,61 \nodepart{lower} 62}; \node at (2,-1) [pnode] {78,79 \nodepart{lower} 80}; \node at (3,-1) [pnode] {96,97 \nodepart{lower} 98}; \node at (4,-1) [pnode] {114,115 \nodepart{lower} 116}; \node at (4.3,0.8) [pnode] {\nodepart{lower} 121,122}; \node at (5,0.8) [pnode] {\nodepart{lower} 135,136}; \node at (6,0.8) [pnode] {\nodepart{lower} 149,150}; \node at (7,0.8) [pnode] {\nodepart{lower} 163,164}; \node at (8,0.8) [pnode] {\nodepart{lower} 190,191}; \foreach \y in {0,2,4,6,8} { \pgfmathparse{int(177-\y)} \edef\p{\pgfmathresult} \pgfmathparse{int(\p+1)} \edef\q{\pgfmathresult} \node at (7.5,\y/2+5) [pnode] {\p \nodepart{lower} \q}; } \foreach \y in {12,14} { \pgfmathparse{int(179-\y)} \edef\p{\pgfmathresult} \pgfmathparse{int(\p+1)} \edef\q{\pgfmathresult} \node at (7.5,\y/2+5) [pnode] {\p \nodepart{lower} \q}; } \node at (4.2,3.9) [pnode] {\nodepart{lower} 119,120}; \node at (4.2,8.1) [pnode] {117,118}; \end{tikzpicture} } \end{figure} \end{frame} \begin{frame}{Measured Variables} \begin{table}[h] \centering \begin{tabular}{ll} \toprule Variable & Source \\ \midrule Network latency & PCAP, serial output \\ Delivery ratio & PCAP, serial output \\ Message overhead & PCAP, serial output \\ Number of DIO, DAO & PCAP, serial output \\ DODAG state & serial output \\ Routing table & serial output \\ Node reset times & HN event log \\ RSSI & HN radio receiver \\ Energy consumption & HN power monitor \\ \end{tabular} \end{table} \end{frame} \begin{frame}{Consumption by Position} \begin{figure} \centering \includegraphics[height=.9\textheight]{../images/consumption-nodes.pdf} \end{figure} \end{frame} \begin{frame}{Consumption of (node 200, exp-id 107077)} \centering \includegraphics[height=\textheight]{../images/200-consum.png} \end{frame} \begin{frame}{DODAG example} \centering \includegraphics[width=\textwidth]{../images/dag.pdf} \end{frame} \end{document}