From ff7ff9a9a939d377bb9bf150e83099eab0f1e588 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Tue, 12 Jun 2018 08:57:35 +0200 Subject: wip --- slides/Makefile | 39 +- slides/connected-arduino-slides.pdf | Bin 0 -> 293025 bytes slides/connected-arduino-text.pdf | Bin 0 -> 64793 bytes slides/connected-arduino.md | 565 ++++++++++++++ slides/templates/beamer.tex | 439 +++++++++++ slides/toc.md | 18 +- slides/what-is-iot-slides.pdf | Bin 313148 -> 0 bytes slides/what-is-iot-slides.tex | 1424 ----------------------------------- slides/what-is-iot-text.pdf | Bin 314159 -> 0 bytes slides/what-is-iot.md | 717 ------------------ 10 files changed, 1025 insertions(+), 2177 deletions(-) create mode 100644 slides/connected-arduino-slides.pdf create mode 100644 slides/connected-arduino-text.pdf create mode 100644 slides/connected-arduino.md create mode 100644 slides/templates/beamer.tex delete mode 100644 slides/what-is-iot-slides.pdf delete mode 100644 slides/what-is-iot-slides.tex delete mode 100644 slides/what-is-iot-text.pdf delete mode 100644 slides/what-is-iot.md diff --git a/slides/Makefile b/slides/Makefile index 727031c..4f2b761 100644 --- a/slides/Makefile +++ b/slides/Makefile @@ -1,9 +1,12 @@ -P=what-is-iot +P=connected-arduino # Madrid Pittsburgh boxes SLIDE_THEME?=boxes PDFS=$(P)-text.pdf $(P)-slides.pdf HTMLS=$(P)-reveal.html +BUILD_DIR=build +TEMPLATE_DIR=templates +TEMPLATE_BEAMER=$(TEMPLATE_DIR)/beamer.tex ifeq (1,$(QUICK)) PP_DEFS+=QUICK PDF_ENGINE = xelatex @@ -17,11 +20,11 @@ endif RUN_PP_BEAMER=pp -DBEAMER $(patsubst %,-D%,$(PP_DEFS)) RUN_PP_REVEALJS=pp -DREVEALJS $(patsubst %,-D%,$(PP_DEFS)) RUN_PANDOC_BEAMER=pandoc -f markdown -t beamer $(PANDOC_ARGS) -V theme:$(SLIDE_THEME) \ - --pdf-engine=$(PDF_ENGINE) + --pdf-engine=$(PDF_ENGINE) --template=$(TEMPLATE_BEAMER) -V toc-depth:4 RUN_PANDOC_REVEALJS=pandoc -f markdown -t revealjs -s -V revealjs-url=./bower_components/reveal.js RUN_PANDOC_TEXT=pandoc -f markdown --pdf-engine=$(PDF_ENGINE) -all: toc.md $(PDFS) $(HTMLS) +all: toc.md $(PDFS) slides: $(P)-slides.tex $(P)-slides.pdf html: $(P)-reveal.html @@ -42,28 +45,28 @@ spell: .$(P).md.spell $(P).md: Makefile @touch $@ -include $(P).beamer.md.d -include $(P).revealjs.md.d +$(BUILD_DIR): + mkdir -p $(BUILD_DIR) -%.beamer.md: %.md .var/QUICK +%.beamer.md: %.md $(RUN_PP_BEAMER) < $< > $@ -%.beamer.md.d: %.md +$(BUILD_DIR)/%.beamer.md.d: %.md | $(BUILD_DIR) $(RUN_PP_BEAMER) -M $< < $< > $@ %-text.pdf: %.beamer.md $(RUN_PANDOC_TEXT) -o $@ $< -%-slides.pdf: %.beamer.md .var/SLIDE_THEME +%-slides.pdf: %.beamer.md $(TEMPLATE_BEAMER) $(RUN_PANDOC_BEAMER) -o $@ $< -%-slides.tex: %.beamer.md .var/SLIDE_THEME +%-slides.tex: %.beamer.md $(TEMPLATE_BEAMER) $(RUN_PANDOC_BEAMER) -o $@ $< -%.revealjs.md: %.md# %.revealjs.md.d +%.revealjs.md: %.md# $(BUILD_DIR)/%.revealjs.md.d $(RUN_PP_REVEALJS) < $< > $@ -%.revealjs.md.d: %.md +$(BUILD_DIR)/%.revealjs.md.d: %.md | $(BUILD_DIR) $(RUN_PP_REVEALJS) -M $< < $< > $@ %-reveal.html: %.revealjs.md @@ -74,13 +77,11 @@ images/%.pdf: images/%.tex | images/pp-template Makefile xelatex -output-directory=images $(patsubst %.tex,%-full.tex,$<) mv $(patsubst %.pdf,%-full.pdf,$@) $@ +$(TEMPLATE_BEAMER): $(dir $(TEMPLATE_BEAMER)) + pandoc --print-default-template=beamer > $@ -VARS=SLIDE_THEME QUICK +$(dir $(TEMPLATE_BEAMER)): + mkdir -p $@ -define refresh = -.var/$(1):: - @mkdir -p .var - @./refresh $$@ $(1) $($(1)) -endef - -$(foreach var,$(VARS),$(eval $(call refresh,$(var)))) +-include $(BUILD_DIR)/$(P).beamer.md.d +-include $(BUILD_DIR)/$(P).revealjs.md.d diff --git a/slides/connected-arduino-slides.pdf b/slides/connected-arduino-slides.pdf new file mode 100644 index 0000000..83e8750 Binary files /dev/null and b/slides/connected-arduino-slides.pdf differ diff --git a/slides/connected-arduino-text.pdf b/slides/connected-arduino-text.pdf new file mode 100644 index 0000000..e5088b9 Binary files /dev/null and b/slides/connected-arduino-text.pdf differ diff --git a/slides/connected-arduino.md b/slides/connected-arduino.md new file mode 100644 index 0000000..6a6b5e7 --- /dev/null +++ b/slides/connected-arduino.md @@ -0,0 +1,565 @@ +--- +title: "IoT Workshop" +author: Trygve Laugstøl \ +header-includes: + - \hypersetup{colorlinks=true, + allbordercolors={0 0 0}, + pdfborderstyle={/S/U/W 1}} + - \usepackage{tikz} + \usetikzlibrary{angles,arrows,arrows.meta,backgrounds,calc,chains,decorations,decorations.pathmorphing,decorations.pathreplacing,decorations.text,fit,matrix,positioning,quotes,shapes.arrows,shapes.geometric,shapes.symbols} + +!ifndef(QUICK) +~~~~~~ + - \usepackage{fontspec} + \setsansfont{Verdana} +~~~~~~ + +--- + +# NodeMCU + +!comment(aka NodeMCU aka ESP-12) + +## NodeMCU hardware + +!ifndef(QUICK)( +![](images/NodeMCU-–-Board-de-desarrollo-con-módulo-ESP8266-WiFi-y-Lua-4.jpg) +) + +## NodeMCU hardware + +!ifndef(QUICK)( +\begin{center} +!include(images/nodemcu.pgf) +\end{center} +) + +## ESP8266 software layers + +!ifndef(QUICK)( +\begin{center} +!include(images/esp+arduino-sdks.pgf) +\end{center} +) + +## ESP8266 + Arduino + +* Standard Arduino IDE +* ESP8266 Arduino core + * https://github.com/esp8266/Arduino + +## Arduino IDE + +!ifndef(QUICK)( +![](images/arduino-ide.png) +) + +## Arduino code structure + +~~~ .c++ +void setup() { + // Called once +} + +void loop() { + // Called repeatedly +} +~~~ + +::: notes + +MCU programming is often structured into: + +* Configure + * CPU + * GPIO ports + * MCU's peripherals + * The rest of the board + * Configure application and callbacks. +* Sleep + +Arduino chooses to run the cpu at 100% instead of the sleep step.. + +::: + +## Arduino file structure + + foo/ + foo.ino + config.h + +::: notes + +`foo.ino` must always be in a `foo` directory. + +config.h is created by "new tab". + +::: + +## Generic Arduino APIs + +~~~c++ +// Pin: D0, D1, etc. +// Mode: OUTPUT, INPUT, INPUT_PULLUP +void pinMode(uint8_t pin, uint8_t mode); + +// State: HIGH, LOW, true/false, 1/0 +void digitalWrite(uint8_t pin, uint8_t state); +int digitalRead(uint8_t pin); + +unsigned long now millis(); +unsigned long now micros(); +~~~ + +## ESP Arduino APIs + +~~~c++ +class { + void restart(); + uint32_t getFreeHeap(); + uint32_t getChipId(); + + ... +} ESP; + +// Usage +ESP.restart(); +~~~ + +## ESP Arduino APIs + +~~~c++ +class { + String macAddress(); + + wl_status_t status(); + int32_t RSSI(); + + IPAddress localIP(); + IPAddress subnetMask(); + IPAddress gatewayIP(); + IPAddress dnsIP(uint8_t dns_no = 0); + + ... +} WiFi; + +// Usage: + +Serial.println(WiFi.localIP().toString()); +~~~ + +::: notes + +http://arduino-esp8266.readthedocs.io/en/latest/libraries.html + +::: + +# What is IoT + +## What is IoT + +* Not "a computer connected to the internet" + * Then it is really just another computer connected to the internet + +* Must be something else + * It is simply devices that are resource constrained + * Usually in more than one way + +* Autonomous operation, the connection might not be permanent + +## IoT is just a concept + +* *The Internet of Things (IoT) is the network of physical devices, + vehicles, home appliances and other items embedded with + electronics, software, sensors, actuators, and connectivity which + enables these objects to connect and exchange data.*^[ + Wikipedia "Internet of Things"] + +## What is an IoT Device? + +::: notes + +As for their definition. + +What differentiates a computer from an IoT device? + +::: + +## What is an IoT Device? + +* Constrained in (one or more of): + * Memory + * CPU + * Network bandwidth and/or latency + * Storage +* Has connectivity + * Bluetooth + * Wi-Fi + * NB-IoT + * LTE Cat-M + * LoRa + * Proprietary radio + +::: notes + +Might not have: + +* RTC + +Extra features: + +* IR +* UART +* CAN + +Sparkfun and Adafruit etc sell modules with all of these technologies. + +::: + +## IoT Devices - Example chips + +Protocol Chip Specs +------------- ---- ----- +Bluetooth 4/5 nRF52x 32-64 MHz, Cortex-M0/M4F, + 24-256k RAM, 192-1024 k Flash, + $1.88-$3.85 +WiFi ESP8266/ESP32 80MHz-160MHz, 1-2 cores, + ~80k RAM, < $1 - $4.53 +LoRa Semtech $3.23 - $4.74 + + +::: notes + +BT and Wi-Fi has many, many more chips. Technologies based on +open/accessible standards. LoRa is much more closed and driven by a +single company. + +4.53 is quantity=10 + +LoRa chips are just trancievers, an MCU with LoRa stack is required. +::: + +## ESP8266 details - Power usage + ++--------------------------+----------------+ +| State | Current usage | ++==========================+===============:+ +| Off | 0.5 µA | ++--------------------------+----------------+ +| Deep sleep with RTC | 20 µA | ++--------------------------+----------------+ +| Light sleep (with Wi-Fi) | 1 mA | ++--------------------------+----------------+ +| Sleep with peripherials | 15 mA | ++--------------------------+----------------+ +| TX | 170 mA | ++--------------------------+----------------+ + +::: notes + +Datasheet page 18 + +::: + +# Lecture: MQTT + +## MQTT + +* *Message Queuing Telemetry Transport* +* [Wikipedia: MQTT](https://en.wikipedia.org/wiki/MQTT) + +::: notes + +MQTT is *the* standard for IoT applications (and lots of other useful +stuff to). Using HTTP is just silly. + +Supports SSL, and requires TCP. + +Has UDP-like semantics with "fire and forget" but on a higher level +(the message always have to be delivered and ACKed by the broker, not +it's final recipient. + +Version 3.1.1 er den som gjelder, V 3.1 er rar, de andre finnes ikke +(før standardisering). + +::: + +## Device and application architecture with MQTT + +!ifndef(QUICK)( +\begin{center} +!include(images/mqtt-example-architecture.pgf) +\end{center} +) + +## MQTT - Implementations + +* Mosquitto +* Eclipse Paho +* RabbitMQ +* ActiveMQ + +::: notes + +RabbitMQ has a separate connector that must be installed +Not sure about ActiveMQ but it is at least a part of the project so it is releases at the same time. + +::: + +## MQTT Cloud Connectors + +* Cloud + * Amazon IoT + * Google Cloud IoT + * Microsoft Azure IoT + * CloudMQTT (at Heroku) + +* DIY + * ThingMQ + * HiveMQ + +::: notes + +In between are: + +* self hosted +* Generic bridges + +::: + +## MQTT - The protocol + +Agents have one of two roles: + +* *Client* + * Publishes *messages* + * Subscribes / unsubscribes to *topics* + +* *Broker* (aka Server) + * Handles network connections + * Keeps subscriptions + * Manages client + * Disconnects + * *(last) will* + * Persistence of retained messages + +::: notes + +network connections: this includes removing closed sockets, client's that doesn't respons to timeouts and duplicate clients. + +http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html + +Subscriptions are not permanent. The connection is (unlike HTTP) +stateful. + +Some messages may be persistent, but only one per topic. You will +often end up with a "proper" mq on the backend if queuing is needed. + +Push vs pull, central applications can push to clients + +::: + +## MQTT - The protocol - MQTT Packet + +* Size oriented +* Flags indicate type of remaining bytes + * Packet type + * Topic name + * Payload + +::: notes + +Only packet type + flags (1 byte) is required, everything else is optional. + +The size field is variable length encoded, 0-127 bytes is 1 byte, 128-16383 use 2 bytes etc, up to 4 bytes for 256MB payload. + +::: + +## MQTT Connect + +* `CONNECT` + * `clientId` + * `username` + * `password` + * `keepAlive` + + + +* Keep alive + * `PINGREQ` + * `PINGRESP` + +## MQTT - The protocol - MQTT Topic + +* Topic name: `foo/bar/baz` +* Topic filter + * `foo/bar/?` + * `foo/#` + +## MQTT - The protocol - Retained message + +Message is kept by the server even after disconnect + +* `CONNECT` +* `PUBLISH` + * `RETAIN` + * `$app/$device/temperature` + * `22.3` +* `DISCONNECT` + +Later on: + +* `SUBSCRIBE` + * `$app/#/temperature` +* `PUBLISH` + * `$app/$device/temperature` + * `22.3` + +::: notes + +The last PUBLISH is an incoming message + +::: + +## MQTT - The protocol - Will message + +Message sent when you disconnect + +Client #1: + +1. `CONNECT` + * `WILL TOPIC: $app/$device/online` + * `WILL PAYLOAD: 0` +1. `PUBLISH` + * `$app/$device/online` + * `1` +1. `DISCONNECT` + +Broker + +1. *To all subscribers* `PUBLISH` + * `$app/$device/online` + * `0` + +## MQTT Topic + +The temperature sensor: + +* Publishes on: + * `myapp/$device-id/temperature` + * `myapp/$device-id/humidity` + * `myapp/$device-id/altert` +* Subscribes to: + * `myapp/$device-id/command` + +The central application: + +* Subscribes to: + * `myapp/#/temperature` + * `myapp/#/humidity` +* Publishes on: + * `myapp/$device-id/command` + +::: notes + +Typical first round of implementation. + +Commands can be: +* load new firmware (maybe an URL and firmware signature). +* Set new calibration values +* Change reading interval, altert levels (autonomous operation) + +::: + +## MQTT on Arduino + +PubSubClient is our MQTT client implementation. + +~~~c++ +WiFiClient wifiClient; +PubSubClient mqtt(wifiClient); + +void callback(char* topic, + byte* payload, + unsigned int length); + +void setup() { + // Configure WiFi + mqtt.setServer(mqtt_server, 1883); + mqtt.setCallback(callback); +} +~~~ + +## MQTT on Arduino + +~~~c++ +void loop() { + if (!mqtt.connected()) + reconnect(); + else + mqtt.loop(); + // Do work +} + +void reconnect() { + while (!mqtt.connect(client_id)); + + mqtt.subscribe(topic_pattern); +} +~~~ + +::: notes +This is blocking! +::: + +## Assignment + +* `mqtt` + +## MQTT topic architecture + +The central application is split: + +* An aggregating agent: + * `myapp/#/temperature` + * `myapp/#/humidity` +* Emailing agent + * `myapp/$device-id/altert` + +* Publishes on: + * `myapp/$device-id/command` + +## MQTT topic architecture + +!ifndef(QUICK)( +\begin{center} +!include(images/mqtt-example-architecture.pgf) +\end{center} +) + +## MQTT topic architecture + +!ifndef(QUICK)( +\begin{center} +!include(images/mqtt-example-architecture2.pgf) +\end{center} +) + +## MQTT - Patterns + +* Combining MQTT and HTTP +* Using web sockets transport + +## Assignment + +* `mqtt2` + +## Assignment + +* `mqtt3` + +::: notes + +discussion: how to connect these two devices? + +::: diff --git a/slides/templates/beamer.tex b/slides/templates/beamer.tex new file mode 100644 index 0000000..08e21c1 --- /dev/null +++ b/slides/templates/beamer.tex @@ -0,0 +1,439 @@ +\PassOptionsToPackage{unicode=true}{hyperref} % options for packages loaded elsewhere +\PassOptionsToPackage{hyphens}{url} +$if(colorlinks)$ +\PassOptionsToPackage{dvipsnames,svgnames*,x11names*}{xcolor} +$endif$$if(dir)$$if(latex-dir-rtl)$ +\PassOptionsToPackage{RTLdocument}{bidi} +$endif$$endif$% +\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$babel-lang$,$endif$$if(papersize)$$papersize$paper,$endif$$if(beamer)$ignorenonframetext,$if(handout)$handout,$endif$$if(aspectratio)$aspectratio=$aspectratio$,$endif$$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$} +$if(beamer)$ +\setbeamertemplate{caption}[numbered] +\setbeamertemplate{caption label separator}{: } +\setbeamercolor{caption name}{fg=normal text.fg} +\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ +$endif$ +$if(beamerarticle)$ +\usepackage{beamerarticle} % needs to be loaded first +$endif$ +$if(fontfamily)$ +\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} +$else$ +\usepackage{lmodern} +$endif$ +$if(linestretch)$ +\usepackage{setspace} +\setstretch{$linestretch$} +$endif$ +\usepackage{amssymb,amsmath} +\usepackage{ifxetex,ifluatex} +\usepackage{fixltx2e} % provides \textsubscript +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provides euro and other symbols +\else % if luatex or xelatex +$if(mathspec)$ + \ifxetex + \usepackage{mathspec} + \else + \usepackage{unicode-math} + \fi +$else$ + \usepackage{unicode-math} +$endif$ + \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase} +$for(fontfamilies)$ + \newfontfamily{$fontfamilies.name$}[$fontfamilies.options$]{$fontfamilies.font$} +$endfor$ +$if(mainfont)$ + \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$} +$endif$ +$if(sansfont)$ + \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$} +$endif$ +$if(monofont)$ + \setmonofont[Mapping=tex-ansi$if(monofontoptions)$,$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$endif$]{$monofont$} +$endif$ +$if(mathfont)$ +$if(mathspec)$ + \ifxetex + \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \else + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} + \fi +$else$ + \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} +$endif$ +$endif$ +$if(CJKmainfont)$ + \ifxetex + \usepackage{xeCJK} + \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +$if(luatexjapresetoptions)$ + \ifluatex + \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} + \fi +$endif$ +$if(CJKmainfont)$ + \ifluatex + \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} + \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} + \fi +$endif$ +\fi +$if(beamer)$ +$if(theme)$ +\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} +$endif$ +$if(colortheme)$ +\usecolortheme{$colortheme$} +$endif$ +$if(fonttheme)$ +\usefonttheme{$fonttheme$} +$endif$ +$if(mainfont)$ +\usefonttheme{serif} % use mainfont rather than sansfont for slide text +$endif$ +$if(innertheme)$ +\useinnertheme{$innertheme$} +$endif$ +$if(outertheme)$ +\useoutertheme{$outertheme$} +$endif$ +$endif$ +% use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +% use microtype if available +\IfFileExists{microtype.sty}{% +\usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} +\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +$if(indent)$ +$else$ +\IfFileExists{parskip.sty}{% +\usepackage{parskip} +}{% else +\setlength{\parindent}{0pt} +\setlength{\parskip}{6pt plus 2pt minus 1pt} +} +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +$if(colorlinks)$ +\usepackage{xcolor} +$endif$ +\usepackage{hyperref} +\hypersetup{ +$if(title-meta)$ + pdftitle={$title-meta$}, +$endif$ +$if(author-meta)$ + pdfauthor={$author-meta$}, +$endif$ +$if(keywords)$ + pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, +$endif$ +$if(colorlinks)$ + colorlinks=true, + linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$, + citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$, + urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$, +$else$ + pdfborder={0 0 0}, +$endif$ + breaklinks=true} + +\urlstyle{same} % don't use monospace font for urls +$if(verbatim-in-note)$ +\VerbatimFootnotes % allows verbatim text in footnotes +$endif$ +$if(geometry)$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$if(beamer)$ +\newif\ifbibliography +$endif$ +$if(listings)$ +\usepackage{listings} +\newcommand{\passthrough}[1]{#1} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ +$endif$ +$if(tables)$ +\usepackage{longtable,booktabs} +$if(beamer)$ +\usepackage{caption} +% These lines are needed to make table captions work with longtable: +\makeatletter +\def\fnum@table{\tablename~\thetable} +\makeatother +$else$ +% Fix footnotes in tables (requires footnote package) +\IfFileExists{footnote.sty}{\usepackage{footnote}\makesavenoteenv{longtable}}{} +$endif$ +$endif$ +$if(graphics)$ +\usepackage{graphicx,grffile} +\makeatletter +\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +\makeatother +% Scale images if necessary, so that they will not overflow the page +% margins by default, and it is still possible to overwrite the defaults +% using explicit options in \includegraphics[width, height, ...]{} +\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +$endif$ +$if(beamer)$ +% Prevent slide breaks in the middle of a paragraph: +\widowpenalties 1 10000 +\raggedbottom +$if(section-titles)$ +\setbeamertemplate{part page}{ +\centering +\begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par +\end{beamercolorbox} +} +\setbeamertemplate{section page}{ +\centering +\begin{beamercolorbox}[sep=12pt,center]{part title} + \usebeamerfont{section title}\insertsection\par +\end{beamercolorbox} +} +\setbeamertemplate{subsection page}{ +\centering +\begin{beamercolorbox}[sep=8pt,center]{part title} + \usebeamerfont{subsection title}\insertsubsection\par +\end{beamercolorbox} +} +\AtBeginPart{ + \frame{\partpage} +} +\AtBeginSection{ + \ifbibliography + \else + \frame{\sectionpage} + \fi +} +\AtBeginSubsection{ + \frame{\subsectionpage} +} +$endif$ +$endif$ +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(strikeout)$ +\usepackage[normalem]{ulem} +% avoid problems with \sout in headers with hyperref: +\pdfstringdefDisableCommands{\renewcommand{\sout}{}} +$endif$ +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +$if(numbersections)$ +\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} +$else$ +\setcounter{secnumdepth}{0} +$endif$ +$if(beamer)$ +$else$ +$if(subparagraph)$ +$else$ +% Redefines (sub)paragraphs to behave more like sections +\ifx\paragraph\undefined\else +\let\oldparagraph\paragraph +\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}} +\fi +\ifx\subparagraph\undefined\else +\let\oldsubparagraph\subparagraph +\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}} +\fi +$endif$ +$endif$ +$if(pagestyle)$ +\pagestyle{$pagestyle$} +$endif$ + +% set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother + +$for(header-includes)$ +$header-includes$ +$endfor$ +$if(lang)$ +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel} +$if(babel-newcommands)$ + $babel-newcommands$ +$endif$ +\else + % load polyglossia as late as possible as it *could* call bidi if RTL lang (e.g. Hebrew or Arabic) + \usepackage{polyglossia} + \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$} +$for(polyglossia-otherlangs)$ + \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$} +$endfor$ +\fi +$endif$ +$if(dir)$ +\ifxetex + % load bidi as late as possible as it modifies e.g. graphicx + \usepackage{bidi} +\fi +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \TeXXeTstate=1 + \newcommand{\RL}[1]{\beginR #1\endR} + \newcommand{\LR}[1]{\beginL #1\endL} + \newenvironment{RTL}{\beginR}{\endR} + \newenvironment{LTR}{\beginL}{\endL} +\fi +$endif$ +$if(natbib)$ +\usepackage[$natbiboptions$]{natbib} +\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} +$endif$ +$if(biblatex)$ +\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} +$for(bibliography)$ +\addbibresource{$bibliography$} +$endfor$ +$endif$ + +$if(title)$ +\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} +$endif$ +$if(subtitle)$ +\providecommand{\subtitle}[1]{} +\subtitle{$subtitle$} +$endif$ +$if(author)$ +\author{$for(author)$$author$$sep$ \and $endfor$} +$endif$ +$if(institute)$ +\providecommand{\institute}[1]{} +\institute{$for(institute)$$institute$$sep$ \and $endfor$} +$endif$ +\date{$date$} +$if(beamer)$ +$if(titlegraphic)$ +\titlegraphic{\includegraphics{$titlegraphic$}} +$endif$ +$if(logo)$ +\logo{\includegraphics{$logo$}} +$endif$ +$endif$ + +\iffalse +\makeatletter +% save the current definition of \beamer@@frametitle +\let\nobookmarkbeamer@@frametitle\beamer@@frametitle +% then patch it to do the bookmarks and/or TOC entries +\apptocmd{\beamer@@frametitle}{% + % keep this to add the frame title to the TOC at the "subsection level" + \addtocontents{toc}{\protect\beamer@subsectionintoc{\the\c@section}{0}{#1}{\the\c@page}{\the\c@part}% + {\the\beamer@tocsectionnumber}}% + % keep this line to add a bookmark that shows up in the PDF TOC at the subsection level + \bookmark[page=\the\c@page,level=3]{#1}% + }% + {\message{** patching of \string\beamer@@frametitle succeeded **}}% + {\errmessage{** patching of \string\beamer@@frametitle failed **}}% + +\pretocmd{\beamer@checknoslide}{% + % ensure the bookmark is not created if the slide is filtered out + \let\beamer@@frametitle\nobookmarkbeamer@@frametitle + }% + {\message{** patching of \string\beamer@checknoslide succeeded **}}% + {\errmessage{** patching of \string\beamer@checknoslide failed **}}% + +\makeatother +\fi + +\begin{document} +$if(title)$ +$if(beamer)$ +\frame{\titlepage} +$else$ +\maketitle +$endif$ +$if(abstract)$ +\begin{abstract} +$abstract$ +\end{abstract} +$endif$ +$endif$ + +$for(include-before)$ +$include-before$ + +$endfor$ +$if(toc)$ +$if(beamer)$ +\begin{frame} +%\tableofcontents[hideallsubsections] +\tableofcontents[currentsection,subsubsectionstyle=hide] +\end{frame} +$else$ +{ +$if(colorlinks)$ +\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} +$endif$ +\setcounter{tocdepth}{$toc-depth$} +\tableofcontents +} +$endif$ +$endif$ +$if(lot)$ +\listoftables +$endif$ +$if(lof)$ +\listoffigures +$endif$ +$body$ + +$if(natbib)$ +$if(bibliography)$ +$if(biblio-title)$ +$if(book-class)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} +\bibliographytrue +$endif$ +\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} +$if(beamer)$ +\end{frame} +$endif$ + +$endif$ +$endif$ +$if(biblatex)$ +$if(beamer)$ +\begin{frame}[allowframebreaks]{$biblio-title$} +\bibliographytrue +\printbibliography[heading=none] +\end{frame} +$else$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ +$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} diff --git a/slides/toc.md b/slides/toc.md index cdc431e..6e54e03 100644 --- a/slides/toc.md +++ b/slides/toc.md @@ -14,24 +14,8 @@ * IoT is just a concept * What is an IoT Device? * What is an IoT Device? - * IoT Devices - Bluetooth 4/5 chips - * IoT Devices - LoRA -### Modules -### Chips - * IoT Devices - NB-IoT - * IoT Devices - Wi-Fi + * IoT Devices - Example chips * ESP8266 details - Power usage -* Going back to basics - * What is the internet again? - * TCP/IP Layers - * Packet encapsulation - * Network interface - * Internet - * Transport - * Layer 7: Application Layer - * Details: IP - * Details: IP Header - * Details: UDP Header * Lecture: MQTT * MQTT * Device and application architecture with MQTT diff --git a/slides/what-is-iot-slides.pdf b/slides/what-is-iot-slides.pdf deleted file mode 100644 index a62a47c..0000000 Binary files a/slides/what-is-iot-slides.pdf and /dev/null differ diff --git a/slides/what-is-iot-slides.tex b/slides/what-is-iot-slides.tex deleted file mode 100644 index 1b65fc0..0000000 --- a/slides/what-is-iot-slides.tex +++ /dev/null @@ -1,1424 +0,0 @@ -\hypertarget{nodemcu}{% -\section{NodeMCU}\label{nodemcu}} - -\begin{frame}{NodeMCU hardware} -\protect\hypertarget{nodemcu-hardware}{} - -\includegraphics{images/NodeMCU-–-Board-de-desarrollo-con-módulo-ESP8266-WiFi-y-Lua-4.jpg} - -\end{frame} - -\begin{frame}{NodeMCU hardware} -\protect\hypertarget{nodemcu-hardware-1}{} - -\begin{center} -\begin{tikzpicture} - -\path - (0, 0) node(flash)[draw, rectangle, - minimum height=1cm, minimum width=2cm] {Flash} - - (0, 1.5) node(esp8266)[draw, rectangle, - minimum height=1cm, minimum width=2cm] {ESP8266} - - (3.5, 1.5) node(cp201x)[draw, rectangle, - minimum height=0.75cm, minimum width=1cm] - {CP201x} - - (5.5, 1.5) node(usb)[] - {USB} -; - -\draw[-] (esp8266) -- node[node font=\footnotesize, right]{QSPI} (flash); -\draw[-] (esp8266) -- node[node font=\footnotesize, above]{UART} (cp201x) -- (usb); - -\node[rectangle, draw, fit=(esp8266) (flash), inner sep=2 mm, - label={[name=esp12_label,anchor=south]ESP-12}] - (esp12){}; - -\node[rectangle, draw, thick, fit=(esp12_label) (esp12) (cp201x), inner sep=3 mm, - label={[anchor=north]south:NodeMCU}] - (nodemcu){}; - -\end{tikzpicture} - -\end{center} - -\end{frame} - -\begin{frame}{ESP8266 software layers} -\protect\hypertarget{esp8266-software-layers}{} - -\begin{center} -\begin{tikzpicture} - -\node (rect_hw) [rectangle, draw, anchor=south west, - minimum width=6 cm, minimum height=1 cm, - label={[anchor=south]center:ESP8266 Hardware}] at (0, 0) {}; - -\draw[thick] (-0.5, 1.25) -- (6.5, 1.25) ; - -\node [rectangle, draw, anchor=south west, - minimum width=4 cm, minimum height=1 cm, - label={[anchor=south]center:ESP SDK}] at (0, 1.5) {}; - -\node [rectangle, draw, anchor=south west, - minimum width=2 cm, minimum height=1 cm, - label={[align=center, text width=1cm]center:GCC libc}] at (4, 1.5) {}; - -\node [rectangle, draw, anchor=south west, - minimum width=6 cm, minimum height=1 cm, - label={[anchor=south]center:ESP interface}] at (0, 2.5) {}; - -\node [rectangle, draw, anchor=south west, - minimum width=2 cm, minimum height=1 cm, - label={[align=center, text width= 2cm]center:Generic Arduino}] at (0, 3.5) {}; - -\node [rectangle, draw, anchor=south west, - minimum width=2 cm, minimum height=1 cm, - label={[align=center, text width= 2cm]center:Ethernet}] at (2, 3.5) {}; - -\node [rectangle, draw, anchor=south west, - minimum width=2 cm, minimum height=1 cm, - label={[align=center, text width= 2cm]center:ESP APIs}] at (4, 3.5) {}; - -\draw [decorate, decoration={brace,amplitude=5pt, raise=-4pt}] (-0.5,2.5) -- (-0.5,4.5) node [black,midway,rotate=90, above] {Arduino}; - - -\end{tikzpicture} - -\end{center} - -\end{frame} - -\begin{frame}{ESP8266 + Arduino} -\protect\hypertarget{esp8266-arduino}{} - -\begin{itemize} -\tightlist -\item - Standard Arduino IDE -\item - ESP8266 Arduino core - - \begin{itemize} - \tightlist - \item - https://github.com/esp8266/Arduino - \end{itemize} -\end{itemize} - -\end{frame} - -\begin{frame}{Arduino IDE} -\protect\hypertarget{arduino-ide}{} - -\includegraphics{images/arduino-ide.png} - -\end{frame} - -\begin{frame}[fragile]{Arduino code structure} -\protect\hypertarget{arduino-code-structure}{} - -\begin{Shaded} -\begin{Highlighting}[] -\DataTypeTok{void}\NormalTok{ setup() \{} - \CommentTok{// Called once} -\NormalTok{\}} - -\DataTypeTok{void}\NormalTok{ loop() \{} - \CommentTok{// Called repeatedly} -\NormalTok{\}} -\end{Highlighting} -\end{Shaded} - -\note{MCU programming is often structured into: - -\begin{itemize} -\tightlist -\item - Configure - - \begin{itemize} - \tightlist - \item - CPU - \item - GPIO ports - \item - MCU’s peripherals - \item - The rest of the board - \item - Configure application and callbacks. - \end{itemize} -\item - Sleep -\end{itemize} - -Arduino chooses to run the cpu at 100\% instead of the sleep step..} - -\end{frame} - -\begin{frame}[fragile]{Arduino file structure} -\protect\hypertarget{arduino-file-structure}{} - -\begin{verbatim} -foo/ - foo.ino - config.h -\end{verbatim} - -\note{\texttt{foo.ino} must always be in a \texttt{foo} directory. - -config.h is created by “new tab”.} - -\end{frame} - -\begin{frame}[fragile]{Generic Arduino APIs} -\protect\hypertarget{generic-arduino-apis}{} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{// Pin: D0, D1, etc.} -\CommentTok{// Mode: OUTPUT, INPUT, INPUT_PULLUP} -\DataTypeTok{void}\NormalTok{ pinMode(}\DataTypeTok{uint8_t}\NormalTok{ pin, }\DataTypeTok{uint8_t}\NormalTok{ mode);} - -\CommentTok{// State: HIGH, LOW, true/false, 1/0} -\DataTypeTok{void}\NormalTok{ digitalWrite(}\DataTypeTok{uint8_t}\NormalTok{ pin, }\DataTypeTok{uint8_t}\NormalTok{ state);} -\DataTypeTok{int}\NormalTok{ digitalRead(}\DataTypeTok{uint8_t}\NormalTok{ pin);} - -\DataTypeTok{unsigned} \DataTypeTok{long}\NormalTok{ now millis();} -\DataTypeTok{unsigned} \DataTypeTok{long}\NormalTok{ now micros();} -\end{Highlighting} -\end{Shaded} - -\end{frame} - -\begin{frame}[fragile]{ESP Arduino APIs} -\protect\hypertarget{esp-arduino-apis}{} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{class}\NormalTok{ \{} - \DataTypeTok{void}\NormalTok{ restart();} - \DataTypeTok{uint32_t}\NormalTok{ getFreeHeap();} - \DataTypeTok{uint32_t}\NormalTok{ getChipId();} - -\NormalTok{ ...} -\NormalTok{\} ESP;} - -\CommentTok{// Usage} -\NormalTok{ESP.restart();} -\end{Highlighting} -\end{Shaded} - -\end{frame} - -\begin{frame}[fragile]{ESP Arduino APIs} -\protect\hypertarget{esp-arduino-apis-1}{} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{class}\NormalTok{ \{} -\NormalTok{ String macAddress();} - - \DataTypeTok{wl_status_t}\NormalTok{ status();} - \DataTypeTok{int32_t}\NormalTok{ RSSI();} - -\NormalTok{ IPAddress localIP();} -\NormalTok{ IPAddress subnetMask();} -\NormalTok{ IPAddress gatewayIP();} -\NormalTok{ IPAddress dnsIP(}\DataTypeTok{uint8_t}\NormalTok{ dns_no = }\DecValTok{0}\NormalTok{);} - -\NormalTok{ ...} -\NormalTok{\} WiFi;} - -\CommentTok{// Usage:} - -\NormalTok{Serial.println(WiFi.localIP().toString());} -\end{Highlighting} -\end{Shaded} - -\note{http://arduino-esp8266.readthedocs.io/en/latest/libraries.html} - -\end{frame} - -\hypertarget{what-is-iot}{% -\section{What is IoT}\label{what-is-iot}} - -\begin{frame}{What is IoT} -\protect\hypertarget{what-is-iot-1}{} - -\begin{itemize} -\tightlist -\item - Not “a computer connected to the internet” - - \begin{itemize} - \tightlist - \item - Then it is really just another computer connected to the internet - \end{itemize} -\item - Must be something else - - \begin{itemize} - \tightlist - \item - It is simply devices that are resource constrained - - \begin{itemize} - \tightlist - \item - Usually in more than one way - \end{itemize} - \end{itemize} -\item - Autonomous operation, the connection might not be permanent -\end{itemize} - -\end{frame} - -\begin{frame}{IoT is just a concept} -\protect\hypertarget{iot-is-just-a-concept}{} - -\begin{itemize} -\tightlist -\item - \emph{The Internet of Things (IoT) is the network of physical devices, - vehicles, home appliances and other items embedded with electronics, - software, sensors, actuators, and connectivity which enables these - objects to connect and exchange data.}\footnote<.->{Wikipedia - “Internet of Things”} -\end{itemize} - -\end{frame} - -\begin{frame}{What is an IoT Device?} -\protect\hypertarget{what-is-an-iot-device}{} - -\note{As for their definition. - -What differentiates a computer from an IoT device?} - -\end{frame} - -\begin{frame}{What is an IoT Device?} -\protect\hypertarget{what-is-an-iot-device-1}{} - -\begin{itemize} -\tightlist -\item - Constrained in (one or more of): - - \begin{itemize} - \tightlist - \item - Memory - \item - CPU - \item - Network bandwidth and/or latency - \item - Storage - \end{itemize} -\item - Has connectivity - - \begin{itemize} - \tightlist - \item - Bluetooth - \item - Wi-Fi - \item - NB-IoT - \item - LTE Cat-M - \item - LoRA - \item - Proprietary radio - \end{itemize} -\end{itemize} - -\note{Might not have: - -\begin{itemize} -\tightlist -\item - RTC -\end{itemize} - -Extra features: - -\begin{itemize} -\tightlist -\item - IR -\item - UART -\item - CAN -\end{itemize} - -Sparkfun and Adafruit etc sell modules with all of these technologies.} - -\end{frame} - -\begin{frame}{IoT Devices - Bluetooth 4/5 chips} -\protect\hypertarget{iot-devices---bluetooth-45-chips}{} - -\begin{longtable}[]{@{}llllll@{}} -\toprule -Chip & CPU & Freq & RAM & Flash & Price\tabularnewline -\midrule -\endhead -nRF52810 & Cortex-M4 & 64 MHz & 24k & 192k & \$1.88\tabularnewline -nRF52832 & Cortex-M4F & & 32k & 256k & \$2.54\tabularnewline -& & & 64k & 512k & \$2.59\tabularnewline -nRF52840 & Cortex-M4F & & 256k & 1024k & \$3.85\tabularnewline -\bottomrule -\end{longtable} - -\begin{itemize} -\tightlist -\item - nRF52810: High performance, entry-level Bluetooth 4/ANT/2.4GHz SoC -\item - nRF52832: High performance Bluetooth 4/ANT/2.4GHz SoC -\item - nRF52840: Advanced multi-protocol System-on-Chip Supporting: Bluetooth - 5, ANT/ANT+, 802.15.4 and 2.4GHz proprietary -\end{itemize} - -\note{All quantities are 1000 pieces - -nRF51: -https://www.digikey.no/products/en/rf-if-and-rfid/rf-transceiver-ics/879?k=nrf51822 - -nRF52832: these have different packagings, not only difference price - -https://www.digikey.no/products/en/rf-if-and-rfid/rf-transceiver-ics/879?FV=1c0001\%2Cffe0036f\&quantity=3000\&ColumnSort=1000011\&page=1\&k=nrf52832\&pageSize=500\&pkeyword=nrf52810 - -nRF52810: High performance, entry-level Bluetooth 4/ANT/2.4GHz SoC -nRF52832: High performance Bluetooth 4/ANT/2.4GHz SoC nRF52840: Advanced -multi-protocol System-on-Chip Supporting: Bluetooth 5, ANT/ANT+, -802.15.4 and 2.4GHz proprietary} - -\end{frame} - -\begin{frame}{IoT Devices - LoRA} -\protect\hypertarget{iot-devices---lora}{} - -\begin{block}{Modules} - -\begin{longtable}[]{@{}lll@{}} -\toprule -Module & Data Rate & Price\tabularnewline -\midrule -\endhead -RN2483A-I/RM104 & & \$12.05 @ 250\tabularnewline -CMWX1ZZABZ-078 & SX1276 & \$10.74 @ 1000\tabularnewline -RF-LORA-868-SO & SX1272 & \$16.55 @ 1000\tabularnewline -\bottomrule -\end{longtable} - -\end{block} - -\begin{block}{Chips} - -\begin{longtable}[]{@{}ll@{}} -\toprule -Chip & Price\tabularnewline -\midrule -\endhead -SX1281 & \$3.23\tabularnewline -SX1272 & \$4.25\tabularnewline -SX1276 & \$4.25\tabularnewline -SX1279 & \$4.74\tabularnewline -\bottomrule -\end{longtable} - -\note{These modules require an external MCU, so does the chips.} - -\end{block} - -\end{frame} - -\begin{frame}{IoT Devices - NB-IoT} -\protect\hypertarget{iot-devices---nb-iot}{} - -\begin{longtable}[]{@{}ll@{}} -\toprule -Module & Price\tabularnewline -\midrule -\endhead -uBlox SARA-N210 & \textasciitilde{}\$10 @ 100\tabularnewline -Sierra Wireless HL7800\_1103933 & \$15.72\tabularnewline -\bottomrule -\end{longtable} - -\end{frame} - -\begin{frame}{IoT Devices - Wi-Fi} -\protect\hypertarget{iot-devices---wi-fi}{} - -\begin{longtable}[]{@{}llllll@{}} -\toprule -Chip & CPU & Freq & ROM & RAM & Price\tabularnewline -\midrule -\endhead -ESP8266 & Tensilica L106 & 160 MHz & N/A & \textasciitilde{}50 kB & -\textless{} \$1\tabularnewline -\bottomrule -\end{longtable} - -ESP32 - dual cpu, Wi-Fi, Bluetooth 4 ESP32-D0WDQ6 2x Xtensa @ 160MHz \$ -4.53 @ 10 - -\note{The ESP8266’s RAM depends on which firmware stack is used. -Physical is probably 128k or most likely 64k.} - -\end{frame} - -\begin{frame}{ESP8266 details - Power usage} -\protect\hypertarget{esp8266-details---power-usage}{} - -\begin{longtable}[]{@{}lr@{}} -\toprule -\begin{minipage}[b]{0.35\columnwidth}\raggedright -State\strut -\end{minipage} & \begin{minipage}[b]{0.22\columnwidth}\raggedleft -Current usage\strut -\end{minipage}\tabularnewline -\midrule -\endhead -\begin{minipage}[t]{0.35\columnwidth}\raggedright -Off\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedleft -0.5 µA\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.35\columnwidth}\raggedright -Deep sleep with RTC\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedleft -20 µA\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.35\columnwidth}\raggedright -Light sleep (with Wi-Fi)\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedleft -1 mA\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.35\columnwidth}\raggedright -Sleep with peripherials\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedleft -15 mA\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.35\columnwidth}\raggedright -TX\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedleft -170 mA\strut -\end{minipage}\tabularnewline -\bottomrule -\end{longtable} - -\note{Datasheet page 18} - -\end{frame} - -\hypertarget{going-back-to-basics}{% -\section{Going back to basics}\label{going-back-to-basics}} - -\begin{frame}{What is the internet again?} -\protect\hypertarget{what-is-the-internet-again}{} - -\end{frame} - -\begin{frame}{TCP/IP Layers} -\protect\hypertarget{tcpip-layers}{} - -\begin{center} -\begin{tikzpicture}[ -mybox/.style={draw, rectangle, minimum width=4cm, minimum height=1 cm,font=\bfseries} -] - -%\draw (0,0) rectangle (3cm, 1cm) {wat}; - -\node at (0, -0) [mybox] {Application}; -\node at (0, -1) [mybox] {Transport}; -\node at (0, -2) [mybox] {Internet}; -\node at (0, -3)[mybox] {Network interface}; - -\end{tikzpicture} - -\end{center} - -\end{frame} - -\begin{frame}{Packet encapsulation} -\protect\hypertarget{packet-encapsulation}{} - -\begin{center} -\begin{tikzpicture}[ -mybox/.style={ - draw, - rectangle, - minimum height=1 cm, - anchor=west, - align=center, - font=\bfseries} -] - -%\draw (0,0) rectangle (3cm, 1cm) {wat}; - -\node at (0 cm, 0 cm) [mybox, minimum width=2cm, text width=1.7cm] {Frame header}; -\node at (2 cm, 0 cm) [mybox, minimum width=6cm] {Frame data}; -\node at (8 cm, 0 cm) [mybox, minimum width=2cm, text width=1.7cm] {Frame footer}; - -\node at (2 cm, 1.1 cm) [mybox, minimum width=2cm] {IP header}; -\node at (4 cm, 1.1 cm) [mybox, minimum width=4cm] {IP Data}; - -\node at (4 cm, 2.2 cm) [mybox, minimum width=2cm, text width=1.7 cm] {UDP header}; -\node at (6 cm, 2.2 cm) [mybox, minimum width=2cm, text width=1.7 cm] {UDP Data}; - -\node at (6 cm, 3.3 cm) [mybox, minimum width=2cm, text width=1.7 cm] {Data}; - -\end{tikzpicture} - -\end{center} - -\end{frame} - -\begin{frame}{Network interface} -\protect\hypertarget{network-interface}{} - -\begin{itemize} -\tightlist -\item - Ethernet - - \begin{itemize} - \tightlist - \item - 10BASE5, 10BASE2, 10BASE-T / 100BASE-TX / 1000BASE-TX - \end{itemize} -\item - Wi-Fi - - \begin{itemize} - \tightlist - \item - 802.11a/b/g/n - \end{itemize} -\item - RS-232 -\end{itemize} - -\note{Ethernet: Hubs and switches (that act on this level) is not on -it’s own layer. It is more of a implementation detail in the -architecture diagram. - -RS-232 signaling is used in \emph{all} MCUs, many have several ports -available. It is extremely flexible, both used for implementing -applications and debugging. Frequently an easy way to hack embedded -devices. “USB dongles”, “USB TTL” all use RS-232 signaling. - -Note that this only applies to its logical signals, not voltage levels. -The signaling does not specify any max data rate, very high rates -(\textgreater{}= 1Mbps) is often supported.} - -\end{frame} - -\begin{frame}{Internet} -\protect\hypertarget{internet}{} - -\begin{itemize} -\tightlist -\item - IP -\item - ICMP -\end{itemize} - -\end{frame} - -\begin{frame}{Transport} -\protect\hypertarget{transport}{} - -\begin{itemize} -\tightlist -\item - TCP -\item - UDP -\item - SCTP -\item - QUIC -\end{itemize} - -\end{frame} - -\begin{frame}{Layer 7: Application Layer} -\protect\hypertarget{layer-7-application-layer}{} - -\begin{itemize} -\tightlist -\item - HTTP -\item - DNS -\item - MQTT -\item - CoAP -\item - (everything else..) -\end{itemize} - -\end{frame} - -\begin{frame}{Details: IP Header} -\protect\hypertarget{details-ip-header}{} - -\begin{center} -\scalebox{0.5}{ -\begin{tikzpicture}[ -every node/.style={font=\bfseries}, -basebox/.style={anchor=north west, minimum height=2em, draw, rectangle}, -bitbox/.style={basebox, minimum width=2em}, -bytebox/.style={basebox, minimum width=16em}, -wordbox/.style={basebox, minimum width=32em}, -qwordbox/.style={basebox, minimum width=64em}, -] - -\path -(-9em, 2em) node[basebox, minimum width=5em] {Offsets} -(-9em, 0em) node[basebox, minimum width=5em] {Octet} -(-4em, 2em) node[basebox, minimum width=4em] {Octet} -(-4em, 0em) node[basebox, minimum width=4em] {Bit} -; - -\foreach \x in {0,...,3} - \node[bytebox] at (\x * 16em, 2em) {\scriptsize \x}; -\foreach \x in {0,...,31} - \node[bitbox] at (\x * 2em, 0em) {\scriptsize \x}; - -\foreach \x in {0,32,...,160} - \node[basebox, minimum width=4em] at (-4em, \x * -1/16*1em - 2em) {\scriptsize \x}; - -\foreach \x in {0,4,...,20} - \node[basebox, minimum width=5em] at (-9em, \x * -0.5em - 2em) {\scriptsize \x}; - -\path -(0em, -1 * 2em) node[basebox, minimum width=8em] {Version} -(8em, -1 * 2em) node[basebox, minimum width=8em] {IHL} -(16em, -1 * 2em) node[basebox, minimum width=16em] {TOS} -(32em, -1 * 2em) node[wordbox] {Packet length} - -(0em, -2 * 2em) node[wordbox] {Identification} -(32em, -2 * 2em) node[bitbox] {X} -(34em, -2 * 2em) node[bitbox] {D} -(36em, -2 * 2em) node[bitbox] {M} -(38em, -2 * 2em) node[basebox, minimum width=26em] {Fragement offset} - -(0em, -3 * 2em) node[bytebox] {TTL} -(16em, -3 * 2em) node[bytebox] {Protocol} -(32em, -3 * 2em) node[wordbox] {Header checksum} - -(0em, -4 * 2em) node[qwordbox] {Source ip address} -(0em, -5 * 2em) node[qwordbox] {Destination ip address} -(0em, -6 * 2em) node[qwordbox] {Options (variable length)} - -%(0em, -7 * 2em) node[qwordbox, minimum height=4 em] {Payload} -; - -\end{tikzpicture} -} - -\end{center} - -\end{frame} - -\begin{frame}{Details: UDP Header} -\protect\hypertarget{details-udp-header}{} - -\begin{center} -\scalebox{0.5}{ -\begin{tikzpicture}[ -every node/.style={font=\bfseries}, -basebox/.style={anchor=west, minimum height=2em, draw, rectangle}, -bitbox/.style={basebox, minimum width=2em}, -bytebox/.style={basebox, minimum width=16em}, -wordbox/.style={basebox, minimum width=32em}, -qwordbox/.style={basebox, minimum width=64em}, -] - -\path -(-9em, 2em) node[basebox, minimum width=5em] {Offsets} -(-9em, 0em) node[basebox, minimum width=5em] {Octet} -(-4em, 2em) node[basebox, minimum width=4em] {Octet} -(-4em, 0em) node[basebox, minimum width=4em] {Bit} -; - -\foreach \x in {0,...,3} - \node[bytebox] at (\x * 16em, 2em) {\scriptsize \x}; -\foreach \x in {0,...,31} - \node[bitbox] at (\x * 2em, 0em) {\scriptsize \x}; - -\node[basebox, minimum width=4em] at (-4em, -2em) {\scriptsize 0}; -\node[basebox, minimum width=4em] at (-4em, -4em) {\scriptsize 32}; - -\node[basebox, minimum width=5em] at (-9em, -2em) {\scriptsize 0}; -\node[basebox, minimum width=5em] at (-9em, -4em) {\scriptsize 4}; - -\path -( 0 * 2em, -1 * 2em) node[wordbox] {source port} -(16 * 2em, -1 * 2em) node[wordbox] {destination port} -( 0 * 2em, -2 * 2em) node[wordbox] {length} -(16 * 2em, -2 * 2em) node[wordbox] {checksum} -; - -\end{tikzpicture} -} - -\end{center} - -\end{frame} - -\hypertarget{lecture-mqtt}{% -\section{Lecture: MQTT}\label{lecture-mqtt}} - -\begin{frame}{MQTT} -\protect\hypertarget{mqtt}{} - -\begin{itemize} -\tightlist -\item - \emph{Message Queuing Telemetry Transport} -\item - \href{https://en.wikipedia.org/wiki/MQTT}{Wikipedia: MQTT} -\end{itemize} - -\note{MQTT is \emph{the} standard for IoT applications (and lots of -other useful stuff to). Using HTTP is just silly. - -Supports SSL, and requires TCP. - -Has UDP-like semantics with “fire and forget” but on a higher level (the -message always have to be delivered and ACKed by the broker, not it’s -final recipient. - -Version 3.1.1 er den som gjelder, V 3.1 er rar, de andre finnes ikke -(før standardisering).} - -\end{frame} - -\begin{frame}{Device and application architecture with MQTT} -\protect\hypertarget{device-and-application-architecture-with-mqtt}{} - -\begin{center} -\begin{tikzpicture} - -\path - (-3 cm, 0) node (c1_label) {Device \#1} - ( 0 cm, 0) node (c2_label) {Device \#2} - ( 3 cm, 0) node (c3_label) {Device \#3} - - (0, -3 cm) node (broker_label) {Broker} - (0, -6 cm) node (central_label) {Central} -; - -\node (c1)[draw, circle, fit=(c1_label)] {}; -\node (c2)[draw, circle, fit=(c2_label)] {}; -\node (c3)[draw, circle, fit=(c3_label)] {}; -\node (broker)[draw, rectangle, thick, inner ysep=5 mm, inner xsep=10 mm, fit=(broker_label)] {}; -\node (central) at (central_label) [draw, circle, text width=2 cm] {}; - -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c1) to [bend right] (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c2) -- (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c3) to [bend left] (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (central) -- (broker); - -\end{tikzpicture} - -\end{center} - -\end{frame} - -\begin{frame}{MQTT - Implementations} -\protect\hypertarget{mqtt---implementations}{} - -\begin{itemize} -\tightlist -\item - Mosquitto -\item - Eclipse Paho -\item - RabbitMQ -\item - ActiveMQ -\end{itemize} - -\note{RabbitMQ has a separate connector that must be installed Not sure -about ActiveMQ but it is at least a part of the project so it is -releases at the same time.} - -\end{frame} - -\begin{frame}{MQTT Cloud Connectors} -\protect\hypertarget{mqtt-cloud-connectors}{} - -\begin{itemize} -\tightlist -\item - Cloud - - \begin{itemize} - \tightlist - \item - Amazon IoT - \item - Google Cloud IoT - \item - Microsoft Azure IoT - \item - CloudMQTT (at Heroku) - \end{itemize} -\item - DIY - - \begin{itemize} - \tightlist - \item - ThingMQ - \item - HiveMQ - \end{itemize} -\end{itemize} - -\note{In between are: - -\begin{itemize} -\tightlist -\item - self hosted -\item - Generic bridges -\end{itemize}} - -\end{frame} - -\begin{frame}{MQTT - The protocol} -\protect\hypertarget{mqtt---the-protocol}{} - -Agents have one of two roles: - -\begin{itemize} -\tightlist -\item - \emph{Client} - - \begin{itemize} - \tightlist - \item - Publishes \emph{messages} - \item - Subscribes / unsubscribes to \emph{topics} - \end{itemize} -\item - \emph{Broker} (aka Server) - - \begin{itemize} - \tightlist - \item - Handles network connections - \item - Keeps subscriptions - \item - Manages client - - \begin{itemize} - \tightlist - \item - Disconnects - \item - \emph{(last) will} - \end{itemize} - \item - Persistence of retained messages - \end{itemize} -\end{itemize} - -\note{network connections: this includes removing closed sockets, -client’s that doesn’t respons to timeouts and duplicate clients. - -http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html - -Subscriptions are not permanent. The connection is (unlike HTTP) -stateful. - -Some messages may be persistent, but only one per topic. You will often -end up with a “proper” mq on the backend if queuing is needed. - -Push vs pull, central applications can push to clients} - -\end{frame} - -\begin{frame}{MQTT - The protocol - MQTT Packet} -\protect\hypertarget{mqtt---the-protocol---mqtt-packet}{} - -\begin{itemize} -\tightlist -\item - Size oriented -\item - Flags indicate type of remaining bytes - - \begin{itemize} - \tightlist - \item - Packet type - \item - Topic name - \item - Payload - \end{itemize} -\end{itemize} - -\note{Only packet type + flags (1 byte) is required, everything else is -optional. - -The size field is variable length encoded, 0-127 bytes is 1 byte, -128-16383 use 2 bytes etc, up to 4 bytes for 256MB payload.} - -\end{frame} - -\begin{frame}[fragile]{MQTT Connect} -\protect\hypertarget{mqtt-connect}{} - -\begin{itemize} -\tightlist -\item - \texttt{CONNECT} - - \begin{itemize} - \tightlist - \item - \texttt{clientId} - \item - \texttt{username} - \item - \texttt{password} - \item - \texttt{keepAlive} - \end{itemize} -\end{itemize} - -\begin{itemize} -\tightlist -\item - Keep alive - - \begin{itemize} - \tightlist - \item - \texttt{PINGREQ} - \item - \texttt{PINGRESP} - \end{itemize} -\end{itemize} - -\end{frame} - -\begin{frame}[fragile]{MQTT - The protocol - MQTT Topic} -\protect\hypertarget{mqtt---the-protocol---mqtt-topic}{} - -\begin{itemize} -\tightlist -\item - Topic name: \texttt{foo/bar/baz} -\item - Topic filter - - \begin{itemize} - \tightlist - \item - \texttt{foo/bar/?} - \item - \texttt{foo/\#} - \end{itemize} -\end{itemize} - -\end{frame} - -\begin{frame}[fragile]{MQTT - The protocol - Retained message} -\protect\hypertarget{mqtt---the-protocol---retained-message}{} - -Message is kept by the server even after disconnect - -\begin{itemize} -\tightlist -\item - \texttt{CONNECT} -\item - \texttt{PUBLISH} - - \begin{itemize} - \tightlist - \item - \texttt{RETAIN} - \item - \texttt{\$app/\$device/temperature} - \item - \texttt{22.3} - \end{itemize} -\item - \texttt{DISCONNECT} -\end{itemize} - -Later on: - -\begin{itemize} -\tightlist -\item - \texttt{SUBSCRIBE} - - \begin{itemize} - \tightlist - \item - \texttt{\$app/\#/temperature} - \end{itemize} -\item - \texttt{PUBLISH} - - \begin{itemize} - \tightlist - \item - \texttt{\$app/\$device/temperature} - \item - \texttt{22.3} - \end{itemize} -\end{itemize} - -\note{The last PUBLISH is an incoming message} - -\end{frame} - -\begin{frame}[fragile]{MQTT - The protocol - Will message} -\protect\hypertarget{mqtt---the-protocol---will-message}{} - -Message sent when you disconnect - -Client \#1: - -\begin{enumerate} -[1.] -\tightlist -\item - \texttt{CONNECT} - - \begin{itemize} - \tightlist - \item - \texttt{WILL\ TOPIC:\ \$app/\$device/online} - \item - \texttt{WILL\ PAYLOAD:\ 0} - \end{itemize} -\item - \texttt{PUBLISH} - - \begin{itemize} - \tightlist - \item - \texttt{\$app/\$device/online} - \item - \texttt{1} - \end{itemize} -\item - \texttt{DISCONNECT} -\end{enumerate} - -Broker - -\begin{enumerate} -[1.] -\tightlist -\item - \emph{To all subscribers} \texttt{PUBLISH} - - \begin{itemize} - \tightlist - \item - \texttt{\$app/\$device/online} - \item - \texttt{0} - \end{itemize} -\end{enumerate} - -\end{frame} - -\begin{frame}[fragile]{MQTT Topic} -\protect\hypertarget{mqtt-topic}{} - -The temperature sensor: - -\begin{itemize} -\tightlist -\item - Publishes on: - - \begin{itemize} - \tightlist - \item - \texttt{myapp/\$device-id/temperature} - \item - \texttt{myapp/\$device-id/humidity} - \item - \texttt{myapp/\$device-id/altert} - \end{itemize} -\item - Subscribes to: - - \begin{itemize} - \tightlist - \item - \texttt{myapp/\$device-id/command} - \end{itemize} -\end{itemize} - -The central application: - -\begin{itemize} -\tightlist -\item - Subscribes to: - - \begin{itemize} - \tightlist - \item - \texttt{myapp/\#/temperature} - \item - \texttt{myapp/\#/humidity} - \end{itemize} -\item - Publishes on: - - \begin{itemize} - \tightlist - \item - \texttt{myapp/\$device-id/command} - \end{itemize} -\end{itemize} - -\note{Typical first round of implementation. - -Commands can be: * load new firmware (maybe an URL and firmware -signature). * Set new calibration values * Change reading interval, -altert levels (autonomous operation)} - -\end{frame} - -\begin{frame}[fragile]{MQTT on Arduino} -\protect\hypertarget{mqtt-on-arduino}{} - -PubSubClient is our MQTT client implementation. - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{WiFiClient wifiClient;} -\NormalTok{PubSubClient mqtt(wifiClient);} - -\DataTypeTok{void}\NormalTok{ callback(}\DataTypeTok{char}\NormalTok{* topic,} -\NormalTok{ byte* payload,} - \DataTypeTok{unsigned} \DataTypeTok{int}\NormalTok{ length);} - -\DataTypeTok{void}\NormalTok{ setup() \{} - \CommentTok{// Configure WiFi} -\NormalTok{ mqtt.setServer(mqtt_server, }\DecValTok{1883}\NormalTok{);} -\NormalTok{ mqtt.setCallback(callback);} -\NormalTok{\}} -\end{Highlighting} -\end{Shaded} - -\end{frame} - -\begin{frame}[fragile]{MQTT on Arduino} -\protect\hypertarget{mqtt-on-arduino-1}{} - -\begin{Shaded} -\begin{Highlighting}[] -\DataTypeTok{void}\NormalTok{ loop() \{} - \ControlFlowTok{if}\NormalTok{ (!mqtt.connected())} -\NormalTok{ reconnect();} - \ControlFlowTok{else} -\NormalTok{ mqtt.loop();} - \CommentTok{// Do work} -\NormalTok{\}} - -\DataTypeTok{void}\NormalTok{ reconnect() \{} - \ControlFlowTok{while}\NormalTok{ (!mqtt.}\FunctionTok{connect}\NormalTok{(client_id));} - -\NormalTok{ mqtt.subscribe(topic_pattern);} -\NormalTok{\}} -\end{Highlighting} -\end{Shaded} - -\note{This is blocking!} - -\end{frame} - -\begin{frame}[fragile]{Assignment} -\protect\hypertarget{assignment}{} - -\begin{itemize} -\tightlist -\item - \texttt{mqtt} -\end{itemize} - -\end{frame} - -\begin{frame}[fragile]{MQTT topic architecture} -\protect\hypertarget{mqtt-topic-architecture}{} - -The central application is split: - -\begin{itemize} -\tightlist -\item - An aggregating agent: - - \begin{itemize} - \tightlist - \item - \texttt{myapp/\#/temperature} - \item - \texttt{myapp/\#/humidity} - \end{itemize} -\item - Emailing agent - - \begin{itemize} - \tightlist - \item - \texttt{myapp/\$device-id/altert} - \end{itemize} -\item - Publishes on: - - \begin{itemize} - \tightlist - \item - \texttt{myapp/\$device-id/command} - \end{itemize} -\end{itemize} - -\end{frame} - -\begin{frame}{MQTT topic architecture} -\protect\hypertarget{mqtt-topic-architecture-1}{} - -\begin{center} -\begin{tikzpicture} - -\path - (-3 cm, 0) node (c1_label) {Device \#1} - ( 0 cm, 0) node (c2_label) {Device \#2} - ( 3 cm, 0) node (c3_label) {Device \#3} - - (0, -3 cm) node (broker_label) {Broker} - (0, -6 cm) node (central_label) {Central} -; - -\node (c1)[draw, circle, fit=(c1_label)] {}; -\node (c2)[draw, circle, fit=(c2_label)] {}; -\node (c3)[draw, circle, fit=(c3_label)] {}; -\node (broker)[draw, rectangle, thick, inner ysep=5 mm, inner xsep=10 mm, fit=(broker_label)] {}; -\node (central) at (central_label) [draw, circle, text width=2 cm] {}; - -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c1) to [bend right] (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c2) -- (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c3) to [bend left] (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (central) -- (broker); - -\end{tikzpicture} - -\end{center} - -\end{frame} - -\begin{frame}{MQTT topic architecture} -\protect\hypertarget{mqtt-topic-architecture-2}{} - -\begin{center} -\begin{tikzpicture} - -\path - (-3 cm, 0) node (c1_label) {Device \#1} - ( 0 cm, 0) node (c2_label) {Device \#2} - ( 3 cm, 0) node (c3_label) {Device \#3} - - (0, -3 cm) node (broker_label) {Broker} - - (-2 cm, -6 cm) node (agg_label) {Aggregator} - ( 2 cm, -6 cm) node (email_label) {Email} -; - -\node (c1)[draw, circle, fit=(c1_label)] {}; -\node (c2)[draw, circle, fit=(c2_label)] {}; -\node (c3)[draw, circle, fit=(c3_label)] {}; -\node (broker)[draw, rectangle, thick, inner ysep=5 mm, inner xsep=10 mm, fit=(broker_label)] {}; -\node (agg) at (agg_label) [draw, circle, text width=2 cm] {}; -\node (email) at (email_label) [draw, circle, text width=2 cm] {}; - -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c1) to [bend right] (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c2) -- (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (c3) to [bend left] (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (agg) -- (broker); -\draw[{Latex[length=4mm, round]}-{Latex[length=4mm, round]}] (email) -- (broker); - -\end{tikzpicture} - -\end{center} - -\end{frame} - -\begin{frame}{MQTT - Patterns} -\protect\hypertarget{mqtt---patterns}{} - -\begin{itemize} -\tightlist -\item - Combining MQTT and HTTP -\item - Using web sockets transport -\end{itemize} - -\end{frame} - -\begin{frame}[fragile]{Assignment} -\protect\hypertarget{assignment-1}{} - -\begin{itemize} -\tightlist -\item - \texttt{mqtt2} -\end{itemize} - -\end{frame} - -\begin{frame}[fragile]{Assignment} -\protect\hypertarget{assignment-2}{} - -\begin{itemize} -\tightlist -\item - \texttt{mqtt3} -\end{itemize} - -\note{discussion: how to connect these two devices?} - -\end{frame} diff --git a/slides/what-is-iot-text.pdf b/slides/what-is-iot-text.pdf deleted file mode 100644 index 68d20f7..0000000 Binary files a/slides/what-is-iot-text.pdf and /dev/null differ diff --git a/slides/what-is-iot.md b/slides/what-is-iot.md deleted file mode 100644 index 01e6477..0000000 --- a/slides/what-is-iot.md +++ /dev/null @@ -1,717 +0,0 @@ ---- -title: "IoT Workshop" -author: Trygve Laugstøl \ -header-includes: - - \hypersetup{colorlinks=true, - allbordercolors={0 0 0}, - pdfborderstyle={/S/U/W 1}} - - \usepackage{tikz} - \usetikzlibrary{angles,arrows,arrows.meta,backgrounds,calc,chains,decorations,decorations.pathmorphing,decorations.pathreplacing,decorations.text,fit,matrix,positioning,quotes,shapes.arrows,shapes.geometric,shapes.symbols} -!ifndef(QUICK) -~~~~~~ - - \usepackage{fontspec} - \setsansfont{Verdana} -~~~~~~ - ---- - -# NodeMCU - -!comment(aka NodeMCU aka ESP-12) - -## NodeMCU hardware - -!ifndef(QUICK)( -![](images/NodeMCU-–-Board-de-desarrollo-con-módulo-ESP8266-WiFi-y-Lua-4.jpg) -) - -## NodeMCU hardware - -!ifndef(QUICK)( -\begin{center} -!include(images/nodemcu.pgf) -\end{center} -) - -## ESP8266 software layers - -!ifndef(QUICK)( -\begin{center} -!include(images/esp+arduino-sdks.pgf) -\end{center} -) - -## ESP8266 + Arduino - -* Standard Arduino IDE -* ESP8266 Arduino core - * https://github.com/esp8266/Arduino - -## Arduino IDE - -!ifndef(QUICK)( -![](images/arduino-ide.png) -) - -## Arduino code structure - -~~~ .c++ -void setup() { - // Called once -} - -void loop() { - // Called repeatedly -} -~~~ - -::: notes - -MCU programming is often structured into: - -* Configure - * CPU - * GPIO ports - * MCU's peripherals - * The rest of the board - * Configure application and callbacks. -* Sleep - -Arduino chooses to run the cpu at 100% instead of the sleep step.. - -::: - -## Arduino file structure - - foo/ - foo.ino - config.h - -::: notes - -`foo.ino` must always be in a `foo` directory. - -config.h is created by "new tab". - -::: - -## Generic Arduino APIs - -~~~c++ -// Pin: D0, D1, etc. -// Mode: OUTPUT, INPUT, INPUT_PULLUP -void pinMode(uint8_t pin, uint8_t mode); - -// State: HIGH, LOW, true/false, 1/0 -void digitalWrite(uint8_t pin, uint8_t state); -int digitalRead(uint8_t pin); - -unsigned long now millis(); -unsigned long now micros(); -~~~ - -## ESP Arduino APIs - -~~~c++ -class { - void restart(); - uint32_t getFreeHeap(); - uint32_t getChipId(); - - ... -} ESP; - -// Usage -ESP.restart(); -~~~ - -## ESP Arduino APIs - -~~~c++ -class { - String macAddress(); - - wl_status_t status(); - int32_t RSSI(); - - IPAddress localIP(); - IPAddress subnetMask(); - IPAddress gatewayIP(); - IPAddress dnsIP(uint8_t dns_no = 0); - - ... -} WiFi; - -// Usage: - -Serial.println(WiFi.localIP().toString()); -~~~ - -::: notes - -http://arduino-esp8266.readthedocs.io/en/latest/libraries.html - -::: - -# What is IoT - -## What is IoT - -* Not "a computer connected to the internet" - * Then it is really just another computer connected to the internet - -* Must be something else - * It is simply devices that are resource constrained - * Usually in more than one way - -* Autonomous operation, the connection might not be permanent - -## IoT is just a concept - -* *The Internet of Things (IoT) is the network of physical devices, - vehicles, home appliances and other items embedded with - electronics, software, sensors, actuators, and connectivity which - enables these objects to connect and exchange data.*^[ - Wikipedia "Internet of Things"] - -## What is an IoT Device? - -::: notes - -As for their definition. - -What differentiates a computer from an IoT device? - -::: - -## What is an IoT Device? - -* Constrained in (one or more of): - * Memory - * CPU - * Network bandwidth and/or latency - * Storage -* Has connectivity - * Bluetooth - * Wi-Fi - * NB-IoT - * LTE Cat-M - * LoRA - * Proprietary radio - -::: notes - -Might not have: - -* RTC - -Extra features: - -* IR -* UART -* CAN - -Sparkfun and Adafruit etc sell modules with all of these technologies. - -::: - -## IoT Devices - Bluetooth 4/5 chips - -Chip CPU Freq RAM Flash Price --------- ---------- ------ ---- ----- ------ -nRF52810 Cortex-M4 64 MHz 24k 192k $1.88 -nRF52832 Cortex-M4F 32k 256k $2.54 - 64k 512k $2.59 -nRF52840 Cortex-M4F 256k 1024k $3.85 - -* nRF52810: High performance, entry-level Bluetooth 4/ANT/2.4GHz SoC -* nRF52832: High performance Bluetooth 4/ANT/2.4GHz SoC -* nRF52840: Advanced multi-protocol System-on-Chip Supporting: Bluetooth 5, ANT/ANT+, 802.15.4 and 2.4GHz proprietary - -::: notes - -All quantities are 1000 pieces - -nRF51: https://www.digikey.no/products/en/rf-if-and-rfid/rf-transceiver-ics/879?k=nrf51822 - -nRF52832: these have different packagings, not only difference price - -https://www.digikey.no/products/en/rf-if-and-rfid/rf-transceiver-ics/879?FV=1c0001%2Cffe0036f&quantity=3000&ColumnSort=1000011&page=1&k=nrf52832&pageSize=500&pkeyword=nrf52810 - -nRF52810: High performance, entry-level Bluetooth 4/ANT/2.4GHz SoC -nRF52832: High performance Bluetooth 4/ANT/2.4GHz SoC -nRF52840: Advanced multi-protocol System-on-Chip Supporting: Bluetooth 5, ANT/ANT+, 802.15.4 and 2.4GHz proprietary - -::: - -## IoT Devices - LoRA - -### Modules - -Module Data Rate Price ------ --------- ------ -RN2483A-I/RM104 $12.05 @ 250 -CMWX1ZZABZ-078 SX1276 $10.74 @ 1000 -RF-LORA-868-SO SX1272 $16.55 @ 1000 - -### Chips - -Chip Price ----- ------- -SX1281 $3.23 -SX1272 $4.25 -SX1276 $4.25 -SX1279 $4.74 - -::: notes - -These modules require an external MCU, so does the chips. - -::: - -## IoT Devices - NB-IoT - -Module Price ------- ----- -uBlox SARA-N210 ~$10 @ 100 -Sierra Wireless HL7800_1103933 $15.72 - -## IoT Devices - Wi-Fi - -Chip CPU Freq ROM RAM Price ------ ------- ------- ----- ------ ------ -ESP8266 Tensilica L106 160 MHz N/A ~50 kB < $1 - -ESP32 - dual cpu, Wi-Fi, Bluetooth 4 -ESP32-D0WDQ6 2x Xtensa @ 160MHz $ 4.53 @ 10 - -::: notes - -The ESP8266's RAM depends on which firmware stack is used. Physical is probably 128k or most likely 64k. - -::: - -## ESP8266 details - Power usage - -+--------------------------+----------------+ -| State | Current usage | -+==========================+===============:+ -| Off | 0.5 µA | -+--------------------------+----------------+ -| Deep sleep with RTC | 20 µA | -+--------------------------+----------------+ -| Light sleep (with Wi-Fi) | 1 mA | -+--------------------------+----------------+ -| Sleep with peripherials | 15 mA | -+--------------------------+----------------+ -| TX | 170 mA | -+--------------------------+----------------+ - -::: notes - -Datasheet page 18 - -::: - -# Going back to basics - -## What is the internet again? - -## TCP/IP Layers - -!ifndef(QUICK)( -\begin{center} -!include(images/tcpip.pgf) -\end{center} -) - -## Packet encapsulation - -!ifndef(QUICK)( -\begin{center} -!include(images/ip-encapsulation.pgf) -\end{center} -) - -## Network interface - -* Ethernet - * 10BASE5, 10BASE2, 10BASE-T / 100BASE-TX / 1000BASE-TX -* Wi-Fi - * 802.11a/b/g/n -* RS-232 - -::: notes - -Ethernet: Hubs and switches (that act on this level) is not on it's own -layer. It is more of a implementation detail in the architecture diagram. - -RS-232 signaling is used in *all* MCUs, many have several ports -available. It is extremely flexible, both used for implementing -applications and debugging. Frequently an easy way to hack embedded -devices. "USB dongles", "USB TTL" all use RS-232 signaling. - -Note that this only applies to its logical signals, not voltage -levels. The signaling does not specify any max data rate, very high rates -(>= 1Mbps) is often supported. - -::: - -## Internet - -* IP -* ICMP - -## Transport - -* TCP -* UDP -* SCTP -* QUIC - -## Layer 7: Application Layer - -* HTTP -* DNS -* MQTT -* CoAP -* (everything else..) - -!comment -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## Details: IP - -!ifdef(REVEAL) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -![](images/ip-header.svg) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -!ifdef(BEAMER) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -!ifndef(QUICK)(![](images/ip-header.pdf)) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -::: notes - -Note that the "total length" field is 16 bits, 2 bytes, it's maximum value is 64k, 65536. - -::: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -## Details: IP Header - -!ifndef(QUICK)( -\begin{center} -!include(images/ip-header.pgf) -\end{center} -) - -## Details: UDP Header - -!ifndef(QUICK)( -\begin{center} -!include(images/udp-header.pgf) -\end{center} -) - -# Lecture: MQTT - -## MQTT - -* *Message Queuing Telemetry Transport* -* [Wikipedia: MQTT](https://en.wikipedia.org/wiki/MQTT) - -::: notes - -MQTT is *the* standard for IoT applications (and lots of other useful -stuff to). Using HTTP is just silly. - -Supports SSL, and requires TCP. - -Has UDP-like semantics with "fire and forget" but on a higher level -(the message always have to be delivered and ACKed by the broker, not -it's final recipient. - -Version 3.1.1 er den som gjelder, V 3.1 er rar, de andre finnes ikke -(før standardisering). - -::: - -## Device and application architecture with MQTT - -!ifndef(QUICK)( -\begin{center} -!include(images/mqtt-example-architecture.pgf) -\end{center} -) - -## MQTT - Implementations - -* Mosquitto -* Eclipse Paho -* RabbitMQ -* ActiveMQ - -::: notes - -RabbitMQ has a separate connector that must be installed -Not sure about ActiveMQ but it is at least a part of the project so it is releases at the same time. - -::: - -## MQTT Cloud Connectors - -* Cloud - * Amazon IoT - * Google Cloud IoT - * Microsoft Azure IoT - * CloudMQTT (at Heroku) - -* DIY - * ThingMQ - * HiveMQ - -::: notes - -In between are: - -* self hosted -* Generic bridges - -::: - -## MQTT - The protocol - -Agents have one of two roles: - -* *Client* - * Publishes *messages* - * Subscribes / unsubscribes to *topics* - -* *Broker* (aka Server) - * Handles network connections - * Keeps subscriptions - * Manages client - * Disconnects - * *(last) will* - * Persistence of retained messages - -::: notes - -network connections: this includes removing closed sockets, client's that doesn't respons to timeouts and duplicate clients. - -http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html - -Subscriptions are not permanent. The connection is (unlike HTTP) -stateful. - -Some messages may be persistent, but only one per topic. You will -often end up with a "proper" mq on the backend if queuing is needed. - -Push vs pull, central applications can push to clients - -::: - -## MQTT - The protocol - MQTT Packet - -* Size oriented -* Flags indicate type of remaining bytes - * Packet type - * Topic name - * Payload - -::: notes - -Only packet type + flags (1 byte) is required, everything else is optional. - -The size field is variable length encoded, 0-127 bytes is 1 byte, 128-16383 use 2 bytes etc, up to 4 bytes for 256MB payload. - -::: - -## MQTT Connect - -* `CONNECT` - * `clientId` - * `username` - * `password` - * `keepAlive` - - - -* Keep alive - * `PINGREQ` - * `PINGRESP` - -## MQTT - The protocol - MQTT Topic - -* Topic name: `foo/bar/baz` -* Topic filter - * `foo/bar/?` - * `foo/#` - -## MQTT - The protocol - Retained message - -Message is kept by the server even after disconnect - -* `CONNECT` -* `PUBLISH` - * `RETAIN` - * `$app/$device/temperature` - * `22.3` -* `DISCONNECT` - -Later on: - -* `SUBSCRIBE` - * `$app/#/temperature` -* `PUBLISH` - * `$app/$device/temperature` - * `22.3` - -::: notes - -The last PUBLISH is an incoming message - -::: - -## MQTT - The protocol - Will message - -Message sent when you disconnect - -Client #1: - -1. `CONNECT` - * `WILL TOPIC: $app/$device/online` - * `WILL PAYLOAD: 0` -1. `PUBLISH` - * `$app/$device/online` - * `1` -1. `DISCONNECT` - -Broker - -1. *To all subscribers* `PUBLISH` - * `$app/$device/online` - * `0` - -## MQTT Topic - -The temperature sensor: - -* Publishes on: - * `myapp/$device-id/temperature` - * `myapp/$device-id/humidity` - * `myapp/$device-id/altert` -* Subscribes to: - * `myapp/$device-id/command` - -The central application: - -* Subscribes to: - * `myapp/#/temperature` - * `myapp/#/humidity` -* Publishes on: - * `myapp/$device-id/command` - -::: notes - -Typical first round of implementation. - -Commands can be: -* load new firmware (maybe an URL and firmware signature). -* Set new calibration values -* Change reading interval, altert levels (autonomous operation) - -::: - -## MQTT on Arduino - -PubSubClient is our MQTT client implementation. - -~~~c++ -WiFiClient wifiClient; -PubSubClient mqtt(wifiClient); - -void callback(char* topic, - byte* payload, - unsigned int length); - -void setup() { - // Configure WiFi - mqtt.setServer(mqtt_server, 1883); - mqtt.setCallback(callback); -} -~~~ - -## MQTT on Arduino - -~~~c++ -void loop() { - if (!mqtt.connected()) - reconnect(); - else - mqtt.loop(); - // Do work -} - -void reconnect() { - while (!mqtt.connect(client_id)); - - mqtt.subscribe(topic_pattern); -} -~~~ - -::: notes -This is blocking! -::: - -## Assignment - -* `mqtt` - -## MQTT topic architecture - -The central application is split: - -* An aggregating agent: - * `myapp/#/temperature` - * `myapp/#/humidity` -* Emailing agent - * `myapp/$device-id/altert` - -* Publishes on: - * `myapp/$device-id/command` - -## MQTT topic architecture - -!ifndef(QUICK)( -\begin{center} -!include(images/mqtt-example-architecture.pgf) -\end{center} -) - -## MQTT topic architecture - -!ifndef(QUICK)( -\begin{center} -!include(images/mqtt-example-architecture2.pgf) -\end{center} -) - -## MQTT - Patterns - -* Combining MQTT and HTTP -* Using web sockets transport - -## Assignment - -* `mqtt2` - -## Assignment - -* `mqtt3` - -::: notes - -discussion: how to connect these two devices? - -::: -- cgit v1.2.3