Laboratorul 06: Web Programming and APIs, Data Visualization, si Mesaje MQTT

Scopul Laboratorului:

În acest laborator, studenții vor învăța:

  • Cum să obțină date dintr-un API gratuit fără cheie.
  • Cum să parseze datele JSON primite de la API.
  • Cum să creeze mai multe tipuri de grafice pentru a vizualiza datele, folosind libraria Matplotlib.
  • Cum să trimită și să primească mesaje folosind MQTT pentru comunicația IoT.

Notiuni Teoretice

1. Ce este un API?

Un API (Application Programming Interface) este un set de reguli și protocoale care permite unei aplicații să acceseze date sau funcționalități dintr-o altă aplicație.

2. JSON (JavaScript Object Notation)

JSON este un format de schimb de date simplu și ușor de citit, folosit pentru transmiterea de date structurate.

3. Matplotlib

Matplotlib este o librărie de vizualizare pentru Python, utilizată pentru a crea o varietate de grafice, inclusiv grafice liniare, diagrame de bare și grafice de tip pie.

4. MQTT

MQTT (Message Queuing Telemetry Transport) este un protocol de mesagerie ușor pentru IoT, utilizat pentru a comunica între dispozitive prin topicuri la care se abonează și publică date.

Configurarea Mediului de Lucru

Plecând de la configurarea pentru laboratorul precendent va fi necesară adăugarea unor noi librării:

  • matplotlib
  • paho-mqtt

Ambele librării vor fi necesare pentru crearea subscriber-ului. Pentru simplitate recomandăm utilizarea Python pentru crearea acestuia. Scopul subscriber-ului în cadrul acestui laborator va fi de a crea o agregare vizuală a datelor.

Instalarea librăriilor Python

Instalați librăriile necesare cu ajutorul comenzii:

pip install requests matplotlib paho-mqtt

Extragerea Datelor de la Open-Meteo API

Vom folosi API-ul gratuit de la Open-Meteo pentru a obține date despre prognoza meteo. URL-ul API-ului:

https://api.open-meteo.com/v1/forecast?latitude=44.4268&longitude=26.1025&hourly=temperature_2m

meteo.py
import requests
 
url = "https://api.open-meteo.com/v1/forecast?latitude=44.4268&longitude=26.1025&hourly=temperature_2m"
 
response = requests.get(url)
 
if response.status_code == 200:
    data = response.json()
    temperatures = data['hourly']['temperature_2m']
    times = data['hourly']['time']
    for time, temp in zip(times[:10], temperatures[:10]):
        print(f"{time}: {temp}°C")
else:
    print("Eroare la obținerea datelor. Cod status:", response.status_code)

Vizualizarea Datelor

Codul pentru Vizualizare - Tipuri Multiple de Grafice:

view_data.py
import matplotlib.pyplot as plt
 
plt.figure(figsize=(10, 5))
plt.plot(times[:10], temperatures[:10], marker='o', label="Temperatura (°C)")
plt.xticks(rotation=45)
plt.title("Evolutia Temperaturii in Bucuresti")
plt.xlabel("Ora")
plt.ylabel("Temperatura (°C)")
plt.legend()
plt.show()

Trimiterea și Recepționarea Mesajelor „Hello World” folosind MQTT

Pentru a trimite și primi mesaje „Hello World” folosind MQTT, vom folosi `umqtt` pentru publicare pe Raspberry Pi și `paho-mqtt` pentru abonare pe laptop.

Exemplu de cod pentru Publicare pe Raspberry Pi utilizând umqtt

hello.py
import network
import time
from umqtt.simple import MQTTClient
 
ssid = 'Numele_Retelei'
password = 'Parola_Retelei'
mqtt_server = 'IP-ul_Brokerului'
topic = "test/topic"
client_id = "pico_publisher"
 
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while not wlan.isconnected():
    time.sleep(1)
 
client = MQTTClient(client_id, mqtt_server)
client.connect()
try:
    while True:
        message = b"Hello World"
        client.publish(topic, message)
        print(f"Mesaj trimis: {message.decode()}")
        time.sleep(10)
finally:
    client.disconnect()

Exemplu de cod pentru Abonare pe Laptop utilizând paho-mqtt

subscribe.py
from paho.mqtt import client as mqtt_client
 
broker = 'localhost'
port = 1883
topic = "test/topic"
client_id = "python_subscriber"
 
def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            client.subscribe(topic)
    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client
 
def on_message(client, userdata, msg):
    print(f"Mesaj primit pe topicul '{msg.topic}': {msg.payload.decode()}")
 
client = connect_mqtt()
client.on_message = on_message
client.loop_forever()

In case you experience issues with Paho MQTT Client Callback Version, try the following approach:

client = mqtt_client.Client(client_id = client_id, callback_api_version = mqtt_client.CallbackAPIVersion.VERSION1)

