![IoT Architecture Overview](images/iot.architecture-overview.png)
notes:
* https://www.avsystem.com/blog/what-is-iot-architecture/
## M2M
(Machine-to-Machinie)
> M2M is a broad label that can be used to describe any technology that enables networked devices to exchange information and perform actions without the manual assistance of humans.
> -- ([IoT Agenda](https://internetofthingsagenda.techtarget.com/definition/machine-to-machine-M2M))
![The Impact of Connectivity Technologies on the Power Consumption](images/the.impact.of.connectivity.technologies.on.the.power.consumption.png)
Notes:
* https://www.saftbatteries.com/energizing-iot/impact-communication-technology-protocol-your-iot-application%E2%80%99s-power-consumption
![Distance of Communication Technologies](images/distance.of.communication.technologies.jpg)
![Communication Range Simplified](images/communication.range.png)
![Communicaton Protocols in ISO/OSI Model](images/iot.protocols.in.osi.iso.model.png)
Notes:
* http://selvarajkesavan.blogspot.com/2019/01/iot-device-communication-protocols-it.html
![Popular IoT Protocols](images/common.iot.protocols.png)
Notes:
* https://www.daviteq.com/blog/en/what-are-the-most-popular-iot-protocols/
![ESP32](images/esp32.png)
![ESP32 Block Diagram](images/esp32.block.diagram.svg)
* notes:
* https://en.wikipedia.org/wiki/ESP32
## WiFi Support
* _802.11 b/g/n_
* IEEE 802.11 standard security features all supported, including WFA, WPA/WPA2 and WAPI
* can operate as an _Access Point_
notes:
* https://en.wikipedia.org/wiki/ESP32
[![IFTTT](images/ifttt.png)](https://ifttt.com)
![IFTTT Recipe](images/ifttt-recipe.png)]
notes:
* https://medium.com/@imatrof/11-top-ifttt-recipes-to-increase-your-productivity-eed473789abd
## What is MQTT?
* [MQTT](https://en.wikipedia.org/wiki/MQTT) (Message Queue Telemetry Transport)
* lightweight publish-subscribe protocol that is used on top of TCP/IP
* designed to _M2M_ communications
* uses _publisher/subscriber pattern_ and _MQ model_
* becoming one of the main protocols for _IoT_
Notes:
* https://pagefault.blog/2017/03/02/using-local-mqtt-broker-for-cloud-and-interprocess-communication/
* https://www.youtube.com/watch?v=eS4nx6tLSLs
* http://www.steves-internet-guide.com/mqtt/
![Publish-subscribe Architecture](images/publish-subscribe.architecture.png)
Notes:
* https://blog.securitycompass.com/publish-subscribe-threat-modeling-11add54f1d07
## The Basics
* broker
* topics
* publisher
* subscriber
* message
IoT Example
[![Mosquitto](images/logo-mosquitto.png)](https://mosquitto.org/)
## [Eclipse Mosquitto™](https://mosquitto.org/)
* an open source lightweight MQTT broker
* implements the MQTT protocol versions 3.1 and 3.1.1
* install with
`sudo apt install mosquitto`
`sudo apt install mosquitto-clients`
## `mosquitto_pub`
* client for publishing simple messages
* syntax:
`mosquitto_pub -h host -t topic -m message`
Notes:
* man mosquitto_pub
## `mosquitto_sub`
* client for subscribing to topics
* syntax:
`mosquitto_sub -h host -t topic [-F format]`
* example:
`mosquitto_sub -h localhost -t '#' -F "%t: %p"`
Notes:
* man mosquitto_sub
## Topics
* string used by broker to filter messages
* consist of one/more topic levels
* topic level separator is '`/`'
* topics don't need to be initialized first
* cAsE sEnsItIvE
* allows to use wildcards when subscribing:
* '`#`' - multi level
* '`+'` - single level
Notes:
* https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices
Slovensko/Košice/Letná 9/IoT Lab
home/ground/livingroom/temperature
## MQTT and ESP32
* package `umqtt`
## Get Ready for Watson
* no direct support for _Watson_
* install appropriate package with `upip`
* _MicroPython_ version of `pip`
* packages for _MicroPython_ have prefix `micropython-`
* install `micropython-watson-iot` package:
```python
import upip
upip.install('micropython-watson-iot')
```
## ESP32 with Watson
```python
from watson_iot import Device
device = Device(device_id='esp32-dht22',
device_type='my-device-type',
token='my-device-token')
device.connect()
device.publishEvent('temperature',
{'degrees': 30.7, 'unit': 'C'}
)
```
## The Final Code
```python
# imports ...
sensor = DHT11(Pin(23))
device = Device(device_id='esp32-with-dht22',
device_type='type', token='token')
device.connect()
while True:
sensor.measure()
temp = sensor.temperature()
device.publishEvent('temperature', {'degrees': temp,
'unit': 'C'})
sleep(10)
```