Multi-device MQTT network in Raspberry Pi - Step-by-Step Execution
import paho.mqtt.client as mqtt def on_message(client, userdata, msg): print(f"Received {msg.payload.decode()} on {msg.topic}") client = mqtt.Client("device1") client.on_message = on_message client.connect("broker.hivemq.com") client.subscribe("home/temperature") client.loop_start() client.publish("home/temperature", "22.5")
| Step | Action | Evaluation | Result |
|---|---|---|---|
| 1 | Create MQTT client with ID 'device1' | Client created | Client object ready |
| 2 | Assign on_message callback | Callback set | Ready to receive messages |
| 3 | Connect to broker 'broker.hivemq.com' | Connection attempt | Connected successfully |
| 4 | Subscribe to topic 'home/temperature' | Subscription request | Subscribed successfully |
| 5 | Start network loop | Loop running | Listening for messages |
| 6 | Publish message '22.5' to 'home/temperature' | Publish request | Message sent |
| 7 | Receive message on 'home/temperature' | Message received | on_message called, prints message |
| 8 | Process message in on_message | Print output | Output: Received 22.5 on home/temperature |
| 9 | Loop continues | Waiting for more messages | Ready for next messages |
| 10 | Disconnect client | Disconnect request | Disconnected cleanly |
| Variable | Start | After Step 3 | After Step 4 | After Step 6 | After Step 8 | Final |
|---|---|---|---|---|---|---|
| client | None | Connected client object | Subscribed client | Published message | Received message processed | Disconnected client |
Multi-device MQTT network: - Devices connect to a broker - Subscribe to topics to receive messages - Publish messages to topics - Use a network loop to listen continuously - on_message callback processes incoming messages - Disconnect cleanly when done
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
