repos/TB067

Apuntes y resueltos de la materia Redes de Comunicaciones (TB067)
Commits Files Refs README
tps/1/scripts/publisher-secure.py (68 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 = 100  # Tamaño mínimo del fragmento
  10 max_size = 150  # 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     total_size = len(content)
  30     control_size = 0
  31     while index < total_size:
  32         fragment_size = random.randint(min_size, max_size)
  33         fragment = content[index:index+fragment_size]
  34         
  35         # Metadatos: número de fragmento, tamaño, y bandera de último fragmento
  36         is_last = 0
  37         if random.randint(1, 100) > 10: #Establezco un 10% de perder el fragmento
  38             payload = f'{fragment_number}|{fragment_size}|{is_last}|{fragment}'        
  39             client.publish(topic, payload, qos=2, retain=False)
  40             control_size += fragment_size
  41         print(f"Fragmento publicado {fragment_number} (size: {fragment_size})")
  42         index += fragment_size
  43         fragment_number += 1
  44         time.sleep(1)
  45 
  46     if control_size < total_size: # Detecto si se perdio un fragmento y reinicio el envio en ese caso enviando un mensansaje de error
  47         payload = f'{-1}|{4}|{is_last}|{1}'        
  48         client.publish(topic, payload, qos=2, retain=False)
  49         print(f"Fragmento publicado {-1} (size: {4})")
  50         print(f"Error de transmision. Reiniciando secuencia")
  51         publish_file(client, filename, min_size, max_size)
  52     else: #En caso de exito envio mensaje de exito y finalizo
  53         is_last = 1
  54         payload = f'{100}|{4}|{is_last}|{0}'       
  55         client.publish(topic, payload, qos=2, retain=False)
  56         print(f"Fragmento publicado {-0} (size: {4})")
  57         print(f"Transmision exitosa. Finalizando secuencia")
  58 
  59 # Configuración del cliente MQTT
  60 client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
  61 client.on_connect = on_connect  # Añade el manejador de eventos para cuando se conecte
  62 client.on_subscribe = on_subscribe # Añade el manejador de suscripción
  63 client.connect(broker_address, 1883, 60)
  64 
  65 # Publicar el archivo fragmentado
  66 publish_file(client, file_to_publish, min_size, max_size)
  67 
  68 client.disconnect()