This shows you the differences between two versions of the page.
priot:laboratoare:07 [2024/11/18 15:27] vlad.radulescu2901 |
priot:laboratoare:07 [2024/11/18 15:32] (current) vlad.radulescu2901 |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 07: Web Programming and APIs, Data Visualization, si Mesaje MQTT ===== | + | ===== Laboratorul 07: Trimiterea de Email-uri Direct de pe Raspberry Pi Pico ===== |
===== Scopul Laboratorului: ===== | ===== Scopul Laboratorului: ===== | ||
Line 17: | Line 17: | ||
* Gmail oferă un server SMTP gratuit: smtp.gmail.com, pe portul 465 (SSL). | * Gmail oferă un server SMTP gratuit: smtp.gmail.com, pe portul 465 (SSL). | ||
- | === 2. JSON (JavaScript Object Notation) === | + | ==== Configurarea Mediului de Lucru ==== |
- | JSON este un format de schimb de date simplu și ușor de citit, folosit pentru transmiterea de date structurate. | + | === Cum să generezi o parolă de aplicație Gmail === |
+ | * Accesați contul Google: https://myaccount.google.com. | ||
+ | * Navigați la „Securitate”. | ||
+ | * Activează autentificarea în doi pași. | ||
+ | * Generează o parolă de aplicație: Selectați aplicația „Mail” și dispozitivul „Alt dispozitiv” (ex. „Raspberry Pi Pico”). | ||
+ | * Utilizați această parolă în scriptul MicroPython în locul parolei contului principal. | ||
- | + | === Trimiterea de Email-uri === | |
- | === 3. Matplotlib === | + | Cod complet pentru trimiterea unui email: |
- | 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. | + | <code send_mail.py> |
- | + | ||
- | + | ||
- | === 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: | + | |
- | <code bash >pip install requests matplotlib paho-mqtt</code> | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ===== 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 | + | |
- | + | ||
- | <code python 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) | + | |
- | + | ||
- | </code> | + | |
- | + | ||
- | ===== Vizualizarea Datelor ===== | + | |
- | + | ||
- | Codul pentru Vizualizare - Tipuri Multiple de Grafice: | + | |
- | + | ||
- | <code python 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() | + | |
- | + | ||
- | </code> | + | |
- | + | ||
- | ===== 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 ==== | + | |
- | <code python hello.py> | + | |
import network | import network | ||
+ | import usocket as socket | ||
+ | import ssl | ||
+ | import ubinascii | ||
import time | import time | ||
- | from umqtt.simple import MQTTClient | ||
- | ssid = 'Numele_Retelei' | + | SSID = 'Numele_Retelei' |
- | password = 'Parola_Retelei' | + | PASSWORD = 'Parola_Retelei' |
- | mqtt_server = 'IP-ul_Brokerului' | + | SMTP_SERVER = "smtp.gmail.com" |
- | topic = "test/topic" | + | SMTP_PORT = 465 |
- | client_id = "pico_publisher" | + | EMAIL_ADDRESS = "email_tau@gmail.com" |
+ | EMAIL_PASSWORD = "parola_ta_aplicatie" | ||
+ | RECIPIENT = "destinatar@gmail.com" | ||
- | wlan = network.WLAN(network.STA_IF) | + | MESSAGE = """From: %s |
- | wlan.active(True) | + | To: %s |
- | wlan.connect(ssid, password) | + | Subject: Hello from Raspberry Pi Pico |
- | while not wlan.isconnected(): | + | |
- | time.sleep(1) | + | |
- | client = MQTTClient(client_id, mqtt_server) | + | Hello World! |
- | client.connect() | + | """ % (EMAIL_ADDRESS, RECIPIENT) |
- | try: | + | |
- | while True: | + | |
- | message = b"Hello World" | + | |
- | client.publish(topic, message) | + | |
- | print(f"Mesaj trimis: {message.decode()}") | + | |
- | time.sleep(10) | + | |
- | finally: | + | |
- | client.disconnect() | + | |
- | </code> | + | def connect_wifi(): |
+ | wlan = network.WLAN(network.STA_IF) | ||
+ | wlan.active(True) | ||
+ | wlan.connect(SSID, PASSWORD) | ||
+ | while not wlan.isconnected(): | ||
+ | print("Conectare la Wi-Fi...") | ||
+ | time.sleep(1) | ||
+ | print("Conectat la Wi-Fi:", wlan.ifconfig()) | ||
- | ==== Exemplu de cod pentru Abonare pe Laptop utilizând paho-mqtt ==== | + | def send_email(): |
- | <code python subscribe.py> | + | addr = socket.getaddrinfo(SMTP_SERVER, SMTP_PORT)[0][-1] |
- | from paho.mqtt import client as mqtt_client | + | sock = socket.socket() |
+ | sock.connect(addr) | ||
+ | sock = ssl.wrap_socket(sock) | ||
+ | print("Conexiune la serverul SMTP realizată") | ||
- | broker = 'localhost' | + | def send_command(command, expect_response=True): |
- | port = 1883 | + | print(f">>> {command.strip()}") |
- | topic = "test/topic" | + | sock.write(command.encode('utf-8') + b"\r\n") |
- | client_id = "python_subscriber" | + | if expect_response: |
+ | response = sock.readline().decode('utf-8').strip() | ||
+ | print(f"<<< {response}") | ||
+ | return response | ||
- | def connect_mqtt(): | + | try: |
- | def on_connect(client, userdata, flags, rc): | + | send_command("HELO RaspberryPi") |
- | if rc == 0: | + | send_command("AUTH LOGIN") |
- | client.subscribe(topic) | + | send_command(ubinascii.b2a_base64(EMAIL_ADDRESS.encode('utf-8')).decode('utf-8').strip()) |
- | client = mqtt_client.Client(client_id) | + | send_command(ubinascii.b2a_base64(EMAIL_PASSWORD.encode('utf-8')).decode('utf-8').strip()) |
- | client.on_connect = on_connect | + | send_command(f"MAIL FROM:<{EMAIL_ADDRESS}>") |
- | client.connect(broker, port) | + | send_command(f"RCPT TO:<{RECIPIENT}>") |
- | return client | + | send_command("DATA") |
+ | send_command(MESSAGE + "\r\n.") | ||
+ | send_command("QUIT", expect_response=False) | ||
+ | print("Email trimis cu succes!") | ||
+ | except Exception as e: | ||
+ | print(f"Eroare la trimiterea email-ului: {e}") | ||
+ | finally: | ||
+ | sock.close() | ||
- | def on_message(client, userdata, msg): | + | connect_wifi() |
- | print(f"Mesaj primit pe topicul '{msg.topic}': {msg.payload.decode()}") | + | send_email() |
- | client = connect_mqtt() | ||
- | client.on_message = on_message | ||
- | client.loop_forever() | ||
</code> | </code> | ||
- | <note>In case you experience issues with Paho MQTT Client Callback Version, try the following approach: | + | ==== Exercitii ==== |
- | <code> | + | Task: Creați un sistem care: |
- | client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION1) | + | * Măsoară temperature, presiunea atmosferică si luminozitatea folosind senzori conectați la Raspberry Pi Pico. |
- | </code> | + | * Trimite un email de notificare dacă: |
- | </note> | + | * Temperatura depășește 30°C. |
- | + | * Presiunea atmosferică depășește 1 atmosferă. | |
- | ===== Comunicații BLE - platforma Nordic Thingy:52 ====== | + | * Daca luminozitatea atinge pragul maxim. |
- | + | ||
- | 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. | + | |
- | + | ||
- | {{ :priot:laboratoare:thingy_board_product.png?nolink&500 |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 == | + | |
- | + | ||
- | <note tip>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.</note> | + | |
- | + | ||
- | == 2. Conectarea la dispozitiv == | + | |
- | <note tip> | + | |
- | - Descărcați și instalați aplicația nRF Connect: | + | |
- | * pentru smartphone - [[https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=en|nRF-Connect-for-Android]] or [[https://apps.apple.com/us/app/nrf-connect-for-mobile/id1054362403|nRF-Connect-for-iPhone]]) | + | |
- | * pentru computer ([[https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-Desktop|nRF-Connect-for-Desktop]]).\\ | + | |
- | - Deschideți aplicația și asigurați-vă că Bluetooth-ul este activat și aplicația are acordate permisiunile necesare utilizării Bluetooth.\\ | + | |
- | - În aplicația **nRF Connect**, scanați dispozitivele disponibile.\\ | + | |
- | - Thingy:52 ar trebui să apară în listă cu un nume asemănător cu Thingy.\\ | + | |
- | - Selectați Thingy:52 pentru a vă conecta. | + | |
- | - După conectare, veți putea vedea serviciile și caracteristicile acestuia.\\ | + | |
- | </note> | + | |
- | == 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ă**. | + | |
- | + | ||
- | <note important>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ă.</note> | + | |
- | + | ||
- | + | ||
- | == 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 ===== | + | |
- | <note warning>**Nu incercati exercitiile pe Thingy:52**</note> | + | |
- | <note>**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: | ||
- | <code bash>mosquitto -v -c "C:\Program Files\mosquitto\mosquitto.conf" </code> | ||
- | * //Etapa 2// - rulați pe Raspberry Pi Pico codul **hello.py** | ||
- | * //Etapa 3// - rulați pe computer utilizând Python codul **subscribe.py** | ||
- | </note> | ||
- | <note>**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ă. | ||
- | </note> | ||
- | <note>**Task 2:** | ||
- | Testați trimiterea și recepția datelor prin MQTT folosind utilitarul **mosquitto_sub** | ||
- | </note> | ||
- | <note>**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.</note> |