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> | ||