Ubidots Community

What is the difference between those methods to send variables using mqtt?

Hi, I wanna make a IoT project, but I noticed there is two methods to send variables by mqtt, What is the difference ?

The first one : use too many sprintf + client.publish functions:

/*************************************************************************************************
 * This Example sends harcoded data to Ubidots and serves as example for users that have devices
 * based on ESP8266 chips
 *
 * This example is given AS IT IS without any warranty
 *
 * Made by Jose García @https://github.com/jotathebest/ , 
 * adapted from the original WiFiClient ESP8266 example
 *************************************************************************************************/

/****************************************
 * Include Libraries
 ****************************************/

#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <stdio.h>


/****************************************
 * Define Constants
 ****************************************/

#define WIFISSID "...." // Put your WifiSSID here
#define PASSWORD "...." // Put your wifi password here
#define TOKEN "...." // Put your Ubidots' TOKEN
#define DEVICE_LABEL "weather-station" // Put the device label
#define VARIABLE_LABEL_1 "temperature" // Put the variable label
#define VARIABLE_LABEL_2 "humidity" // Put the variable label
#define MQTT_CLIENT_NAME "...." // MQTT client Name, put a Random ASCII

char mqttBroker[] = "industrial.api.ubidots.com";
char payload[700];
char topic[150];

// Space to store values to send
char str_val_1[6];
char str_val_2[6];

/****************************************
 * Initializate constructors for objects
 ****************************************/

ESP8266WiFiMulti WiFiMulti;
WiFiClient ubidots;
PubSubClient client(ubidots);


/****************************************
 * Auxiliar Functions
 ****************************************/
 
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i=0;i<length;i++) {
  Serial.print((char)payload[i]);
  }
  Serial.println();
} 

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
  Serial.println("Attempting MQTT connection...");

  // Attempt to connect
  if (client.connect(MQTT_CLIENT_NAME, TOKEN,"")) {
    Serial.println("connected");
  } else {
    Serial.print("failed, rc=");
    Serial.print(client.state());
    Serial.println(" try again in 2 seconds");
    // Wait 2 seconds before retrying
    delay(2000);
  }
  }
}


/****************************************
 * Main Functions
 ****************************************/

void setup() {
  Serial.begin(115200);
  WiFiMulti.addAP(WIFISSID, PASSWORD);
  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi... ");

  while(WiFiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  client.setServer(mqttBroker, 1883);
  client.setCallback(callback);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }

  // Values to send
  float temperature = random(0, 50);
  float humidity = random(0, 50);

  /* 4 is mininum width, 2 is precision; float value is copied onto str_temp*/
  dtostrf(temperature, 4, 2, str_val_1);
  dtostrf(humidity, 4, 2, str_val_2);

  sprintf(topic, "%s", ""); // Cleans the topic content
  sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);

  sprintf(payload, "%s", ""); // Cleans the payload content
  sprintf(payload, "{\"%s\":", VARIABLE_LABEL_1); // Adds the variable label   
  sprintf(payload, "%s {\"value\": %s}", payload, str_val_1); // Adds the value
  sprintf(payload, "%s, \"%s\":", payload, VARIABLE_LABEL_2); // Adds the variable label   
  sprintf(payload, "%s {\"value\": %s}", payload, str_val_2); // Adds the value
  sprintf(payload, "%s}", payload); // Closes the dictionary brackets

  Serial.println(payload);

  client.publish(topic, payload);
  client.loop();
  delay(1000);
}

The second one use only few functions “add and ubidotsPublish” to indicate variables and device:

/******************************************
 *
 * This example works for both Industrial and STEM users.
 * If you are using the old educational platform,
 * please consider to migrate your account to a STEM plan
 *
 * Developed by Jose Garcia, https://github.com/jotathebest/
 *
 * ****************************************/

/****************************************
 * Include Libraries
 ****************************************/
#include "UbidotsESPMQTT.h"

/****************************************
 * Define Constants
 ****************************************/
#define TOKEN "....."     // Your Ubidots TOKEN
#define WIFINAME "....."  // Your SSID
#define WIFIPASS "....."  // Your Wifi Pass

Ubidots client(TOKEN);

/****************************************
 * Auxiliar Functions
 ****************************************/

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

/****************************************
 * Main Functions
 ****************************************/
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  client.setDebug(true);  // Pass a true or false bool value to activate debug messages
  client.wifiConnection(WIFINAME, WIFIPASS);
  client.begin(callback);
}
void loop() {
  // put your main code here, to run repeatedly:
  if (!client.connected()) {
    client.reconnect();
  }
  // Values to send
  float temperature = random(0, 50);
  float humidity = random(0, 50);
  // Publish values to 2 different data sources
  client.add("VARIABLE_LABEL_1", temperature);  // Insert your variable Labels and the value to be sent**
  client.add("VARIABLE_LABEL_2", humidity);
  client.ubidotsPublish("DEVICE_LABEL");**
  client.loop();
  delay(1000);
}

Hello @aymannox,

The differences are simple. While the first approach uses raw libraries for the ESP8266 to manage the WiFi and MQTT connections, the second consists of a wrapper of these raw variables that ultimately ease the WiFi connection management as well as connecting to Ubidots MQTT broker. As you’ve pointed out, the second approach is lighter in a way that uses significantly less code compared to the method using the raw libraries.
On top of that, the "UbidotsESPMQTT.h is maintain by Ubidots hardware dev team, so it always up to date to the latest MQTT broker functionalities.

if you’re integrating your ESP8266 with Ubidots, it is advisable to use its targeted library.

–David