Problem with HTTP GET request

Hi everybody,

first I have to say I’m quite new to all of this.
Anyhow, I have an Arduino Uno R3 with an IComSat 1.1 SIM900 attached.

I’m using this library (version 3.05), as it supports using the gsm shield as a web client:
https://code.google.com/p/gsm-shield-arduino/downloads/list

After adding this library to Arduino 1.0.5 I open the library’s example GSM_GPRSLibrary_Client.ino with the following code:

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to start a connection as client.

InetGSM inet;

char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;

void setup() 
{
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(9600)){
    Serial.println("\nstatus=READY");
    started=true;  
    gsm.forceON();
  }
  else Serial.println("\nstatus=IDLE");
  
  if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.t-mobile", "t-mobile", "tm"))
      Serial.println("status=ATTACHED");
    else Serial.println("status=ERROR");
    delay(1000);
    
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is empty.
    gsm.WhileSimpleRead();
  
    //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpGET("www.google.com", 80, "/", msg, 50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);  
    Serial.println("\nData received:"); 
    Serial.println(msg); 
  }
};

void loop() 
{
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();
};

void serialhwread(){
  i=0;
  if (Serial.available() > 0){            
    while (Serial.available() > 0) {
      inSerial[i]=(Serial.read());
      delay(10);
      i++;      
    }
    
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWriteln(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWriteln("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    else{
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }    
    inSerial[0]='\0';
  }
}

void serialswread(){
  gsm.SimpleRead();
}

The Terminal result (set to 9600 baud) is:

GSM Shield testing.

status=READY
DB:STARTING NEW CONNECTION
DB:SHUTTED OK
DB:APN OK
DB:CONNECTION OK
DB:ASSIGNED AN IP
status=ATTACHED

10.23.36.179
DB:RECVD CMD
DB:OK TCP
DB:NOT CONN
DB:NOT CONN
DB:NOT CONN

Number of data received:
0

Data received:

After the line “DB:OK TCP”, the GSM shield just switches off, the status LED turns from green to off.

My problem is similar to this post:

Using the SMS sample works fine, I’m able with the same set up to send SMS…
I have a 9V battery attached as well as the USB-cable.

Any help is appreciated.

What does the '50' parameter in this call indicate?

    numdata=inet.httpGET("www.google.com", 80, "/", msg, 50);

If it is the number of characters to read, then you might want to increase the size of the msg array by one. It may be putting a terminating zero where you expect it least. Knowing how memory is allocated, the terminating zero would be put in numdata, or part of it.

This is the “httpGET” function out of the library:

int InetGSM::httpGET(const char* server, int port, const char* path, char* result, int resultlength)
{
  boolean connected=false;
  int n_of_at=0;
  int length_write;
  char end_c[2];
  end_c[0]=0x1a;
  end_c[1]='\0';

  /*
  Status = ATTACHED.
  if(gsm.getStatus()!=GSM::ATTACHED)
    return 0;
  */
  while(n_of_at<3){
	  if(!connectTCP(server, port)){
	  	#ifdef DEBUG_ON
			Serial.println("DB:NOT CONN");
		#endif	
	    	n_of_at++;
	  }
	  else{
		connected=true;
		n_of_at=3;
	}
  }

  if(!connected) return 0;
	
  gsm.SimpleWrite("GET ");
  gsm.SimpleWrite(path);
  gsm.SimpleWrite(" HTTP/1.0\nHost: ");
  gsm.SimpleWrite(server);
  gsm.SimpleWrite("\n");
  gsm.SimpleWrite("User-Agent: Arduino");
  gsm.SimpleWrite("\n\n");
  gsm.SimpleWrite(end_c);

  switch(gsm.WaitResp(10000, 10, "SEND OK")){
	case RX_TMOUT_ERR: 
		return 0;
	break;
	case RX_FINISHED_STR_NOT_RECV: 
		return 0; 
	break;
  }
  
  
 delay(50);
  	#ifdef DEBUG_ON
		Serial.println("DB:SENT");
	#endif	
  int res= gsm.read(result, resultlength);
 
  //gsm.disconnectTCP();
  
  //int res=1;
  return res;
}

So yes, 50 is the result length.

I’ve changed the code of the sketch to:

numdata=inet.httpGET("www.google.com", 80, "/", msg, 51);

… but the result remains the same:

GSM Shield testing.

status=READY
DB:STARTING NEW CONNECTION
DB:SHUTTED OK
DB:APN OK
DB:CONNECTION OK
DB:ASSIGNED AN IP
status=ATTACHED

10.213.56.181
DB:RECVD CMD
DB:NOT CONN
DB:NOT CONN
DB:NOT CONN

Number of data received:
0

Data received:

I've changed the code of the sketch to:

So, now it's OK to write 51 characters (plus, possibly, the trailing NULL) into the 50 element array. Right.

No, of course I've changed the code to:

numdata=inet.httpGET("www.google.com", 80, "/", msg, 51);

and

char msg[51];

as well...

the problem still remains..

Don't do this.

No, of course I've changed the code to: numdata=inet.httpGET("www.google.com", 80, "/", msg, 51); char msg[51];

The array must be one larger than the string. If you are reading 50 characters, the array must be 51 characters. It needs room for the zero terminator.

char msg[51];
numdata=inet.httpGET("www.google.com", 80, "/", msg, 50);

I have a 9V battery attached as well as the USB-cable.

If the device is switching off it’s not a software problem, it’s a power supply problem. Your 9v battery can not keep up with the necessary 2 amp pulses of current that are required to maintain the GPRS connection. GSM modules are very sensitive to voltage fluctuations on the power supply and will shut down if the voltage level fluctuates too much (I believe it’s something like 300mV drop will make it power down). Either use a power supply that can supply 2amps or place some very large capacitors across the power terminals to compensate.

Codac,

Did you solve this?

Im having possibly the same issue. Did you use capacitors or a power supply?

Im not sure how I could do either of those:

  1. What power supply should I get in terms of V & A specs?

  2. What about capacitors? What kind should I get and how would I make them go across the power terminals? Would I connect the power cables from the SIM900 to a breadboard?

Thanks