Multi-device MQTT network in Raspberry Pi - Time & Space Complexity
When many Raspberry Pi devices send messages using MQTT, we want to know how the time to process messages grows as more devices join.
We ask: How does adding more devices affect the work the network does?
Analyze the time complexity of the following code snippet.
import paho.mqtt.client as mqtt
clients = []
for i in range(n):
client = mqtt.Client(f"device_{i}")
client.connect("broker.local")
client.loop_start()
clients.append(client)
for client in clients:
client.publish("sensor/data", "message")
This code connects n devices to an MQTT broker and each device sends one message.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping over
ndevices to connect and send messages. - How many times: Each loop runs
ntimes, once per device.
As the number of devices n grows, the total work grows roughly the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 operations (connect + publish per device) |
| 100 | About 200 operations |
| 1000 | About 2000 operations |
Pattern observation: Doubling devices roughly doubles the work needed.
Time Complexity: O(n)
This means the time to connect and send messages grows directly with the number of devices.
[X] Wrong: "Adding more devices won't affect the time much because messages are sent independently."
[OK] Correct: Each device adds its own connection and message sending steps, so total work adds up linearly.
Understanding how work grows with devices helps you design scalable IoT systems and shows you can think about performance in real networks.
What if each device sends m messages instead of one? How would the time complexity change?
Practice
What is the main role of the MQTT broker in a multi-device network?
Solution
Step 1: Understand MQTT broker function
The MQTT broker acts as a central hub that receives messages from devices and forwards them to others subscribed to the same topic.Step 2: Eliminate incorrect roles
The broker does not store data permanently, assign IPs, or encrypt messages by default; its main job is message routing.Final Answer:
It routes messages between devices based on topics. -> Option AQuick Check:
MQTT broker = message router [OK]
- Thinking broker stores all data permanently
- Confusing broker with network router
- Assuming broker assigns IP addresses
Which of the following is the correct way to connect a Raspberry Pi MQTT client using the paho-mqtt Python library?
client = mqtt.Client(____)
Solution
Step 1: Identify client ID parameter
Themqtt.Client()constructor takes a unique client ID string to identify the device to the broker.Step 2: Understand other options
Broker address is used inconnect()</>, not inClient()</>. Methods likeconnect()or topics are not valid constructor arguments.Final Answer:
"unique_client_id" -> Option DQuick Check:
Client ID goes in Client() constructor [OK]
- Passing broker address to Client() instead of connect()
- Using method calls as constructor arguments
- Confusing topic names with client ID
Given this Python code snippet using paho-mqtt on a Raspberry Pi, what will be printed when a message with payload 'ON' is received on topic 'home/livingroom/light'?
def on_message(client, userdata, msg):
if msg.topic == 'home/livingroom/light':
print(f"Light status: {msg.payload.decode()}")
client = mqtt.Client("pi1")
client.on_message = on_message
client.connect("broker.local")
client.subscribe("home/livingroom/light")
client.loop_start()Solution
Step 1: Understand message payload decoding
The payload is a byte string, somsg.payload.decode()converts it to a normal string, here 'ON'.Step 2: Check print statement output
The print uses an f-string to show "Light status: ON" exactly when the topic matches.Final Answer:
Light status: ON -> Option BQuick Check:
Decoded payload prints as string [OK]
- Printing raw bytes without decoding
- Not subscribing to the correct topic
- Missing the on_message callback assignment
Identify the error in this MQTT client setup code on a Raspberry Pi:
client = mqtt.Client()
client.connect("broker.local")
client.subscribe("home/kitchen/temperature")
client.loop_forever()
# Missing on_message callback assignmentSolution
Step 1: Check callback assignment
Without assigningclient.on_message, received messages have no handler and won't be processed.Step 2: Verify other parts
Client ID is optional but recommended; subscribe syntax is correct; loop_forever() must be after connect().Final Answer:
The on_message callback is not assigned, so messages won't be processed. -> Option AQuick Check:
Missing on_message means no message handling [OK]
- Ignoring on_message callback assignment
- Thinking client ID is mandatory
- Calling loop_forever() before connect()
You want to control multiple Raspberry Pi devices in different rooms using MQTT. Each device should only receive messages for its room. Which is the best way to organize MQTT topics and client IDs?
- Device 1 in living room
- Device 2 in kitchen
Choose the best topic and client ID setup.
Solution
Step 1: Organize topics by room
Using hierarchical topics likehome/livingroom/#andhome/kitchen/#lets devices subscribe only to their room's messages.Step 2: Assign unique client IDs
Unique client IDs likepi_livingroomandpi_kitchenavoid connection conflicts and identify devices clearly.Final Answer:
Use topics like home/livingroom/# and home/kitchen/# with client IDs pi_livingroom and pi_kitchen. -> Option CQuick Check:
Unique IDs + room topics = clean multi-device MQTT [OK]
- Using same client ID for multiple devices
- Subscribing all devices to a single topic
- Not organizing topics by device location
Ready to prove it?
Pass the test and this pattern moves unknown
