Test GPRS en GSM

Este programa comprueba la conexión de datos GPRS en el escudo GSM. Se trata de conectarse a arduino.cc.

Para utilizar una conexión de datos con el escudo GSM, necesitará un Nombre de Punto de Acceso (APN) de su proveedor , inicio de sesión (login) y contraseña (password). Para obtener esta información, póngase en contacto con el proveedor de red para la información más actualizada. Esta página tiene alguna información acerca de los diversos ajustes de operador, pero puede no estar actualizada.

Hardware necesitado

Código
En primer lugar, importar la biblioteca GSM.
#include <GSM.h>
Las tarjetas SIM pueden tener un número PIN que les permite funcionar. Defina el PIN de su tarjeta SIM. Si su tarjeta SIM no tiene PIN, puede dejarlo en blanco.
#define PINNUMBER ""
Inicializar instancias de las clases que va a utilizar. Va a necesitar las clases GSM, GPRS y GSMClient.
GSMClient client;
GPRS gprsAccess;
GSM gsmAccess;
Crear algunos mensajes de estado para enviar al monitor serie: 
String oktext = "OK";
String errortext = "ERROR";
Crear algunas variables para contener el servidor, la ruta y proxy al que desea conectarse.
String oktext = "OK";
String errortext = "ERROR";

Crear una variable para contener una respuesta desde el servidor, y una bandera para indicar si se va a utilizar un proxy o no.

String response = "";
boolean use_proxy = false;

En setup, abra una conexión serie al ordenador.

void setup(){
   Serial.begin(9600);
 }
 
Va a crear una función personalizada para controlar la entrada del monitor serie. Hacer una llamada a la función que acepta una matriz de caracteres como argumento.

int readSerial(char result[])
 {
 
Hacer una variable para actuar como un contador. Mientras haya información disponible en el monitor serie, leer la matriz de caracteres. Si se encuentra un carácter de nueva línea, terminar la matriz y volver al programa principal.

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++;
       }
     }
   }
 }
 
En loop (), establecer el indicador proxy a false

void loop()
 {
   use_proxy = false;
 
Iniciar la conexión a la red GSM pasando el número de PIN (si es aplicable) para gsmAccess.begin ().

Serial.print("Conectando a la red GSM...");
   if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
   {
     Serial.println(errortext);
     while(true);
   }
   Serial.println(oktext);

Crear una matriz de caracteres para mantener la APN. Utilice la función readSerial () que ha creado para obtener los bytes del monitor serie

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

Crear una matriz de caracteres para almacenar el APN. Utilice la función readSerial () que ha creado para obtener los bytes del monitor serie

char login[50];
   Serial.print("Ahora, introducir su login: ");
   readSerial(login);
   Serial.println(login);

Crear una matriz de caracteres para mantener la contraseña de APN. Utilice la función readSerial () que ha creado para obtener los bytes del monitor serie

char password[20];
   Serial.print("Finalmente, introducir su password: ");
   readSerial(password);
 
Conectarse a la red GPRS utilizando gprs.attachGPRS (). Esto requiere el APN, el login y la password que acaba de introducir.

Cuando el módem se ha conectado a la red GPRS, gsmAccess () devolverá GSM_READY.

Serial.println("Conectando a la red GPRS con su APN...");
   if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY)
   {
     Serial.println(errortext);
   }
   else{

     Serial.println(oktext);
 
Crear una matriz de caracteres para mantener la información de proxies que pueda necesitar. Utilice la función readSerial () que ha creado para obtener los bytes del monitor serie.

char proxy[100];
     Serial.print("Si su portadora usa un proxy, introducir este, si no pulsar enter: ");
     readSerial(proxy);
     Serial.println(proxy);
 
Si se indica un proxy, pregunte por el número de puerto y establecer el indicador proxy a 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);
     }
 
Crear una variable para indicar si está conectado al servidor o no. Con client.connect (), establecer una conexión con el servidor. Cómo realizar la conexión dependerá de si está utilizando un proxy o no.

Serial.print("Conectarse y enviar solicitud GET a arduino.cc...");
     int res_connect;

     if(use_proxy)
       res_connect = client.connect(proxy, pport);
     else
       res_connect = client.connect(url, 80);
 
Si se ha conectado, hacer una solicitud a través de HTTP GET client.print ().

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

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

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

Si no se realiza ninguna conexión, imprima un error

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

Compruebe si el servidor ha devuelto ningún byte usando client.available (). Si los hay, leerlos en la cadena de respuesta, y luego volcarlos en una matriz de caracteres. Compruebe la matriz para la subcadena "200 OK", que indica una respuesta válida desde el arduino.cc.

Serial.print("Recibiendo respuesta...");

     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 COMPLETO!");
           test = false;
         }
       }
 
Si el servidor se ha desconectado, detener el cliente y cerrar loop ()

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

