Differences

This shows you the differences between two versions of the page.

Link to this comparison view

isi:laboratoare:07 [2025/11/15 19:41]
alexandru.predescu
isi:laboratoare:07 [2025/11/21 12:52] (current)
stefanel.turcu
Line 167: Line 167:
 Pași pentru conectarea la RabbitMQ folosind Python Pași pentru conectarea la RabbitMQ folosind Python
  
-**1. Instalarea ​Bibliotecii ​pika**+**1. Instalarea ​bibliotecii ​pika**
  
 Asigură-te că ai instalat biblioteca ''​pika''​. Poți face acest lucru rulând următoarea comandă: Asigură-te că ai instalat biblioteca ''​pika''​. Poți face acest lucru rulând următoarea comandă:
Line 258: Line 258:
  
 == Exemplu de Utilizare a unui Exchange ''​fanout''​ în RabbitMQ == == Exemplu de Utilizare a unui Exchange ''​fanout''​ în RabbitMQ ==
 +
 +<spoiler click here>
 +
 Până acum am văzut cum putem crea o coadă (queue), să trimitem un mesaj pe aceasta și să consumăm acel mesaj. În cadrul exemplului anterior, am presupus că un mesaj este trimis către o singură coadă. În ceea ce urmează, vom face ceva complet diferit – vom livra un mesaj către mai mulți consumatori (îl vom publica pe mai multe queue-uri). Acest pattern este cunoscut sub denumirea de **„publish/​subscribe”**. Până acum am văzut cum putem crea o coadă (queue), să trimitem un mesaj pe aceasta și să consumăm acel mesaj. În cadrul exemplului anterior, am presupus că un mesaj este trimis către o singură coadă. În ceea ce urmează, vom face ceva complet diferit – vom livra un mesaj către mai mulți consumatori (îl vom publica pe mai multe queue-uri). Acest pattern este cunoscut sub denumirea de **„publish/​subscribe”**.
  
Line 265: Line 268:
   - Conecta ambele queue-uri la exchange fără a folosi ''​routing key''​ (nefiind necesară pentru exchange-ul ''​fanout''​).   - Conecta ambele queue-uri la exchange fără a folosi ''​routing key''​ (nefiind necesară pentru exchange-ul ''​fanout''​).
   - Trimite un mesaj către exchange, care va fi livrat tuturor queue-urilor conectate.   - Trimite un mesaj către exchange, care va fi livrat tuturor queue-urilor conectate.
 +
 +
 +**Cod publisher**
  
 <code python> <code python>
Line 273: Line 279:
 channel = connection.channel() channel = connection.channel()
  
-1. Crearea unui exchange de tip '​fanout'​+# Crearea unui exchange de tip '​fanout'​
 exchange_name = '​broadcast_exchange'​ exchange_name = '​broadcast_exchange'​
 channel.exchange_declare(exchange=exchange_name,​ exchange_type='​fanout'​) channel.exchange_declare(exchange=exchange_name,​ exchange_type='​fanout'​)
 print(f"​Exchange-ul '​{exchange_name}'​ de tip '​fanout'​ a fost creat."​) print(f"​Exchange-ul '​{exchange_name}'​ de tip '​fanout'​ a fost creat."​)
  
-2. Crearea queue-urilor +# Trimiterea unui mesaj către exchange-ul '​fanout'​
-queue1 = '​queue1'​ +
-queue2 = '​queue2'​ +
-channel.queue_declare(queue=queue1) +
-channel.queue_declare(queue=queue2) +
- +
-# 3. Legarea queue-urilor la exchange fără routing key (nu este necesară pentru fanout) +
-channel.queue_bind(exchange=exchange_name,​ queue=queue1) +
-channel.queue_bind(exchange=exchange_name,​ queue=queue2) +
-print(f"​Queue-urile '​{queue1}'​ și '​{queue2}'​ au fost conectate la exchange-ul '​{exchange_name}'​."​) +
- +
-# 4. Trimiterea unui mesaj către exchange-ul '​fanout'​+
 message = "Salut tuturor consumatorilor!"​ message = "Salut tuturor consumatorilor!"​
 channel.basic_publish(exchange=exchange_name,​ routing_key='',​ body=message) channel.basic_publish(exchange=exchange_name,​ routing_key='',​ body=message)
Line 296: Line 291:
 # Închiderea conexiunii # Închiderea conexiunii
 connection.close() connection.close()
 +</​code>​
 +
 +**Cod subscriber**
 +
 +<code python>
 +import pika
 +
 +# Conectarea la RabbitMQ
 +connection = pika.BlockingConnection(pika.ConnectionParameters('​localhost'​))
 +channel = connection.channel()
 +
 +# Crearea unui exchange de tip '​fanout'​
 +exchange_name = '​broadcast_exchange'​
 +
 +channel.exchange_declare(exchange=exchange_name,​ exchange_type='​fanout'​)
 +print(f"​Exchange-ul '​{exchange_name}'​ de tip '​fanout'​ a fost creat."​)
 +
 +queue_name = "​queue1"​ # nume diferite pentru fiecare consumator
 +channel.queue_declare(queue=queue_name)
 +
 +# Legare queue la exchange
 +channel.queue_bind(exchange=exchange_name,​ queue=queue_name)
 +
 +print(f"​Ascult mesaje pe '​{queue_name}'​..."​)
 +
 +def callback(ch,​ method, properties, body):
 +    print(f"​[Primit] {body.decode()}"​)
 +
 +channel.basic_consume(queue=queue_name,​ on_message_callback=callback,​ auto_ack=True)
 +
 +# Închiderea conexiunii
 +try:
 +    channel.start_consuming()
 +except KeyboardInterrupt:​
 +    print("​Receiver oprit."​)
 +    connection.close()
 +
 </​code>​ </​code>​
  
