Learning   Examples | Foundations | Hacking | Links

Examples > GSM library

GSM Test GPRS

This sketch tests the GPRS data connection on the GSM shield. It tries to connect to arduino.cc.

To use a data connection with the GSM shield, you'll need your provider's Access Point Name (APN), login, and password. To obtain this information, contact the network provider for the most up to date information. This page has some information about various carrier settings, but it may not be current.

Hardware Required

  • Arduino board
  • Arduino + Telefonica GSM/GPRS Shield
  • SIM card with data connection

Circuit

image of the Arduino GSM Shield on top of an Arduino Uno

First, import the GSM library

#include <GSM.h>

SIM cards may have a PIN number that enables their functionality. Define the PIN for your SIM. If your SIM has no PIN, you can leave it blank :

#define PINNUMBER ""

Initialize instances of the classes you're going to use. You're going to need the GSM, GPRS, and GSMClient classes.

GSMClient client;
GPRS gprsAccess;
GSM gsmAccess;

Create some status messages to send to the serial monitor:

String oktext = "OK";
String errortext = "ERROR";

Create some variables to hold the server, path, and proxy you wish to connect to.

char url[] = "arduino.cc";
char path[] = "/";
char urlproxy[] = "http://arduino.cc";

Create a variable to hold a response from the server, and a flag to indicate f you wil be using a proxy or not.

String response = "";

boolean use_proxy = false;

In setup, open a serial connection to the computer.

void setup(){
  Serial.begin(9600);
}

You're going to create a custom function to handle serial input from the serial monitor. make a named function that accepts a char array as an argument.

int readSerial(char result[])
{

make a variable to act as a counter. While there is serial information available, read it into the char array. If a newline character is encountered, terminate the array and return to the main program.

int i = 0;
  while(1)
  {
    while (Serial.available() > 0)
    {
      char inChar = Serial.read();
      if (inChar == '\n')
      {
        result[i] = '\0';
        return 0;
      }
      if(inChar!='\r')
      {
        result[i] = inChar;
        i++;
      }
    }
  }
}

In loop(), set the proxy flag to false

void loop()
{
  use_proxy = false;

Start the connection to the GSM network by passing the PIN number (if applicable) to gsmAccess.begin().

Serial.print("Connecting GSM network...");
  if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
  {
    Serial.println(errortext);
    while(true);
  }
  Serial.println(oktext);

Create a char array to hold the APN. Use the readSerial() function you created to get the bytes from the serial monitor

char apn[50];
  Serial.print("Enter your APN: ");
  readSerial(apn);
  Serial.println(apn);

Create a char array to hold the APN login. Use the readSerial() function you created to get the bytes from the serial monitor

char login[50];
  Serial.print("Now, enter your login: ");
  readSerial(login);
  Serial.println(login);

Create a char array to hold the APN password. Use the readSerial() function you created to get the bytes from the serial monitor

char password[20];
  Serial.print("Finally, enter your password: ");
  readSerial(password);

Connect to the GPRS network using gprs.attachGPRS(). This requires the APN, login, and password you just entered.

When the modem has attached itself to the GPRS network, gsmAccess() will return GSM_READY.

Serial.println("Attaching to GPRS with your APN...");
  if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY)
  {
    Serial.println(errortext);
  }
  else{

    Serial.println(oktext);

Create a char array to hold any proxy information you may need. Use the readSerial() function you created to get the bytes from the serial monitor.

char proxy[100];
    Serial.print("If your carrier uses a proxy, enter it, if not press enter: ");
    readSerial(proxy);
    Serial.println(proxy);

If a proxy was indicated, ask for the port number, and set the proxy flag to true

int pport;
    if(proxy[0] != '\0'){
      // read proxy port introduced by user
      char proxyport[10];
      Serial.print("Enter the proxy port: ");
      readSerial(proxyport);
      // cast proxy port introduced to integer
      pport = (int) proxyport;
      use_proxy = true;
      Serial.println(proxyport);
    }

Create a variable to indicate if you are connected to the server or not. With client.connect(), make a connection to the server. How you make the connection will depend on if you are using a proxy or not.

Serial.print("Connecting and sending GET request to arduino.cc...");
    int res_connect;

    if(use_proxy)
      res_connect = client.connect(proxy, pport);
    else
      res_connect = client.connect(url, 80);

if you have connected, make a HTTP GET request using client.print().

if (res_connect)
    {
      client.print("GET ");

      if(use_proxy)
        client.print(urlproxy);
      else
        client.print(path);

      client.println(" HTTP/1.0");
      client.println();
      Serial.println(oktext);
    }

If no connection was made, print out an error

else
    {
      // if you didn't get a connection to the server
      Serial.println(errortext);
    }

Check to see if the server returned any bytes using client.available(). If there are, read them into the response String, then cast them into a char array. Check the array for the substring "200 OK", which indicates a valid response from arduino.cc.

Serial.print("Receiving response...");

    boolean test = true;
    while(test)
    {
      if (client.available())
      {
        char c = client.read();
        response += c;

        char responsechar[response.length()+1];
        response.toCharArray(responsechar, response.length()+1);

        if(strstr(responsechar, "200 OK") != NULL){
          Serial.println(oktext);
          Serial.println("TEST COMPLETE!");
          test = false;
        }
      }

If the server has disconnected, stop the client and close loop()

if (!client.connected())
      {
        Serial.println();
        Serial.println("disconnecting.");
        client.stop();
        test = false;
      }
    }
  }
}

