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