Una vez que se carga el código, abrir el monitor serie para ver el estado de la conexión.


El programa completo se encuentra a continuación.


// Test GPRS con GSM
 //Este programa comprueba la capacidad del escudo GSM para conectarse
 // a una red GPRS. Se solicita información de la APN a través del
 // monitor serie e intenta conectarse a arduino.cc.

 // Circuito:
 // * Escudo GSM conectado
 // * Tarjeta SIM con plan de datos

 // Creado el 18 Junio de 2012 por David del Peral

 //Este ejemplo de código es de dominio público

 //http://www.arduino.cc/en/Tutorial/GSMToolsTestGPRS *

 // bibliotecas
 #include <GSM.h>

 // Numero de PIN
 #define PINNUMBER ""

 // inicializa la instancia biblioteca
 GSM gsmAccess;        // Acceso GSM: incluye un parámetro "true" para habilitar la depuración
 GPRS gprsAccess;  // Acceso GPRS
 GSMClient client;  // servicio al cliente para la conexión TCP

 // Mensajes de respuesta del monitor serie
 String oktext = "OK";
 String errortext = "ERROR";

 // URL y ruta (por ejemplo: arduino.cc)
 char url[] = "arduino.cc";
 char urlproxy[] = "http://www.arduino.cc";
 char path[] = "/";

 // variable para almacenar las respuesta obtenida
 String response = "";

 // usa un proxy
 boolean use_proxy = false;

 void setup() {
   // inicializa las comunicaciones serie y espera a que se abra el puerto:
   Serial.begin(9600);
   while (!Serial) {
     ; //espera a que el puerto serie se conecte. Necesario para Leonardo solamente
   }
 }

 void loop() {
   use_proxy = false;

   // inicia el escudo GSM
   // si su tarjeta SIM tiene PIN, pasarlo como un parámetro de begin() entre comillas
   Serial.print("Conectando a la red GSM...");
   if (gsmAccess.begin(PINNUMBER) != GSM_READY) {
     Serial.println(errortext);
     while (true);
   }
   Serial.println(oktext);

   // lee el APN introducido por el usuario
   char apn[50];
   Serial.print("Introducir su APN: ");
   readSerial(apn);
   Serial.println(apn);

   // Lee el login introducido por el usuario
   char login[50];
   Serial.print("Ahora, introducir login: ");
   readSerial(login);
   Serial.println(login);

   // le la password introducida por el usuario
   char password[20];
   Serial.print("Finalmente, introducir su password: ");
   readSerial(password);

   // attach GPRS
   Serial.println("Conectando a la red GPRS con du APN...");
   if (gprsAccess.attachGPRS(apn, login, password) != GPRS_READY) {
     Serial.println(errortext);
   } else {

     Serial.println(oktext);

     // lee el proxy introducido por el usuario
     char proxy[100];
     Serial.print("Si su portadora usa un proxy, introducir es, s no pulsar enter: ");
     readSerial(proxy);
     Serial.println(proxy);

     // si el usuario introduce un proxy, le pregunta por el puerto del proxy
     int pport;
     if (proxy[0] != '\0') {
       // lee el puerto proxy introducido por el usuario
       char proxyport[10];
       Serial.print("Introducir el puerto proxy: ");
       readSerial(proxyport);
       // emite el puerto proxy introducido a entero
       pport = (int) proxyport;
       use_proxy = true;
       Serial.println(proxyport);
     }

     // conecta con arduino.cc y realiza una petición HTTP
     Serial.print("Conectando y enviando solicitud GET a arduino.cc...");
     int res_connect;

     // si usa un proxy, conectar con el
     if (use_proxy) {
       res_connect = client.connect(proxy, pport);
     } else {
       res_connect = client.connect(url, 80);
     }

     if (res_connect) {
       // hacer una solicitud GET HTTP 1.0 (el cliente envía la solicitud)
       client.print("OBTENER ");

       // si usa un proxy, la ruta es el URL arduino.cc
       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("Recibiendo respuesta...");

     boolean test = true;
     while (test) {
       // si hay bytes entrantes disponibles
       // desde el servidor, leer y comprobarlos
       if (client.available()) {
         char c = client.read();
         response += c;

         // convierte a respuesta obtenida de cadena a char array
         char responsechar[response.length() + 1];
         response.toCharArray(responsechar, response.length() + 1);

         // si la respuest contiene una subcadena "200 OK"
         if (strstr(responsechar, "200 OK") != NULL) {
           Serial.println(oktext);
           Serial.println("TEST COMPLETO!");
           test = false;
         }
       }

       // si el servidor desconecta, detener el cliente:
       if (!client.connected()) {
         Serial.println();
         Serial.println("Desconectando.");
         client.stop();
         test = false;
       }
     }
   }
 }

 /*
   Leer la entrada serie
  */
 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++;
       }
     }
   }
 }
 



No hay comentarios:

Publicar un comentario