Comunicații BLE - platforma Nordic Thingy:52

Acest ghid vă oferă un punct de pornire pentru conectarea și utilizarea dispozitivului Nordic Thingy:52. Pentru a interacționa cu Nordic Thingy:52, în următoarele rânduri vă prezentam pașii de configurare, conectarea la dispozitiv și accesarea senzorilor și funcțiilor sale.

Nordic Thingy:52 board

Thingy:52 este o platformă de prototipare IoT, echipată cu senzori, actuatori și conectivitate Bluetooth Low Energy (BLE). Instrucțiunile de mai jos acoperă configurarea BLE și utilizarea uneltelor software de la Nordic.

Echipamente necesare:
  • Dispozitiv Nordic Thingy:52
  • Smartphone sau computer cu suport Bluetooth
  • Aplicația nRF Connect (disponibilă pentru iOS, Android, Windows, MacOS și Linux)
  • SDK Nordic Thingy:52 (opțional, utilizat pentru programarea în mod custom a dispozitivului) - nu este în scopul laboratorului
Etape:
1. Porniți Thingy:52

Apăsați butonul de pornire de pe Thingy:52.
LED-ul ar trebui să înceapă să clipească, indicând că dispozitivul este gata de conectare prin BLE.

2. Conectarea la dispozitiv

  1. Descărcați și instalați aplicația nRF Connect:
  2. Deschideți aplicația și asigurați-vă că Bluetooth-ul este activat și aplicația are acordate permisiunile necesare utilizării Bluetooth.
  3. În aplicația nRF Connect, scanați dispozitivele disponibile.
  4. Thingy:52 ar trebui să apară în listă cu un nume asemănător cu Thingy.
  5. Selectați Thingy:52 pentru a vă conecta.
  6. După conectare, veți putea vedea serviciile și caracteristicile acestuia.

3. Accesarea Senzorilor și Funcțiilor

Odată ce Thingy:52 este conectat, puteți începe să accesați senzorii și funcțiile sale prin aplicația nRF Connect sau dezvoltând o aplicație proprie capabilă să comunice prin BLE.

  • Senzorii de Mediu:
    • Accesați date despre temperatură, umiditate, presiune atmosferică și calitatea aerului în cadrul Serviciului de Mediu din aplicație.
  • Senzorii de Mișcare:
    • Thingy:52 include un senzor de mișcare pe 9 axe. Verificați Serviciul de Mișcare pentru a monitoriza datele de la accelerometru, giroscop și compas.
  • Controlul Sunetului și Difuzorului:
    • Puteți reda sunet sau monitoriza datele audio de pe Thingy:52 accesând Serviciul de Sunet.
  • Senzorul de Lumină și Culoare:
    • Senzorul de lumină măsoară intensitatea luminii ambientale și culorile, iar aceste date sunt accesibile prin Serviciul de Lumină.

Funcționalitatea lui Thingy poate fi configurată wireless printr-un API Bluetooth. Acest lucru face posibilă crearea de demonstrații și prototipuri fără a programa efectiv Nordic Thingy:52 în sine, ci doar prin dezvoltarea aplicației sau soluției cloud. Pe măsură ce sunt lansate noi versiuni ale firmware-ului, Thingy poate fi actualizat wireless folosind aplicațiile furnizate. Utilizatorii avansați pot folosi Thingy ca kit de dezvoltare prin construirea propriului firmware și încărcarea acestuia pe placa de bază.

4. Opriți Thingy:52

Pentru a opri Thingy:52, apăsați și țineți apăsat butonul de pornire până când LED-ul se stinge.

Exercitii

Nu incercati exercitiile pe Thingy:52

Task 0: Exercitiile de mai jos se bazează pe implementarea bazată pe Raspberry Pi Pico. Setup-ul este similar celui din laboratorul precedent.

  • Etapa 1 - porniți Mosquitto cu configurarea realizata anterior:
mosquitto -v -c "C:\Program Files\mosquitto\mosquitto.conf" 
  • Etapa 2 - rulați pe Raspberry Pi Pico codul hello.py
  • Etapa 3 - rulați pe computer utilizând Python codul subscribe.py

Task 1: Configurați un topic nou, cum ar fi `senzori/temperatura`, și modificați codul de Raspberry Pi Pico pentru a trimite valori preluate de la senzorul temperatură.

Task 2: Testați trimiterea și recepția datelor prin MQTT folosind utilitarul mosquitto_sub

Task 3: Modificați codul de subscriber prezentat în cadrul subscribe.py pentru a vizualiza datele primite de la Raspberry Pi Pico într-un grafic folosind librăria Matplotlib.

priot/laboratoare/06.txt · Last modified: 2024/11/19 02:49 by alexandru.bala
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0