Line 301: Line 333:
  
 - Mesajul „Salut tuturor consumatorilor!” va ajunge atât în ''​queue1'',​ cât și în ''​queue2''​. - Mesajul „Salut tuturor consumatorilor!” va ajunge atât în ''​queue1'',​ cât și în ''​queue2''​.
 +
 +</​spoiler>​
 +
  
 <note tip> <note tip>
Line 313: Line 348:
 === Setup MQTT === === Setup MQTT ===
  
-Instalare în Python ​(biblioteca ''​paho-mqtt''​):+Pentru a conecta o aplicație ​Python ​la MQTT, vei folosi ​biblioteca ''​paho-mqtt''​. Aceasta permite crearea și configurarea conexiunilor,​ și trimiterea sau recepționarea mesajelor prin MQTT. 
 + 
 +== 1. Instalarea bibliotecii ''​paho-mqtt''​ == 
 + 
 +Asigură-te că ai instalat biblioteca ''​paho-mqtt''​. Poți face acest lucru rulând următoarea comandă:
  
 <​code>​ <​code>​
Line 320: Line 359:
  
 == Publisher == == Publisher ==
 +
 +Următoarea secvență de cod implementează un nod de tip publisher care trimite mesaje prin MQTT:
  
 <code python> <code python>
Line 345: Line 386:
  
 == Subscriber == == Subscriber ==
 +
 +Următoarea secvență de cod implementează un nod de tip subscriber care primește mesaje venite prin MQTT:
  
 <code python> <code python>
Line 368: Line 411:
 client.loop_forever() client.loop_forever()
 </​code>​ </​code>​
 +
 +== Interfață grafică ==
 +
 +Putem vizualiza datele la nivelul broker-ului de mesaje folosind un GUI precum MQTTBox (windows: [[https://​apps.microsoft.com/​detail/​9nblggh55jzg|from Microsoft Store]], web: [[https://​github.com/​workswithweb/​MQTTBox|from GitHub]])
 +
 +{{:​isi:​laboratoare:​mqtt_box_1.png?​600|}}
 +
 +{{:​isi:​laboratoare:​mqtt_box_2.png?​600|}}
 +
 +
 +
  
  
Line 375: Line 429:
 === RabbitMQ === === RabbitMQ ===
  
-<​note>​ +<​note ​tip
-Descărcați proiectul de pe GitHub[[https://​github.com/​ACS-ISI/​Messenger/​tree/​main|Messenger]] +Pentru a instala toate dependențele necesare pentru laboratorul de astăzi, rulați: ''​pip install ​-r requirements.txt''​ folosind fișierul requirements.txt cu următorul conținut:
-</​note>​+
  
 +<​code>​
 +Flask==3.1.0
 +Flask_SocketIO==5.4.1
 +pika==1.3.2
 +</​code>​
  
-<note tip> 
-Pentru a instala toate dependențele necesare pentru laboratorul de astăzi, rulați: ''​pip install -r requirements.txt''​. Fișierul ''​requirements.txt''​ poate fi descărcat de aici: [[https://​github.com/​ACS-ISI/​Messenger/​blob/​main/​requirements.txt|requirements.txt]]. 
 </​note>​ </​note>​
  
Line 389: Line 445:
  
  
-== 2. Exchange și publisher ​de mesaje ==+== 2. Publisher ​de mesaje ==
  
 Creează un script Python care să permită citirea textelor de la tastatură și publicarea acestora într-un exchange nou. (care este creat programatic după realizarea cu succes a conexiunii la RabbitMQ). Scriptul va citi textul de la utilizator și va publica fiecare mesaj în exchange-ul RabbitMQ (in mod ''​fanout''​). Creează un script Python care să permită citirea textelor de la tastatură și publicarea acestora într-un exchange nou. (care este creat programatic după realizarea cu succes a conexiunii la RabbitMQ). Scriptul va citi textul de la utilizator și va publica fiecare mesaj în exchange-ul RabbitMQ (in mod ''​fanout''​).
Line 402: Line 458:
 </​code>​ </​code>​
  
-== 3. Queue și subscriber ​pentru mesaje ==+== 3. Subscriber ​pentru mesaje ==
  
 Creează un script Python care să creeze un queue, să-l lege la exchange-ul din exercițiul 1 și să afișeze fiecare mesaj primit. Scriptul va crea un queue nou și îl va asocia (binding) cu exchange-ul creat în exercițiul anterior. Pentru fiecare mesaj primit în queue, scriptul va afișa conținutul acestuia în consolă. Creează un script Python care să creeze un queue, să-l lege la exchange-ul din exercițiul 1 și să afișeze fiecare mesaj primit. Scriptul va crea un queue nou și îl va asocia (binding) cu exchange-ul creat în exercițiul anterior. Pentru fiecare mesaj primit în queue, scriptul va afișa conținutul acestuia în consolă.
Line 428: Line 484:
 TOPIC = "​chat/​general"​ TOPIC = "​chat/​general"​
 </​code>​ </​code>​
 +
 +Atenție! Daca toți colegii se conecteaza pe același topic, mesajele vor ajunge și la ei (și invers)
  
 </​note>​ </​note>​
Line 442: Line 500:
  
 Test: Test:
-  * Trimite mesaje între instanțe +  * Trimite mesaje între instanțe ​(publisher/​subscriber) 
-  * Observă că brokerul rutează mesajele automat+  * Observă că brokerul rutează mesajele automat ​pe baza topic-ului, indiferent de câte instanțe de publisher sau subscriber sunt conectate la broker
  
  
isi/laboratoare/07.1763228513.txt.gz · Last modified: 2025/11/15 19:41 by alexandru.predescu
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