3

I have a code that was available on this website https://hackaday.io/project/3072/instructions . I made the code work by modifying it a little but the main problem is that it serves the GET request only once. What i want is continuous page fetch and there should be no TCP connection closing. I have tried different methods but the connection always breaks after 1 GET request. Moreover, if i do not send any GET request then it serves the domain's index page continuously without breaking TCP connection. This is the original code http://dunarbin.com/esp8266/retroBrowser.ino.
And this is mine.

    #define SSID        "vivek"
    #define PASS        "bustedparamour21"
    #define DEST_HOST   "www.electronics2work.com"
    #define DEST_IP     "31.170.161.234"
    #define TIMEOUT     10000 // mS
    #define CONTINUE    false
    #define HALT        true

    #define ECHO_COMMANDS // Un-comment to echo AT+ commands to serial monitor

    // Print error message and loop stop.
    void errorHalt(String msg)
    {
      Serial.println(msg);
      Serial.println("HALT");
      while(true){};
    }

    // Read characters from WiFi module and echo to serial until keyword occurs or timeout.
    boolean echoFind(String keyword)
    {
      byte current_char   = 0;
      byte keyword_length = keyword.length();

      // Fail if the target string has not been sent by deadline.
      long deadline = millis() + TIMEOUT;
      while(millis() < deadline)
      {
        if (Serial1.available())
        {
          char ch = Serial1.read();
          Serial.write(ch);
          if (ch == keyword[current_char])
            if (++current_char == keyword_length)
            {
              Serial.println();
              return true;
            }
        }
      }
      return false;  // Timed out
    }

    // Read and echo all available module output.
    // (Used when we're indifferent to "OK" vs. "no change" responses or to get around firmware bugs.)
    void echoFlush()
      {while(Serial1.available()) Serial.write(Serial1.read());}

    // Echo module output until 3 newlines encountered.
    // (Used when we're indifferent to "OK" vs. "no change" responses.)
    void echoSkip()
    {
      echoFind("\n");        // Search for nl at end of command echo
      echoFind("\n");        // Search for 2nd nl at end of response.
      echoFind("\n");        // Search for 3rd nl at end of blank line.
    }

    // Send a command to the module and wait for acknowledgement string
    // (or flush module output if no ack specified).
    // Echoes all data received to the serial monitor.
    boolean echoCommand(String cmd, String ack, boolean halt_on_fail)
    {
      Serial1.println(cmd);
      #ifdef ECHO_COMMANDS
        Serial.print("--"); Serial.println(cmd);
      #endif

      // If no ack response specified, skip all available module output.
      if (ack == "")
        echoSkip();
      else
        // Otherwise wait for ack.
        if (!echoFind(ack))          // timed out waiting for ack string 
          if (halt_on_fail)
            errorHalt(cmd+" failed");// Critical failure halt.
          else
            return false;            // Let the caller handle it.
      return true;                   // ack blank or ack found
    }

    // Connect to the specified wireless network.
    boolean connectWiFi()
    {
      String cmd = "AT+CWJAP=\""; cmd += SSID; cmd += "\",\""; cmd += PASS; cmd += "\"";
      if (echoCommand(cmd, "OK", CONTINUE)) // Join Access Point
      {
        Serial.println("Connected to WiFi.");
        return true;
      }
      else
      {
        Serial.println("Connection to WiFi failed.");
        return false;
      }
    }

    // ******** SETUP ********
    void setup()  
    {
      Serial.begin(9600);         // Communication with PC monitor via USB
      Serial1.begin(9600);        // Communication with ESP8266 via 5V/3.3V level shifter

      Serial1.setTimeout(TIMEOUT);
      Serial.println("ESP8266 Demo");

      delay(2000); 
      Serial.println("Module is ready.");
      echoCommand("AT+GMR", "OK", CONTINUE);   // Retrieves the firmware ID (version number) of the module. 
      echoCommand("AT+CWMODE?","OK", CONTINUE);// Get module access mode. 

      // echoCommand("AT+CWLAP", "OK", CONTINUE); // List available access points - DOESN't WORK FOR ME

      echoCommand("AT+CWMODE=1", "", HALT);    // Station mode
      echoCommand("AT+CIPMUX=1", "", HALT);    // Allow multiple connections (we'll only use the first).

      //connect to the wifi
      boolean connection_established = false;
      for(int i=0;i<5;i++)
      {
        if(connectWiFi())
        {
          connection_established = true;
          break;
        }
      }
      if (!connection_established) errorHalt("Connection failed");

      delay(5000);

      //echoCommand("AT+CWSAP=?", "OK", CONTINUE); // Test connection
      echoCommand("AT+CIFSR", "", HALT);         // Echo IP address. (Firmware bug - should return "OK".)
      //echoCommand("AT+CIPMUX=0", "", HALT);      // Set single connection mode
    }

    // ******** LOOP ********
    void loop() 
    {
      // Establish TCP connection
      String cmd = "AT+CIPSTART=0,\"TCP\",\""; cmd += DEST_IP; cmd += "\",80";
      if (!echoCommand(cmd, "OK", CONTINUE)) return;
      delay(2000);

      // Get connection status 
      if (!echoCommand("AT+CIPSTATUS", "OK", CONTINUE)) 
      return;

      // Build HTTP request.
      cmd = "GET /";
      cmd +="iot/graphing.php?a=1&b=ldr&c=41 ";
      cmd += "HTTP/1.1\r\nHost: ";
      cmd += DEST_HOST; 
      cmd += ":80\r\n\r\n";

      // Ready the module to receive raw data
      if (!echoCommand("AT+CIPSEND=0,"+String(cmd.length()), ">", CONTINUE))
      {
        echoCommand("AT+CIPCLOSE", "", CONTINUE);
        Serial.println("Connection timeout.");
        return;
      }

      // Send the raw HTTP request
      echoCommand(cmd, "OK",CONTINUE );  // GET

      // Loop forever echoing data received from destination server.
      while(true)
        while (Serial1.available())
          Serial.write(Serial1.read());

      errorHalt("ONCE ONLY");
    }

This code makes get request only once. How can i make it serve GET request Continously without closing TCP connection?
THANKS in Advance!!

1 Answer 1

1

You need to close your connection using AT+CIPCLOSE and then start a new connection again. For example, if you need to make two connections everytime(like making connection with 2 websites) , you can make 1 connection, then close this connection. Now make another connection and close it. I made 2 connections in my loop() function using above logic and it is working fine.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

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.