repos/TB067

Apuntes y resueltos de la materia Redes de Comunicaciones (TB067)
Commits Files Refs README
tps/1/scripts/publisher-data-lost.py (62 lines)
   1 import paho.mqtt.client as mqtt
   2 import random
   3 import time 
   4 # Configuración
   5 broker_address = "broker.hivemq.com"
   6 #broker_address = "mqtt-dashboard.com"
   7 
   8 topic = "tp1/aguilar_klockner"     # <<<<<<<<<<====== Completar con el nombre del grupo
   9 min_size = 50  # Tamaño mínimo del fragmento
  10 max_size = 70  # Tamaño máximo del fragmento
  11 file_to_publish = 'input.txt'
  12 
  13 
  14 def on_connect(client, userdata, flags, rc):
  15     # Al conectarse, configuramos la opción TCP_NODELAY
  16     client_socket = client._socket().socket  # Accede al socket subyacente
  17     client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)  # Desactiva Nagle
  18 
  19 def on_subscribe(self, mqttc, obj, mid, granted_qos):
  20     print("Subscribed: "+str(mid)+" "+str(granted_qos))
  21         
  22 def publish_file(client, filename, min_size, max_size):
  23     with open(filename, 'r') as file:
  24         content = file.read()
  25 
  26     
  27     index = 0
  28     fragment_number = 0
  29 
  30     #Toma la medida total de la informacion y la envia como paquete 0
  31     lenght = len(content)
  32     payload = f'{fragment_number}|{4}|{0}|{lenght}'
  33     client.publish(topic, payload, qos=2, retain=False)
  34     print(f"Fragmento publicado {fragment_number} (size: {4})")
  35     fragment_number += 1
  36 
  37     while index < len(content):
  38         fragment_size = random.randint(min_size, max_size)
  39         fragment = content[index:index+fragment_size]
  40         
  41         # Metadatos: número de fragmento, tamaño, y bandera de último fragmento
  42         is_last = 1 if index + fragment_size >= len(content) else 0
  43         payload = f'{fragment_number}|{fragment_size}|{is_last}|{fragment}'
  44 
  45         if fragment_number != 6: #Pierde un paquete aproposito
  46             client.publish(topic, payload, qos=2, retain=False)
  47             print(f"Fragmento publicado {fragment_number} (size: {fragment_size})")
  48 
  49         index += fragment_size
  50         fragment_number += 1
  51         time.sleep(1)
  52 
  53 # Configuración del cliente MQTT
  54 client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
  55 client.on_connect = on_connect  # Añade el manejador de eventos para cuando se conecte
  56 client.on_subscribe = on_subscribe # Añade el manejador de suscripción
  57 client.connect(broker_address, 1883, 60)
  58 
  59 # Publicar el archivo fragmentado
  60 publish_file(client, file_to_publish, min_size, max_size)
  61 
  62 client.disconnect()