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