Remote Data Acquisition and IoT

Post on 18-Dec-2021

3 views 0 download

transcript

Remote Data Acquisition and IoT

Chaiporn Jaikaeo

Department of Computer EngineeringKasetsart University

01219335 Data Acquisition and Integration

Revised 2021-09-08Materials partly taken from lecture slides by Karl and Willig

2

Outline•Remote data acquisition•Communication pattern in IoT•MQTT protocol

•Programming examples

3

IoT Reference Model

https://insightaas.com/new-iot-reference-model-creates-common-tongue/

4

sensor field

Remote Data Acquisition• Sensor nodes communicate to a gateway via radio links

radio linksRemote

monitoring

Network

gateway

5

Data-Centric Networking• Typical networking interaction is node-centric

◦ Client/server, peer-to-peer

•Desirable properties for IoT applications◦ Decoupling in space – neither sender nor receiver may need to

know their partner◦ Decoupling in time – ”answer” not necessarily directly triggered by

“question”, asynchronous communication

6

Content-Centric Networking Model

Internet

Data

InterestInterest

Data

Topic + Data

7

Publish/Subscribe Interaction• Idea

◦ Entities can publish data under certain names◦ Entities can subscribe to updates of such named data

•Variations◦ Topic-based◦ Content-based

Software bus

Publisher 1 Publisher 2

Subscriber 1 Subscriber 2 Subscriber 3

8

MQTT Protocol•Message Queue Telemetry Transport• Light-weight messaging protocol designed for connecting

edge IoT devices

•Uses publish/subscribe pattern to interconnect devices•Operates on top of TCP, but works well with intermittently

connected links

9

MQTT Operation

MQTT BrokerTopic: office/room2/tempPayload: 26

publish

Topic: office/room2/temp

subscribe

Topic: office/room2/temp

Payload:26

subscribe

Topic: o

ffice/+/

temp

Topic: o

ffice/ro

om2/temp

Payload:

26

MQTT clients

10

Advantages of MQTT•Decouples publishers and subscribers•Allows message reception without long polling•Uses very short message headers

• Supports multiple quality of services•Allows NAT traversal

11

MQTT vs. HTTP•HTTP

•MQTT

request

response

broker

Icon made by Smashicons from www.flaticon.com

subscribe

publishpublishsubscribe

publishsubscribe

publish

13

MQTT Client Libraries• Eclipse Paho Project

◦ Various implementations for many platforms and languages

•MicroPython’s umqtt module◦ Light-weight MQTT client implementation◦ Two variations

◦ umqtt.simple◦ umqtt.robust

◦ Already built into standard MicroPython firmware

14

Public MQTT Brokers•HiveMQ

◦ broker.hivemq.com

•Mosquitto◦ test.mosquitto.org

•Many more can be found on◦ https://github.com/mqtt/mqtt.github.io/wiki/public_brokers

15

MQTT Topic Naming•A topic name consists of one or more topic levels

(UTF-8 strings), separated by a forward slashes• E.g.,

• Topics are case-sensitive◦ ku/cpe is not the same as Ku/Cpe

ku/cpe/room204/temperaturetopic level topic level topic level topic level

topic level separator

16

Subscription Wildcards•Wildcards may be used for subscription• Single-level wildcard (+)

◦ Replaces only one topic

