0

I'm configuring an ESP8266 using Arduino Uno.

I have several MQTT topics I wish it to subscribe, and I do not want to repeat code 3 or 4 times ( in Python I would have created a list - and make a for loop to subscribe all )

These are my topics:

//MQTT topic
const char* deviceName = "Sonoff1";
const char* deviceTopic = "HomePi/Switches/Sonoff1";
const char* msgTopic = "HomePi/Messages";
const char* groupTopic = "HomePi/All";

This is the function registering a single topic:

void reconnect() {
 // Loop until we're reconnected
 while (!client.connected()) {
 Serial.print("Attempting MQTT connection...");
 // Attempt to connect
 if (client.connect(deviceName,user, passw)) {
 Serial.println("connected");
 pub_msg("Power On");
 client.subscribe(deviceTopic);
 } else {
 Serial.print("failed, rc=");
 Serial.print(client.state());
 Serial.println(" try again in 5 seconds");
 // Wait 5 seconds before retrying
 delay(5000);
 }
 }
}

Appriciate you kind help,

Guy

asked Sep 15, 2018 at 4:05
1
  • 1
    make an array and use a for loop Commented Sep 15, 2018 at 7:19

2 Answers 2

5

You can make life easier if you arrange your topic names hierarchically. As an example suppose we have a multimedia controller that accepts various commmands:

  • mediaserver/set/volume
  • mediaserver/set/pause
  • mediaserver/set/audio/source
  • mediaserver/set/video/subtitles
  • etc...

You can then subscribe to "mediaserver/set/#"

For looping over the array of topics, you can take advantage of modern C++'s range-based for loop:

Example code:

const char *topicArry[] = {
 deviceTopic, msgTopic, groupTopic,
 "HomePi/Dvir/Clock", "HomePi/Dvir/Alerts"
};
void reconnect() {
 // Loop until we're reconnected
 while (!client.connected()) {
 Serial.print("Attempting MQTT connection...");
 // Attempt to connect
 if (client.connect(deviceName,user, passw)) {
 Serial.println("connected");
 pub_msg("Power On");
 for (const char *topic : topicsArry) {
 client.subscribe(topic);
 char msg[50];
 sprintf(msg, "Subscribed to %s",topic);
 pub_msg(msg);
 }
 } else {
 Serial.print("failed, rc=");
 Serial.print(client.state());
 Serial.println(" try again in 5 seconds");
 // Wait 5 seconds before retrying
 delay(5000);
 }
 }
}
answered May 31, 2022 at 16:00
1

just for a closure:

added an array (thank to Juraj):const char* topicsArry[]={deviceTopic, msgTopic, groupTopic, "HomePi/Dvir/Clock", "HomePi/Dvir/Alerts"};

a for loop to over this that loop, and using sizeof ( which was not trivial for me ), led to :

void reconnect() {
 // Loop until we're reconnected
 while (!client.connected()) {
 Serial.print("Attempting MQTT connection...");
 // Attempt to connect
 if (client.connect(deviceName,user, passw)) {
 Serial.println("connected");
 pub_msg("Power On");
 for (int i=0; i<=sizeof(topicsArry)/sizeof(char *); i++){
 client.subscribe(topicsArry[i]);
 char msg[50];
 sprintf(msg, "Subscribed to %s",topicsArry[i]);
 pub_msg(msg);
 }
 } else {
 Serial.print("failed, rc=");
 Serial.print(client.state());
 Serial.println(" try again in 5 seconds");
 // Wait 5 seconds before retrying
 delay(5000);
 }
 }
}
answered Sep 15, 2018 at 10:09

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.