tps/1/scripts/subscriber-secure.py (59 lines)
1 import paho.mqtt.client as mqtt 2 3 # Configuración 4 broker = "broker.hivemq.com" 5 #broker = "mqtt-dashboard.com" 6 topic = "tp1/aguilar_klockner" # <<<<<<<<<<====== Completar con el nombre del grupo 7 output_file = 'output.txt' 8 received_fragments = {} 9 last_fragment = False 10 11 def on_subscribe(self, mqttc, obj, mid, granted_qos): 12 print("Subscribed: "+str(mid)+" "+str(granted_qos)) 13 14 def on_message(client, userdata, msg): 15 global last_fragment 16 17 18 # Decodificar mensaje: número de fragmento, tamaño, bandera de último fragmento, y contenido 19 payload = msg.payload.decode('utf-8') 20 fragment_info, fragment = payload.rsplit('|', 1) 21 fragment_number, fragment_size, is_last = map(int, fragment_info.split('|')[:3]) 22 23 24 25 if fragment_number == -1: #En caso de recibir error de transmision borra todo y continua recibiendo 26 print(f"Error en la recepcion. Reiniciando secuencia") 27 received_fragments.clear() 28 29 else: 30 if fragment_number != 100: #Guarda cada dato recibido menos el mensaje de exito 31 received_fragments[fragment_number] = (fragment_size, fragment) 32 print(f"Fragmento recibido {fragment_number} (size: {fragment_size})") 33 34 if is_last == 1: 35 last_fragment = True 36 37 # Reensamblar si es el último fragmento 38 if last_fragment: 39 print(f"Exito en la recepcion. Finalizando secuencia") 40 reassemble_file(output_file) 41 quit() 42 43 def reassemble_file(filename): 44 with open(filename, 'w') as file: 45 for fragment_number in sorted(received_fragments): 46 fragment_size, fragment = received_fragments[fragment_number] 47 file.write(fragment[:fragment_size]) # Reescribimos usando el largo correcto 48 print(f"File reassembled as {filename}") 49 50 # Configuración del cliente MQTT 51 client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) 52 client.on_message = on_message 53 client.on_subscribe = on_subscribe 54 55 client.connect(broker, 1883, 60) 56 client.subscribe(topic, qos=2) 57 58 # Mantener el cliente en funcionamiento 59 client.loop_forever()