•Multi-level wildcard (#)◦ Replaces many topic levels◦ MUST be placed at the end of a topic

• Some best practices are described here:◦ https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-

topics-best-practices

ku/cpe/+/temperature

ku/cpe/#

17

MQTT: Stack

MQTT

SSL (optional)

TCP

IP

Application

default port: 1883 default port:

8883

18

MQTT Connection and Keep AliveMQTTClient

MQTTBroker

CONNECTCONNACK

SUBSCRIBESUBACK

PUBLISH

PUBLISH

PINGREQPINGRESP

Connectionestablishment

Regularactivities

Keep alive

DISCONNECT⋮

Disconnection

19

Quality of Service (QoS) Levels•QoS 0 - at most once

◦ Fire and forget

•QoS 1 - at least once◦ Msg gets resent until PUBACK

is received

•QoS 2 - exactly once◦ Achieved through four-way

handshake

https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/

20

Last Will & Testament (LWT)• IoT devices may get disconnected ungracefully

◦ Unstable wireless connection◦ Battery depletion

•A client can publish a LWT in advance• In case of unexpected disconnection of the client, all

subscribed clients will get a message from the broker

21

Retained Messages•A newly subscribed client may have missed previously

published data•A message published with the retain flag set will be

delivered to a newly subscribed client

22

Scenario 1 – Publishing Data

Internet

MQTT Broker

periodically publishlight status

subscribe for light status

Light sensor

23

Device Operation•Connect KidBright to the local WiFi (e.g., KUWIN)•Connect to a local MQTT broker•Measure and publish light value every 2 seconds to the

topic ku/cpe/room204/light

24

Code: I/O Setup•Create an ADC object associated with Pin 36

from machine import Pin, ADC

ldr = ADC(Pin(36))

25

Code: WiFi Connection• Create WLAN connection with WLAN class in the network module

• Replace SSID and PASS with appropriate values

• wlan.connect() method is not blocking, so the code keeps checking wlan.isconnected()to ensure connectivity before further proceeding

• Use on-board red LED (IO2) for WiFi connection indicator

import timeimport networkfrom machine import Pin

led_wifi = Pin(2, Pin.OUT)led_wifi.value(1) # turn it off

wlan = network.WLAN(network.STA_IF)wlan.active(True)print("*** Connecting to WiFi...")wlan.connect("SSID","PASS")while not wlan.isconnected():

time.sleep(0.5)print("*** Wifi connected")led_wifi.value(0)

26

Code: MQTT Broker Connection• Replace UNIQUE-ID and BROKER with appropriate values

• mqtt.connect() blocks until a connection is successfully established

• Use on-bard green LED (IO12) to indicate broker connection

from umqtt.robust import MQTTClient

led_iot = Pin(12, Pin.OUT)led_iot.value(1) # turn it off

mqtt = MQTTClient("UNIQUE-ID","BROKER")print("*** Connecting to MQTT broker...")mqtt.connect()print("*** MQTT broker connected")led_iot.value(0)

27

Code: Publishing Light Values• mqtt.publish() method requires strings or byte arrays for both

topic and payload arguments

while True:value = ldr.read()print("Publish light:", value)mqtt.publish("ku/cpe/room204/light", str(value))time.sleep(2)

28

Scenario 2 – Subscribing

Internet

MQTT Broker

- subscribe for lamp control- set lamp status

publish LED value

Connect USB lamp here

29

Device Operation•Connect KidBright to the local WiFi (e.g., KUWIN)•Connect to a local MQTT broker•Connect USB lamp to KidBright's USB port

• Subscribe to ku/cpe/room204/lamp and use the published value to change the lamp status◦ Payload is 0 → turn the lamp off◦ Payload is 1 → turn the lamp on◦ Other payloads should be properly ignored

30

Code: I/O Setup• USB-switch output is connected

to IO25◦ Logic 1 à Power off◦ Logic 0 à Power on

from machine import Pin

lamp = Pin(25, Pin.OUT)lamp.value(1) # turn it off

31

Code: WiFi Setup•Connect to WiFi with

appropriate SSID and PASS•Again, use the on-board red

LED for WiFi connection indicator

import timeimport networkfrom machine import Pin

led_wifi = Pin(2, Pin.OUT)led_wifi.value(1) # turn it off

wlan = network.WLAN(network.STA_IF)wlan.active(True)print("*** Connecting to WiFi...")wlan.connect("SSID","PASS")while not wlan.isconnected():

time.sleep(0.5)print("*** Wifi connected")led_wifi.value(0)

32

Code: MQTT and Subscription• Replace UNIQUE-ID and BROKER

with appropriate values

• Call mqtt.set_callback()method to set the callback function before making any subscription

• Call mqtt.check_msg()regularly to check for incoming messages

• sub_callback() is called automatically with byte arrays in topic and payload arguments

from umqtt.robust import MQTTClient

led_iot = Pin(12, Pin.OUT)led_iot.value(1) # turn it off

def sub_callback(topic,payload):if topic == b"ku/cpe/room204/lamp":

try:lamp.value(1-int(payload))

except ValueError:pass

mqtt = MQTTClient("UNIQUE-ID","BROKER")print("*** Connecting to MQTT broker...")mqtt.connect()print("*** MQTT broker connected")led_iot.value(0)

mqtt.set_callback(sub_callback)mqtt.subscribe(b"ku/cpe/room204/lamp")

while True:mqtt.check_msg()

33

Conclusion• IoT devices are typically resource-constrained and

operating under unreliable Internet connections•Data-centric communication where devices are decoupled

in both time and space is desirable for IoT•MQTT is a light-weight and disconnection-tolerant protocol

that allows devices to interact with pub/sub pattern

34

Exercise 4.1: Dimmable IoT Lamp•Modify the last example so that user can control the

brightness of the USB lamp by publishing a value between 0-100 to ku/daq2021/<nickname>/lamp◦ Payload is 0 → Lamp is completely off◦ Payload is 100 → Lamp is completely on◦ Payload is any value between 0 to 100 → Lamp’s brightness is

adjusted accordingly (the greater, the brighter)◦ Other payloads should be properly ignored without crashing the

program

35

Further Readings•HiveMQ’s MQTT Essentials

◦ https://www.hivemq.com/mqtt-essentials/

•MQTT standard v3.1.1◦ http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-

os.pdf

•MQTT standard v5.0◦ https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.pdf

•umqtt’s source code and API reference◦ https://github.com/micropython/micropython-

lib/tree/master/umqtt.simple