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