9.Implement MQTT communication using both an online MQTT broker (HiveMQ) and a local offline MQTT broker (Eclipse Mosquitto)  to publish, receive, and display IoT sensor data.

pip install paho-mqtt

mosquitto -h

mosquitto -v

mqtt_broker_demo/
│
├── publisher.py
└── subscriber.py

publisher.py:


import paho.mqtt.client as mqtt
import random
import json
import time

# Choose: "online" or "offline"
MODE = "online"

if MODE == "online":
    BROKER = "broker.hivemq.com"
else:
    BROKER = "127.0.0.1"

PORT = 1883

TOPIC = "tony/iot/environment"


client = mqtt.Client(
    client_id="tony_publisher"
)

print("Connecting to:", BROKER)

client.connect(BROKER, PORT, 60)

client.loop_start()

print("MQTT Publisher Started")

try:

    while True:

        temperature = round(random.uniform(20, 40), 2)
        humidity = round(random.uniform(40, 90), 2)

        data = {
            "temperature": temperature,
            "humidity": humidity
        }

        payload = json.dumps(data)

        client.publish(TOPIC, payload)

        print("Published:", payload)

        time.sleep(5)

except KeyboardInterrupt:
    print("Publisher stopped")

finally:
    client.loop_stop()
    client.disconnect()


subscriber.py:


import paho.mqtt.client as mqtt
import json

# Choose: "online" or "offline"
MODE = "online"

if MODE == "online":
    BROKER = "broker.hivemq.com"
else:
    BROKER = "127.0.0.1"

PORT = 1883

TOPIC = "tony/iot/environment"


def on_connect(client, userdata, flags, reason_code, properties):

    print("Connected to MQTT Broker!")

    client.subscribe(TOPIC)

    print("Subscribed to:", TOPIC)


def on_message(client, userdata, msg):

    data = json.loads(msg.payload.decode())

    print("\nReceived Sensor Data")

    print("Temperature:", data["temperature"], "°C")
    print("Humidity:", data["humidity"], "%")

    print("------------------------")


client = mqtt.Client(
    client_id="tony_subscriber",
    callback_api_version=mqtt.CallbackAPIVersion.VERSION2
)

client.on_connect = on_connect
client.on_message = on_message

print("Connecting to:", BROKER)

client.connect(BROKER, PORT, 60)

print("Waiting for messages...")

client.loop_forever()

