1

I am working with Arduino UNO + AdaFruit CC3000 Wi-Fi shield. I ran it with a lot of websites and webpages, but for now I am going to get sub-domain from Heroku, and it has no IP address. The sub-domain is myapp.herokuapp.com.

So, how can I send a GET request to such an application like that?

Here's the code :

 // Library headers section
 #include <Adafruit_CC3000.h>
 #include <ccspi.h>
 #include <SPI.h>
 #include <string.h>
 #include "utility/debug.h"

 // Constants area
 #define ADAFRUIT_CC3000_IRQ  3 // must be an interrupt pin (2 or 3)
 #define ADAFRUIT_CC3000_VBAT  5 // any pin
 #define ADAFRUIT_CC3000_CS  10 // any pin

 //use hardware SPI for remaining pins
 // Uno: SCK=13, MISO=12, MOSI=11
 Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS,      ADAFRUIT_CC3000_IRQ,
                                          ADAFRUIT_CC3000_VBAT,      SPI_CLOCK_DIVIDER);
 #define WLAN_SSID  "Ibtikar.AP2"
 #define WLAN_PASS  "#ibtik@r#"
 // set security type
 // WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA, WLAN_SEC_WPA2
 #define WLAN_SECURITY  WLAN_SEC_WPA2
 #define IDLE_TIMEOUT_MS  3000 // amount of time to wait with no date      recieved
                               // before rejecting/closing the collection
 #define WEBSITE  "myapp.herokuapp.com"
 uint32_t ip;
 void setup() {
   // put your setup code here, to run once:
    Serial.begin(115200);
    Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
/* Initialise the module */
    Serial.println(F("\nInitializing..."));
    delay(100);
    if (!cc3000.begin())
    {
      Serial.println(F("Couldn't begin()! Check your wiring?"));
      while(1);
    }
    Serial.print(F("\nAttempting to connect to "));           Serial.println(WLAN_SSID);
     if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
       Serial.println(F("Failed!"));
       while(1);
     } 
    Serial.println(F("Connected!"));
    /* Wait for DHCP to complete */
    Serial.println(F("Request DHCP"));
    while (!cc3000.checkDHCP())
    {
       delay(100); // ToDo: Insert a DHCP timeout!
    }  

   /* Display the IP address DNS, Gateway, etc. */  
   while (! displayConnectionDetails()) {
     delay(1000);
   }

    ip = 0;
   // Try looking up the website's IP address
   Serial.print(WEBSITE); Serial.print(F(" -> "));
   while (ip == 0) {
     if (! cc3000.getHostByName(WEBSITE, &ip)) {
       Serial.println(F("Couldn't resolve!"));
     }
     delay(500);
   }
   cc3000.printIPdotsRev(ip);

   // Optional: Do a ping test on the website
   Serial.print(F("\n\rPinging ")); cc3000.printIPdotsRev(ip);      Serial.print("...");  
   int replies = cc3000.ping(ip, 5);
   Serial.print(replies); Serial.println(F(" replies"));
 }

 void loop() {
    /* Try connecting to the website.
      Note: HTTP/1.1 protocol is used to keep the server from closing the           connection before all data is read.
   */
    Adafruit_CC3000_Client www = cc3000.connectTCP(ip, 80);
   if (www.connected()) {
     www.fastrprint(F("GET "));
     www.fastrprint(F(" HTTP/1.1\r\n"));
     www.fastrprint(F("Host: myapp.herokuapp.com")); 
     //www.fastrprint(WEBSITE); 
     www.fastrprint(F("\r\n"));
     www.println();
   } else {
     Serial.println(F("Connection failed"));    
     return;
   }
   Serial.println(F("-------------------------------------"));
   unsigned long lastRead = millis();
   while (www.connected() && (millis() - lastRead < IDLE_TIMEOUT_MS)) {
     while (www.available()) {
       char c = www.read();
       Serial.print(c);
       lastRead = millis();
     }
   }
   www.close();
   Serial.println(F("-------------------------------------"));

   /* You need to make sure to clean up after yourself or the CC3000 can           freak out */
   /* the next time your try to connect ... */
        Serial.println(F("\n\nDisconnecting"));
   cc3000.disconnect();
   delay(1000);
 }


 /**************************************************************************/
 /*!
     @brief  Begins an SSID scan and prints out all the visible networks
 */
 /**************************************************************************/

 void listSSIDResults(void)
 {     
   uint32_t index;
   uint8_t valid, rssi, sec;
   char ssidname[33]; 

   if (!cc3000.startSSIDscan(&index)) {
          Serial.println(F("SSID scan failed!"));
          return;
   }

   Serial.print(F("Networks found: ")); Serial.println(index);
   Serial.println(F("================================================"));

   while (index) {
     index--;

     valid = cc3000.getNextSSID(&rssi, &sec, ssidname);

     Serial.print(F("SSID Name    : ")); Serial.print(ssidname);
     Serial.println();
     Serial.print(F("RSSI         : "));
     Serial.println(rssi);
     Serial.print(F("Security Mode: "));
     Serial.println(sec);
     Serial.println();
   }
   Serial.println(F("================================================"));

   cc3000.stopSSIDscan();
 }

      /**************************************************************************/
 /*!
     @brief  Tries to read the IP address and other connection details
 */
 /**************************************************************************/
 bool displayConnectionDetails(void)
 {
   uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;

   if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv,      &dnsserv))
   {
     Serial.println(F("Unable to retrieve the IP Address!\r\n"));
     return false;
   }
   else
   {
     Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
     Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
     Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
     Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
     Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
     Serial.println();
     return true;
   }
 }
1

You don't need to know the IP address; the getHostByName() method takes care of resolving the website to an address. It seems 2 lines are missing from your code:

    #define WEBPAGE "/index.html"  // change the string to the webpage you want

at the top, and:

   www.fastrprint(WEBPAGE);

right after www.fastrprint(F("GET "));. Without these lines, you've failed to indicate the specific webpage you wish to GET. Anyways, when i tried to open myapp.herokuapp.com, I got a message saying that its offline for maintenance, so you'll most likely fail to retrieve anything.

-2

My code is the same as your code, and I managed to succeed.

You can discover what your IP address is by pinging the subdomain. So, for example, on Windows:

C:\>ping myapp.herokuapp.com

Which should give you the response

ping us-east-1-a.route.herokuapp.com [107.21.238.17]

1
  • 1
    Hi haha and welcome to Stack Exchange. Unfortunately, your answer was rather terse, and not really what is expected on SE. If you could add some extra detail, as to any pitfalls that you encountered, or any gotchas that have workarounds, that would be much appreciated. Please take time to have a look at some other people's answers, and also take a look at the tour. I have taken the liberty of expanding your answer. Jan 6 '16 at 14:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.