import json import os from datetime import datetime from pika import BlockingConnection, ConnectionParameters, PlainCredentials from pika.exchange_type import ExchangeType RMQ_HOST = 'localhost' RMQ_USER = 'rabbit' RMQ_PASS = '1234' EXCHANGE_NAME = 'amq.topic' ROUTING_KEY = 'rep.*' def extract_value(dict_line): return dict_line['value'] def callback(channel, method, properties, body): log_file = open('receiver.log', 'r') lines = log_file.readlines() dict_lines = list(map(json.loads, lines)) if body == b'current': print(f"{datetime.utcnow()}: Latest CO2 level is {dict_lines[-1]['value']}") else: values = list(map(extract_value, dict_lines)) avg = sum(values) / len(values) print(f"{datetime.utcnow()}: Average CO2 level is {avg}") log_file.close() channel.basic_ack(delivery_tag=method.delivery_tag) def main(): connection = BlockingConnection( ConnectionParameters( host=RMQ_HOST, credentials=PlainCredentials(RMQ_USER, RMQ_PASS) ) ) try: channel = connection.channel() result = channel.queue_declare(queue=ROUTING_KEY) channel.queue_bind(exchange=EXCHANGE_NAME, queue=result.method.queue) channel.basic_consume(queue=ROUTING_KEY, on_message_callback=callback) print('[*] Waiting for queries from the control tower. Press CTRL+C to exit') channel.start_consuming() connection.close() except KeyboardInterrupt: connection.close() print('Interrupted by user. Shutting down...') if __name__ == '__main__': main()