title: Publish/Subscribe simultaneously using MQTT
body: <p>I'm trying to make a code that can subscribe and publish operations simultaneously. I have this code below that I think should perform the functions simultaneously but it doesn't seem to be working: </p>
  
  <pre><code>
  #include &lt;Adafruit_MQTT.h&gt;
  #include &lt;Adafruit_MQTT_Client.h&gt;
  #include &lt;Adafruit_MQTT_FONA.h&gt;
  //#include &lt;stackThunk.h&gt;
  
  #include &lt;ESP8266WiFi.h&gt;
  #include "Adafruit_MQTT.h"
  #include "Adafruit_MQTT_Client.h"
  
  #include "DHT.h"
  #define DHTPIN 13
  #define DHTTYPE DHT11
  #define Relay1            4
  #define Relay2            0
  #define Relay3            2
  #define Relay4            14
  //#define WLAN_SSID       "((DREAMNET03132490047))"             // Your SSID
  //#define WLAN_PASS       "multan69"    
  DHT dht(DHTPIN, DHTTYPE);
  
  char str_hum[16];
  char str_temp[16];
  #define WLAN_SSID       "Connect(ow)03002618017"             // Your SSID
  #define WLAN_PASS       "XXXXXXX"        // Your password
  
  /************************* Adafruit.io Setup *********************************/
  
  #define AIO_SERVER      "io.adafruit.com"
  #define AIO_SERVERPORT  1883                   // use 8883 for SSL
  #define AIO_USERNAME    "XXXXXXXXXXXXXX"            // Replace it with your username
  #define AIO_KEY         "XXXXXXXXXXXXXXXXXXXXXXXXXXX"   // Replace with your Project Auth Key
  
  /************ Global State (you don't need to change this!) ******************/
  
  // Create an ESP8266 WiFiClient class to connect to the MQTT server.
  WiFiClient client;
  // or... use WiFiFlientSecure for SSL
  //WiFiClientSecure client;
  
  // Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
  Adafruit_MQTT_Client mqtt(&amp;client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
  
  /****************************** Feeds ***************************************/
  
  
  // Setup a feed called 'onoff' for subscribing to changes.
  Adafruit_MQTT_Subscribe Light1 = Adafruit_MQTT_Subscribe(&amp;mqtt, AIO_USERNAME"/feeds/Relay1"); // FeedName
  Adafruit_MQTT_Subscribe Light2 = Adafruit_MQTT_Subscribe(&amp;mqtt, AIO_USERNAME "/feeds/Relay2");
  Adafruit_MQTT_Subscribe Light3 = Adafruit_MQTT_Subscribe(&amp;mqtt, AIO_USERNAME "/feeds/Relay3");
  Adafruit_MQTT_Subscribe Light4 = Adafruit_MQTT_Subscribe(&amp;mqtt, AIO_USERNAME "/feeds/Relay4");
  Adafruit_MQTT_Publish temp = Adafruit_MQTT_Publish(&amp;mqtt, AIO_USERNAME "/feeds/Temperature");
  Adafruit_MQTT_Publish hum = Adafruit_MQTT_Publish(&amp;mqtt, AIO_USERNAME "/feeds/Humidity");
  
  
  
  
  void MQTT_connect();
  
  void setup() {
  
  
   Serial.begin(115200);
    delay(10);
    dht.begin();
    pinMode(Relay1, OUTPUT);
    pinMode(Relay2, OUTPUT);
    pinMode(Relay3, OUTPUT);
    pinMode(Relay4, OUTPUT);
  
    // Connect to WiFi access point.
    Serial.println(); Serial.println();
    Serial.print("Connecting to ");
    Serial.println(WLAN_SSID);
  
    WiFi.begin(WLAN_SSID, WLAN_PASS);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println();
  
    Serial.println("WiFi connected");
    Serial.println("IP address: "); 
    Serial.println(WiFi.localIP());
  
  
    // Setup MQTT subscription for onoff feed.
    mqtt.subscribe(&amp;Light1);
    mqtt.subscribe(&amp;Light3);
    mqtt.subscribe(&amp;Light2);
    mqtt.subscribe(&amp;Light4);
  }
  
  void loop() {
  
    MQTT_connect();
     // Reading temperature or humidity takes about 250 milliseconds!
        // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
        float h = dht.readHumidity();
        // Read temperature as Celsius (the default)
        float t = dht.readTemperature();
        // Read temperature as Fahrenheit (isFahrenheit = true)
        float f = dht.readTemperature(true);
  
        // Check if any reads failed and exit early (to try again).
        if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
        }
  
        // Compute heat index in Fahrenheit (the default)
        float hif = dht.computeHeatIndex(f, h);
        // Compute heat index in Celsius (isFahreheit = false)
        float hic = dht.computeHeatIndex(t, h, false);
        Serial.print("Humidity: ");
        Serial.print(h);
        Serial.print(" %\t");
        Serial.print("Temperature: ");
        Serial.print(t);
        Serial.print(" *C ");
        Serial.print(f);
        Serial.print(" *F\t");
        Serial.print("Heat index: ");
        Serial.print(hic);
        Serial.print(" *C ");
        Serial.print(hif);
        Serial.println(" *F");
  
  
        Serial.print("Temperature in Celsius:");
        Serial.println(String(t).c_str());
  
        Serial.print("Temperature in Fahrenheit:");
        Serial.println(String(f).c_str());
  
        Serial.print("Humidity:");
        Serial.println(String(h).c_str());
  
  
      //dtostrf(gps_latitude, 4, 2, str_temp);
      //dtostrf(gps_longitude, 4, 2, str_hum);
  
    // Now we can publish stuff!
    Serial.print(F("\nSending Humidity value: "));
    Serial.print(String(h).c_str());
    Serial.print("...");
    if (! hum.publish(String(h).c_str())) {
      Serial.println(F("Failed"));
    } else {
      Serial.println(F("OK!"));
    }
  delay(1000);
    Serial.print(F("\nSending Temperature value: "));
    Serial.print(String(t).c_str());
    Serial.print("...");
    if (! temp.publish(String(t).c_str())) {
      Serial.println(F("Failed"));
    } else {
      Serial.println(F("OK!"));
    }
  
  //temperature_work();
    Adafruit_MQTT_Subscribe *subscription;
    while ((subscription = mqtt.readSubscription(20000))) {
      if (subscription == &amp;Light1) {
        Serial.print(F("Got: "));
        Serial.println((char *)Light1.lastread);
        int Light1_State = atoi((char *)Light1.lastread);
      digitalWrite(Relay1, Light1_State);
  
      }
      if (subscription == &amp;Light2) {
        Serial.print(F("Got: "));
        Serial.println((char *)Light2.lastread);
        int Light2_State = atoi((char *)Light2.lastread);
        digitalWrite(Relay2, Light2_State);
      }
      if (subscription == &amp;Light3) {
        Serial.print(F("Got: "));
        Serial.println((char *)Light3.lastread);
        int Light3_State = atoi((char *)Light3.lastread);
        digitalWrite(Relay3, Light3_State);
      }
      if (subscription == &amp;Light4) {
        Serial.print(F("Got: "));
        Serial.println((char *)Light4.lastread);
        int Light4_State = atoi((char *)Light4.lastread);
        digitalWrite(Relay4, Light4_State);
  
      }
    }
  
  
  }
  
  void MQTT_connect() {
    int8_t ret;
  
    // Stop if already connected.
    if (mqtt.connected()) {
      return;
    }
  
    Serial.print("Connecting to MQTT... ");
  
    uint8_t retries = 3;
  
    while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
      Serial.println(mqtt.connectErrorString(ret));
      Serial.println("Retrying MQTT connection in 5 seconds...");
      mqtt.disconnect();
      delay(5000);  // wait 5 seconds
      retries--;
      if (retries == 0) {
        // basically die and wait for WDT to reset me
        while (1);
      }
    }
    Serial.println("MQTT Connected!");
  
  }
  void temperature_work(){
     delay(2000);
  
  
    }
  </code></pre>
  
  <p>However, when I upload the code of publish and subscription separately, it works fine. Can anyone please take a look at my code attempt and tell me what I'm doing wrong?</p>