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