45fbf011263ff335f7e3f182c2eafbc5d5537ea2
[skm-ma-ws1314.git] / presentation.tex
1 \documentclass{beamer}
2 \usepackage[utf8]{inputenc}
3 \usepackage[english]{babel}
4 \usepackage{todonotes}
5 \usepackage{inconsolata}
6 %\usepackage{multicol}
7 \usepackage{array}
8 \usepackage{cclicenses}
9 \usepackage{tikz}
10 \usetikzlibrary{arrows}
11 \usetikzlibrary{arrows}
12 \usetikzlibrary{positioning}
13 \usetikzlibrary{shapes.symbols}
14 %\usepackage[usenames,dvipsnames]{color}
15
16 %\presetkeys{todonotes}{inline}{}
17 \newcommand{\code}[1]{\texttt{#1}}
18 \definecolor{green}{RGB}{137,164,0} % from tubslatex
19
20 \title{Chatty Things}
21 \subtitle{Making the Internet of Things Readily Usable for the Masses with XMPP}
22 \author{Roland Hieber}
23 \institute[IBR, TU BS]{Institute of Operating Systems and Computer Networks, TU
24 Braunschweig}
25 \date[SKM-13/14]{Seminar Communications and Multimedia, WS 2013/14}
26
27 \begin{document}
28
29 \begin{frame}[plain]
30 \maketitle
31 \end{frame}
32
33 \begin{frame}{Contents}
34 \tableofcontents
35 \end{frame}
36
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 \section{Motivation}
39 \begin{frame}{Motivation}
40 \begin{block}{The IoT Vision}
41 \begin{itemize}
42 \item plentitude of smart objects
43 \item interoperability between devices
44 \item easy accessibility for users
45 \end{itemize}
46 \end{block}
47 \end{frame}
48
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 \begin{frame}<1>[label=subgoals]{Motivation: Subgoals}
51 \begin{block}{But how do we\ldots}
52 \begin{itemize}
53 \item configure our devices?
54 \begin{itemize}
55 \invisible<1-1>{\item[\color{green}\checkmark]\color{green}
56 Link-Local Addressing, Stateless Address Autoconfiguration}
57 \end{itemize}
58 \item find other nodes to talk to?
59 \begin{itemize}
60 \invisible<1-2>{\item[\color{green}\checkmark]\color{green}
61 DNS-SD + mDNS}
62 \end{itemize}
63 \item talk to other nodes or users?
64 \begin{itemize}
65 \invisible<1-3>{\item[\color{green}\checkmark]\color{green} XMPP
66 Serverless Messaging}
67 \end{itemize}
68 \item filter relevant information?
69 \begin{itemize}
70 \invisible<1-4>{\item[\color{green}\checkmark]\color{green} ``Traffic
71 Lights'', Temporary Subscription for Presence}
72 \end{itemize}
73 \end{itemize}
74 \end{block}
75 \end{frame}
76
77 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
78 \section{Technologies for Distributed Networking}
79 \begin{frame}{Address Allocation}
80 IPv4 Link-Local Addessing (``APIPA'', ``Zeroconf'', RFC 3927)
81 \begin{itemize}
82 \item subnet \code{169.254.0.0/16}
83 \end{itemize}
84 IPv6 Stateless Address Autoconfiguration (RFC 4862)
85 \begin{itemize}
86 \item subnet \code{fe80::/64} (link-local)
87 \item subnet \code{fc00::/11} (unique-local, if configured)
88 \item or global address (if configured)
89 \end{itemize}
90
91 \begin{block}{Algorithm}
92 \begin{enumerate}
93 \item choose (random) IP address in subnet
94 \item ask if anyone uses that address
95 \item if not, we're fine
96 \item else, retry
97 \end{enumerate}
98 \end{block}
99 \end{frame}
100
101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
102 \againframe<2>{subgoals}
103
104 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
105 \begin{frame}{Multicast DNS (RFC 6762)}
106 \begin{itemize}
107 \item distributed DNS database
108 \item uses multicast address \code{224.0.0.251} (IPv4) and \code{ff02::fb}
109 (IPv6), UDP port 5353
110 \item standard DNS packet format
111 \item hosts announce their own resources
112 \item hosts respond to queries if queried resource is known
113 \end{itemize}
114 \end{frame}
115
116 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
117 \begin{frame}{DNS-Based Service Discovery (RFC 6763)}
118 Two-step process:
119 \begin{enumerate}
120 \item Service Instance Enumeration
121 \begin{itemize}
122 \item query PTR records of form \code{\_service.\_proto.domain}
123 \item results: instance names of form \code{name.\_service.\_proto.domain}
124 \end{itemize}
125 \item Service Instance Resolution
126 \begin{itemize}
127 \item query instance names as SRV records
128 \item result gives host name, port, priority, weight
129 \end{itemize}
130 \end{enumerate}
131 \end{frame}
132
133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
134 \begin{frame}[fragile]{Example: mDNS + DNS-SD}
135 \tikzset{font=\fontsize{7.5pt}{1em}\selectfont, >=latex, thick, y=3.5em}
136 %\tikzstyle{iconlabel}=[text width=2cm, align=center,
137 %font=\fontsize{7.5pt}{1em}\selectfont]
138 \tikzstyle{label}=[font=\fontsize{7pt}{1em}\selectfont]
139 \tikzstyle{pkt}=[font=\fontsize{6pt}{0.7em}\selectfont,
140 draw,fill=white,dash pattern=on 2pt off 2pt, align=center,
141 inner sep=2pt]
142 \def\xhalf{.45\textwidth}
143 \def\nodeskip{2.2em}
144 \begin{enumerate}
145 \item Service Instance Enumeration
146 \begin{tikzpicture}
147 \node[cloud,draw,fill=gray!20,aspect=2] (thecloud) at (0,0) {multicast};
148 \def\nodelist{
149 node/{(-\xhalf,0)}/{},
150 juliet/{(\xhalf,0)}/juliet,
151 romeo/{(\xhalf,-1)}/romeo,
152 mercutio/{(\xhalf,1)}/mercutio%
153 }
154 \foreach \name/\pos/\text in \nodelist {
155 \node (\name) at \pos { \includegraphics[width=3em]{icon-computer.pdf} };
156 \node[below=\nodeskip of \name.north,label] (\name text) { \text };
157 }
158 \draw[->] (node) -- (thecloud) node[pkt,pos=0.5]{
159 \verb+_presence._tcp.local+\\PTR? };
160 \draw[->] (juliet) -- (thecloud) node[pkt,pos=0.4]{
161 \verb+juliet._presence.+\\\verb+_tcp.local+ };
162 \draw[->] (romeo) -- (thecloud) node[pkt,pos=0.4]{
163 \verb+romeo._presence.+\\\verb+_tcp.local+ };
164 \draw[->] (mercutio) -- (thecloud) node[pkt,pos=0.4]{
165 \verb+mercutio._presence.+\\\verb+_tcp.local+ };
166 \end{tikzpicture}
167
168 \item Service Instance Resolution
169 \begin{tikzpicture}
170 \node[cloud,draw,fill=gray!20,aspect=2] (thecloud) at (0,0) {multicast};
171 \node (node) at (-\xhalf,0) { \includegraphics[width=3em]{icon-computer.pdf} };
172 \node (juliet) at (\xhalf,0) { \includegraphics[width=3em]{icon-computer.pdf} };
173 \node[below=\nodeskip of juliet.north,label] (juliet text) { juliet };
174 \draw[->] (node) -- (thecloud) node[pkt,pos=0.5]{
175 \verb+juliet._presence._tcp.local+\\SRV? };
176 \draw[->] (juliet) -- (thecloud) node[pkt,pos=0.5]{
177 \verb+juliet.local, port 5222,+\\\verb+prio 0, weight 0+ };
178 \end{tikzpicture}
179 \end{enumerate}
180 \end{frame}
181
182 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
183 \againframe<3>{subgoals}
184
185 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
186 \begin{frame}{XMPP (RFC 6122)}
187 \begin{columns}[c]
188 \column{.55\textwidth}
189 \begin{onlyenv}<1>
190 \begin{block}{Extensible Messaging and Presence Protocol}
191 \begin{itemize}
192 \item XML-based
193 \item Federated architecture
194 \begin{itemize}
195 \item modeled after E-Mail
196 \end{itemize}
197 \item publish-subscribe mechanism
198 \item XMPP Extension Protocols (XEPs), e.\,g.
199 \begin{itemize}
200 \item Multi-User Chats % (XEP-0045)
201 \item Serverless Messaging %(XEP-0174)
202 \item recently, also XEPs for the IoT %(XEP-0323 through -0326)
203 \end{itemize}
204 \end{itemize}
205 \end{block}
206 \end{onlyenv}
207 \begin{onlyenv}<2>
208 \begin{block}{Serverless XMPP (XEP-0174)}
209 \begin{itemize}
210 \item Clients communicate directly, no server needed
211 \item service discovery via mDNS/DNS-SD
212 \end{itemize}
213 \end{block}
214 \end{onlyenv}
215
216 \column{.45\textwidth}
217 \tikzset{node distance=0pt, >=stealth, thick, x=3.5em, y=2.8em}
218 \tikzstyle{iconlabel}=[text width=2.5cm, align=center,
219 font=\fontsize{7.5pt}{1em}\selectfont]
220 \tikzstyle{label}=[font=\fontsize{7pt}{1em}\selectfont]
221 \begin{overprint}
222 \begin{figure}
223 \begin{tikzpicture}[remember picture]
224 \input{fig-xmpparch.tex}
225 \end{tikzpicture}
226 \end{figure}
227 \tikz[remember picture,overlay]
228 \draw<2>[<->,dotted] (juliet) -- node[anchor=south,label]{serverless} (romeo);
229 \end{overprint}
230 \end{columns}
231 \end{frame}
232
233 \begin{frame}{XMPP (RFC 6122)}
234 \begin{block}{XEPs for the Internet of Things}
235 \begin{itemize}
236 \item XEP-0323 Sensor Data
237 \begin{itemize}
238 \item format for sensor data, query modes
239 \end{itemize}
240 \item XEP-0324 Provisioning
241 \begin{itemize}
242 \item defining access rights and user privileges
243 \end{itemize}
244 \item XEP-0325 Control
245 \begin{itemize}
246 \item get/set control prameters on a (group of) sensor node(s)
247 \end{itemize}
248 \item XEP-0326 Concentrators
249 \begin{itemize}
250 \item implement proxies for a subnet of the WSN
251 \end{itemize}
252 \end{itemize}
253 \end{block}
254 \end{frame}
255
256 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
257 \againframe<4>{subgoals}
258
259 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
260 \section{Chatty Things}
261 \begin{frame}{Chatty Things}
262 \begin{itemize}
263 \item use serverless XMPP + mDNS + DNS-SD for communication
264 \item interaction using a standard XMPP client
265 \item prevent information overflow
266 \begin{itemize}
267 \item ``Traffic lights'': status icon in roster represents threshold value
268 \item \emph{Temporary Subscription for Presence (TSP)}
269 \end{itemize}
270 %\item working prototype for Contiki on MSP430
271 \end{itemize}
272 \begin{block}{Prototype}
273 \begin{itemize}
274 \item \emph{uBonjour} for mDNS + DNS-SD
275 \item \emph{uXMPP} for XMPP
276 \item 12~kB of ROM, 0.6 kB of RAM with Contiki on MSP-430
277 \end{itemize}
278 \end{block}
279 \end{frame}
280
281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
282 \begin{frame}{Temporary Subscription for Presence}
283 \begin{block}{Problem}
284 \begin{itemize}
285 \item node must manually subscribe to get information
286 \item users can move quickly out of the network
287 \item subscriptions become outdated
288 \item renewing/canceling subscriptions needs bandwidth
289 \item data publishers also get updates
290 \end{itemize}
291 \end{block}
292 \end{frame}
293
294 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
295 \begin{frame}{Temporary Subscription for Presence}
296 \begin{block}{Solution: Multi-User Chats}
297 \begin{itemize}
298 \item create one chat room per topic
299 \item users subscribe to information by entering the chat room
300 \item server only sends information to nodes who want it
301 \begin{itemize}
302 \item Chatty Things send a flag that they're uninterested
303 \end{itemize}
304 \end{itemize}
305 \end{block}
306 \begin{block}{Drawbacks}
307 \begin{itemize}
308 \item only works with central XMPP server
309 \begin{itemize}
310 \item XEP-0045 is not (yet) specified for serverless XMPP
311 \end{itemize}
312 \item XMPP server needs to handle TSP
313 \end{itemize}
314 \end{block}
315 \end{frame}
316
317 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
318 \begin{frame}{Bootstrapping}
319 \begin{block}{At Boot}
320 \begin{enumerate}
321 \item activate uBonjour
322 \item try to discover a central XMPP server
323 \begin{itemize}
324 \item DNS-SD: \code{\_xmpp-client.\_tcp.local}
325 \end{itemize}
326 \item if an XMPP server is discovered: \emph{Infrastructure mode}
327 \begin{itemize}
328 \item connect with ANONYMOUS login (XEP-0175)
329 \item join topic-based chats
330 \item deactivate uBonjour
331 \end{itemize}
332 \item if no server is found: \emph{Ad hoc mode}
333 \begin{itemize}
334 \item activate serverless messaging
335 \end{itemize}
336 \end{enumerate}
337 \end{block}
338 \end{frame}
339 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
340 \begin{frame}{Bootstrapping}
341 \begin{block}{During Runtime}
342 \begin{itemize}
343 \item if server is lost, change to Ad hoc mode
344 \item if new server is found in Ad hod mode, try changing to Infrastructure
345 mode
346 \begin{itemize}
347 \item if that fails, stay in Ad hoc mode
348 \end{itemize}
349 \end{itemize}
350 \end{block}
351 \end{frame}
352
353 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
354 \againframe<5>{subgoals}
355
356 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
357 \section{Related Approaches}
358 \begin{frame}{Related Approaches}
359 \begin{overprint}
360 \onslide<1>
361 \begin{block}{Chatty Things}
362 \end{block}
363 \onslide<2>
364 \begin{block}{Constrained Application Protocol (CoAP)}
365 \begin{itemize}
366 \item binary mapping to HTTP
367 \item UDP with confirmation and congestion control
368 \end{itemize}
369 \end{block}
370 \onslide<3>
371 \begin{block}{MQ Telemetry Transport (MQTT)}
372 \begin{itemize}
373 \item binary, only 2-byte header
374 \item focused on M2M communication
375 \end{itemize}
376 \end{block}
377 \onslide<4>
378 \begin{block}{Web Service for Devices (WS4D)}
379 \begin{itemize}
380 \item SOAP (XML-based) over HTTP
381 \end{itemize}
382 \end{block}
383 \end{overprint}
384 \begin{table}
385 \small\centering
386 \begin{tabular}{|>{\onslide<1->}l||>{\onslide<1->}l|>{\onslide<2->}l|
387 >{\onslide<3->}l|>{\onslide<4->}l<{\onslide}|}
388 \hline
389 Feature & Chatty Things & CoAP & MQTT & WS4D \\
390 \hline\hline
391 application gateways & - & yes & yes & - \\ \hline
392 usable with standard clients & yes & - & - & (yes) \\ \hline
393 discovery support & yes & yes & - & yes\\ \hline
394 IPv6/6LoWPAN ready & yes & yes & ? & partial \\ \hline
395 asynchronous messages & yes & yes & ? & ? \\ \hline
396 protocol overhead & moderate & low & low & high \\ \hline
397 \end{tabular}
398 \end{table}
399 \end{frame}
400
401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
402 \section{Conclusion}
403 \begin{frame}{Conclusion}
404 \begin{block}{Advantages of Chatty Things}
405 \begin{itemize}
406 \item no need for central infrastructure
407 \item self-configuration and auto-discovery
408 \item interaction over standard chat clients
409 \item protocol flexibility for enhancements
410 \end{itemize}
411 \end{block}
412 \begin{block}{Disadvantages of Chatty Things}
413 \begin{itemize}
414 \item XMPP introduces some complexity
415 \item topic filtering only possible with central server
416 \end{itemize}
417 \end{block}
418 \end{frame}
419
420 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
421 \begin{frame}
422 \begin{center}
423 \vfill
424 \LARGE{Questions?}
425 \vfill
426 \vfill
427 \footnotesize
428 \cc\byncsa\\
429 This presentation is licensed under CC-BY-NC-SA-3.0\\
430 and builds on icons from the Tango Desktop Project
431 \end{center}
432 \end{frame}
433
434 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
435 \section*{Example}
436 \def\bot{-7.5}
437 \def\nearlybot{-7}
438 \def\top{0}
439 \def\nearlytop{-0.5}
440 \def\dev{-5}
441 \def\cli{5}
442 \newlength{\ypos}
443 \newlength{\yypos}
444 \newcommand{\advanceby}[1]{%
445 \addtolength{\ypos}{#1}%
446 \addtolength{\yypos}{#1}%
447 \global\ypos=\ypos% // see https://tex.stackexchange.com/questions/119730
448 \global\yypos=\yypos%
449 }
450 \tikzstyle{pkt}=[
451 fill,
452 below=-.5\baselineskip,
453 font=\scriptsize,
454 draw,
455 dash pattern=on 2pt off 2pt,
456 ]
457 \tikzstyle{clipkt}=[pkt,
458 below left=-.5\baselineskip and 0cm,
459 pos=0.05,
460 ]
461 \tikzstyle{devpkt}=[pkt,
462 below right=-.5\baselineskip and 0cm,
463 pos=0.05,
464 ]
465 %%%%%%%%%
466 \begin{frame}[fragile,plain,t]{Example: Sensor Data}
467 \begin{tikzpicture}[
468 every node/.style={fill=white, font=\small},
469 every picture/.style=ultra thin,
470 >=latex,
471 semithick
472 ]
473 \setlength{\ypos}{0cm}
474 \setlength{\yypos}{.5cm}
475 %% Header
476 \draw (\cli,\top) node[draw]{Client} -- (\cli,\nearlybot);
477 \draw[dashed] (\cli,\nearlybot) -- (\cli,\bot);
478 \draw (\dev,\top) node[draw]{Device} -- (\dev,\nearlybot);
479 \draw[dashed] (\dev,\nearlybot) -- (\dev,\bot);
480
481 \advanceby{.75cm}
482 \draw[->] (\cli,-\ypos) -- (\dev,-\yypos) node[clipkt]{\verb+<stream>+};
483 \advanceby{1cm}
484 \draw[->] (\dev,-\ypos) -- (\cli,-\yypos) node[devpkt]{\verb+<stream>+};
485
486 \advanceby{1cm}
487 \draw[->] (\cli,-\ypos) -- (\dev,-\yypos) node[clipkt,align=left]{
488 \verb+<iq type='get' id='1'+\\
489 \verb+ to='dev@device.local/res'+\\
490 \verb+ from='client@client.local'>+\\
491 \verb+ <req xmlns='urn:xmpp:sn' seqnr='1'+\\
492 \verb+ momentary='true'>+\\
493 \verb+ <node nodeId='Device04'/>+\\
494 \verb+ <field name='+{\color{red}\code{Energy}}\verb+'/>+\\
495 \verb+ <field name='+{\color{blue}\code{Power}}\verb+'/>+\\
496 \verb+ </req> </iq>+
497 %\end{verbatim}
498 \advanceby{9\baselineskip}
499 };
500
501 \advanceby{0.3cm}
502 \draw[->] (\dev,-\ypos) -- (\cli,-\yypos) node[devpkt,align=left]{
503 \verb+<iq type='result' id='1'+\\
504 \verb+ from='dev@device.local'+\\
505 \verb+ to='client@client.local/res'>+\\
506 \verb+ <accepted xmlns='urn:xmpp:sn' seqnr='1'/>+\\
507 \verb+</iq>+
508 \advanceby{4\baselineskip}
509 };
510 \end{tikzpicture}
511 \end{frame}
512
513 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
514 \begin{frame}[fragile,plain,t]{Example: Sensor Data (cont.)}
515 \begin{tikzpicture}[
516 every node/.style={fill=white, font=\small},
517 every picture/.style=ultra thin,
518 >=latex,
519 semithick
520 ]
521 \setlength{\ypos}{0cm}
522 \setlength{\yypos}{.5cm}
523 %% Header
524 \draw[dashed] (\cli,\top) node[draw]{Client} -- (\cli,\nearlytop);
525 \draw (\cli,\nearlytop) -- (\cli,\bot);
526 \draw[dashed] (\dev,\top) node[draw]{Device} -- (\dev,\nearlytop);
527 \draw (\dev,\nearlytop) -- (\dev,\bot);
528
529 \advanceby{.75cm}
530 %\advanceby{1cm}
531 \draw[->] (\dev,-\ypos) -- (\cli,-\yypos) node[devpkt,align=left]{
532 \verb+<message from='dev@device.local'+\\
533 \verb+ to='client@client.local/res'>+\\
534 \verb+ <fields xmlns='urn:xmpp:sn' seqnr='1' done='true'>+\\
535 \verb+ <node nodeId='Device04'>+\\
536 \verb+ <timestamp value='2013-03-07T22:03:15'>+\\
537 \verb+ <numeric name='+{\color{red}\code{Energy}}\verb+' momentary='true'+\\
538 \verb+ value='+{\color{red}\code{167.5}}\verb+' unit='+{\color{red}\code{kWh}}\verb+'/>+\\
539 \verb+ <numeric name='+{\color{blue}\code{Power}}\verb+' momentary='true'+\\
540 \verb+ value='+{\color{blue}\code{239.4}}\verb+' unit='+{\color{blue}\code{W}}\verb+'/>+\\
541 \verb+ </timestamp>+\\
542 \verb+ </node>+\\
543 \verb+ </fields>+\\
544 \verb+</message>+
545 \advanceby{12\baselineskip}
546 };
547
548 \advanceby{1cm}
549 \draw[->] (\cli,-\ypos) -- (\dev,-\yypos) node[clipkt]{\verb+</stream>+};
550 \advanceby{1cm}
551 \draw[->] (\dev,-\ypos) -- (\cli,-\yypos) node[devpkt]{\verb+</stream>+};
552 \end{tikzpicture}
553 \end{frame}
554 \end{document}
This page took 0.106429 seconds and 3 git commands to generate.