Once your code is uploaded, open the serial monitor to see the status of the connection.

/*

 This test asks your APN data and try to connect
 to arduino.cc site by GPRS.

 Circuit:
 * GSM shield attached

 Created 18 Jun 2012
 by David del Peral
 */


// libraries
#include <GSM.h>

// PIN Number
#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess;        // GSM access: include a 'true' parameter for debug enabled
GPRS gprsAccess;  // GPRS access
GSMClient client;  // Client service for TCP connection

// messages for serial monitor response
String oktext = "OK";
String errortext = "ERROR";

// URL and path (for example: arduino.cc)
char url[] = "arduino.cc";
char urlproxy[] = "http://arduino.cc";
char path[] = "/";

// variable for save response obtained
String response = "";

// use a proxy
boolean use_proxy = false;

void setup()
{
    // initialize serial communications
  Serial.begin(9600);
}

void loop()
{
  use_proxy = false;

  // start GSM shield
  // if your SIM has PIN, pass it as a parameter of begin() in quotes
  Serial.print("Connecting GSM network...");
  if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
  {
    Serial.println(errortext);
    while(true);
  }
  Serial.println(oktext);

  // read APN introduced by user
  char apn[50];
  Serial.print("Enter your APN: ");
  readSerial(apn);
  Serial.println(apn);

  // Read APN login introduced by user
  char login[50];
  Serial.print("Now, enter your login: ");
  readSerial(login);
  Serial.println(login);

  // read APN password introduced by user
  char password[20];
  Serial.print("Finally, enter your password: ");
  readSerial(password);

  // attach GPRS
  Serial.println("Attaching to GPRS with your APN...");
  if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY)
  {
    Serial.println(errortext);
  }
  else{

    Serial.println(oktext);

    // read proxy introduced by user
    char proxy[100];
    Serial.print("If your carrier uses a proxy, enter it, if not press enter: ");
    readSerial(proxy);
    Serial.println(proxy);

    // if user introduced a proxy, asks him for proxy port
    int pport;
    if(proxy[0] != '\0'){
      // read proxy port introduced by user
      char proxyport[10];
      Serial.print("Enter the proxy port: ");
      readSerial(proxyport);
      // cast proxy port introduced to integer
      pport = (int) proxyport;
      use_proxy = true;
      Serial.println(proxyport);
    }

    // connection with arduino.cc and realize HTTP request
    Serial.print("Connecting and sending GET request to arduino.cc...");
    int res_connect;

    // if use a proxy, connect with it
    if(use_proxy)
      res_connect = client.connect(proxy, pport);
    else
      res_connect = client.connect(url, 80);

    if (res_connect)
    {
      // make a HTTP 1.0 GET request (client sends the request)
      client.print("GET ");

      // if use a proxy, the path is arduino.cc URL
      if(use_proxy)
        client.print(urlproxy);
      else
        client.print(path);

      client.println(" HTTP/1.0");
      client.println();
      Serial.println(oktext);
    }
    else
    {
      // if you didn't get a connection to the server
      Serial.println(errortext);
    }
    Serial.print("Receiving response...");

    boolean test = true;
    while(test)
    {
      // if there are incoming bytes available
      // from the server, read and check them
      if (client.available())
      {
        char c = client.read();
        response += c;

        // cast response obtained from string to char array
        char responsechar[response.length()+1];
        response.toCharArray(responsechar, response.length()+1);

        // if response includes a "200 OK" substring
        if(strstr(responsechar, "200 OK") != NULL){
          Serial.println(oktext);
          Serial.println("TEST COMPLETE!");
          test = false;
        }
      }

      // if the server's disconnected, stop the client:
      if (!client.connected())
      {
        Serial.println();
        Serial.println("disconnecting.");
        client.stop();
        test = false;
      }
    }
  }
}

/*
  Read input serial
 */

int readSerial(char result[])
{
  int i = 0;
  while(1)
  {
    while (Serial.available() > 0)
    {
      char inChar = Serial.read();
      if (inChar == '\n')
      {
        result[i] = '\0';
        return 0;
      }
      if(inChar!='\r')
      {
        result[i] = inChar;
        i++;
      }
    }
  }
}

See Also:

Share