Control your nightlight over the Internet - Wio Terminal
In this part of the lesson, you will subscribe to commands sent from an MQTT broker to your Wio Terminal.
Subscribe to commands
The next step is to subscribe to the commands sent from the MQTT broker, and respond to them.
Task
Subscribe to commands.
-
Open the nightlight project in VS Code.
-
Add the following code to the bottom of the
config.h
file to define the topic name for the commands:const string SERVER_COMMAND_TOPIC = ID + "/commands";
The
SERVER_COMMAND_TOPIC
is the topic the device will subscribe to to receive LED commands. -
Add the following line to the end of the
reconnectMQTTClient
function to subscribe to the command topic when the MQTT client is reconnected:client.subscribe(SERVER_COMMAND_TOPIC.c_str());
-
Add the following code below the
reconnectMQTTClient
function.void clientCallback(char *topic, uint8_t *payload, unsigned int length)
{
char buff[length + 1];
for (int i = 0; i < length; i++)
{
buff[i] = (char)payload[i];
}
buff[length] = '\0';
Serial.print("Message received:");
Serial.println(buff);
DynamicJsonDocument doc(1024);
deserializeJson(doc, buff);
JsonObject obj = doc.as<JsonObject>();
bool led_on = obj["led_on"];
if (led_on)
digitalWrite(D0, HIGH);
else
digitalWrite(D0, LOW);
}This function will be the callback that the MQTT client will call when it receives a message from the server.
The message is received as an array of unsigned 8-bit integers, so needs to be converted to a character array to be treated as text.
The message contains a JSON document, and is decoded using the ArduinoJson library. The
led_on
property of the JSON document is read, and depending on the value the LED is turned on or off. -
Add the following code to the
createMQTTClient
function:client.setCallback(clientCallback);
This code sets the
clientCallback
as the callback to be called when a message is received from the MQTT broker.💁 The
clientCallback
handler is called for all topics subscribed to. If you later write code that listens to multiple topics, you can get the topic that the message was sent to from thetopic
parameter passed to the callback function. -
Upload the code to your Wio Terminal, and use the Serial Monitor to see the light levels being sent to the MQTT broker.
-
Adjust the light levels detected by your physical or virtual device. You will see messages being received and commands being sent in the terminal. You will also see the LED being turned on and off depending on the light level.
💁 You can find this code in the code-commands/wio-terminal folder.
😀 You have successfully coded your device to respond to commands from an MQTT broker.