================================================================================
  Simple Question SQ4: Minimal MQTT Publisher & Subscriber (paho-mqtt)
================================================================================

FULL QUESTION:
SQ4. Minimal MQTT Test: Implement a lightweight MQTT Publisher and Subscriber using paho-mqtt on public broker broker.hivemq.com (port 1883).
Use this simpler program to verify internet access, broker reachability, and JSON payload serialization before launching larger IoT telemetry pipelines.

SHORT QUESTION:
Minimal MQTT Pub & Sub Verification Pair.

================================================================================
README & SETUP INSTRUCTIONS:
================================================================================
# SQ4: Minimal MQTT Publisher & Subscriber

## Purpose
Quick test to verify MQTT broker connection and packet delivery.

## Requirements
```bash
pip install paho-mqtt
```

## How to Run
1. Open Terminal 1 (Subscriber):
   ```bash
   python subscriber.py
   ```
2. Open Terminal 2 (Publisher):
   ```bash
   python publisher.py
   ```

================================================================================
SOURCE CODE FILES:
================================================================================

1. publisher.py
--------------------------------------------------------------------------------
import time
import json
import paho.mqtt.client as mqtt

BROKER = "broker.hivemq.com"
PORT = 1883
TOPIC = "iot_lab/test/ping"

def get_client():
    try:
        return mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
    except AttributeError:
        return mqtt.Client()

def main():
    client = get_client()
    print(f"Connecting to MQTT Broker: {BROKER}:{PORT}")
    client.connect(BROKER, PORT, keepalive=60)
    
    payload = {
        "status": "ONLINE",
        "protocol": "MQTT",
        "temperature": 29.4,
        "humidity": 58.2,
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
    }
    
    msg = json.dumps(payload)
    client.publish(TOPIC, msg)
    print(f"[SUCCESS] Published message to {TOPIC}:")
    print(f"  {msg}")
    client.disconnect()

if __name__ == "__main__":
    main()
--------------------------------------------------------------------------------

2. subscriber.py
--------------------------------------------------------------------------------
import json
import paho.mqtt.client as mqtt

BROKER = "broker.hivemq.com"
PORT = 1883
TOPIC = "iot_lab/test/ping"

def get_client():
    try:
        return mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
    except AttributeError:
        return mqtt.Client()

def on_message(client, userdata, msg):
    payload_str = msg.payload.decode("utf-8")
    print(f"\n[RECEIVED] Topic: {msg.topic}")
    try:
        data = json.loads(payload_str)
        print("Parsed JSON Payload:")
        for k, v in data.items():
            print(f"  {k}: {v}")
    except Exception:
        print(f"  Raw: {payload_str}")

def main():
    client = get_client()
    client.on_message = on_message
    print(f"Connecting to {BROKER}:{PORT} and subscribing to {TOPIC}...")
    client.connect(BROKER, PORT, keepalive=60)
    client.subscribe(TOPIC)
    print("Waiting for incoming MQTT messages (press Ctrl+C to stop)...")
    try:
        client.loop_forever()
    except KeyboardInterrupt:
        print("\nSubscriber disconnected.")
        client.disconnect()

if __name__ == "__main__":
    main()
--------------------------------------------------------------------------------
