bclose

Conectarse a Internet mediante GPRS

Realizar una conexión HTTP mediante Arduino y el módulo GRPS

Objetivos

 

 

    • Seguir ampliando las funcionalidades del módulo GPRS.
    • Aprender a configurar el GPRS para poder conectarnos a Internet.
    • Realizar una conexión TCP con servidor.
    • Enviar una petición HTTP a un servidor.
 

Material requerido.

 

CONFIGURAR LA CONEXIÓN A INTERNET

 

Si habéis seguido las sesiones que hemos dedicado hasta ahora al GPRS, no vais a tener ningún problema con esta. Y si no las habéis leído, os recomendamos que lo hagáis, porque vamos a pasar muy por encima las cosas que ya hemos explicado y vamos a reutilizar (con algunos cambios) la mayoría de las funciones que ya hemos usado antes. Concretamente vamos a basarnos en el programa que utilizamos en la sesión dedicada a Enviar y recibir llamadas y SMS.

De hecho las funciones que hemos usado para encender, apagar, reiniciar y enviar lo comandos AT y recibir las respuestas vamos a dejarlas tal cual.

int enviarAT(String ATcommand, char* resp_correcta, unsigned int tiempo)
{

  int x = 0;
  bool correcto = 0;
  char respuesta[100];
  unsigned long anterior;

  memset(respuesta, '\0', 100); // Inicializa el string
  delay(100);
  while ( SIM900.available() > 0) SIM900.read(); // Limpia el buffer de entrada
  SIM900.println(ATcommand); // Envia el comando AT
  x = 0;
  anterior = millis();
  // Espera una respuesta
  do {
    // si hay datos el buffer de entrada del UART lee y comprueba la respuesta
    if (SIM900.available() != 0)
    {
        respuesta[x] = SIM900.read();
        x++;
      // Comprueba si la respuesta es correcta
      if (strstr(respuesta, resp_correcta) != NULL)
      {
        correcto = 1;
      }
    }
  }
  // Espera hasta tener una respuesta
  while ((correcto == 0) && ((millis() - anterior) < tiempo));
  Serial.println(respuesta);

  return correcto;
}

void power_on()
{
  int respuesta = 0;

  // Comprueba que el modulo SIM900 esta arrancado
  if (enviarAT("AT", "OK", 2000) == 0)  
  {
    Serial.println("Encendiendo el GPRS...");

    pinMode(9, OUTPUT);
    digitalWrite(9, HIGH);
    delay(1000);
    digitalWrite(9, LOW);
    delay(1000);

    // Espera la respuesta del modulo SIM900
    while (respuesta == 0) {
      // Envia un comando AT cada 2 segundos y espera la respuesta
      respuesta = enviarAT("AT", "OK", 2000);
      SIM900.println(respuesta);
    }
  }
}

void power_off()
{
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(1000);
}

void reiniciar()
{
  Serial.println("Reiniciando...");
  power_off();
  delay (5000);
  power_on();
}

La función void iniciar(); en la que configuramos el módulo GPRS, la vamos a tener que cambiar para enviar los comandos AT que necesitamos para conectarnos correctamente a Internet. Lo primero es que vamos a necesitar conectarnos a la red GPRS.

Aunque no lo hemos dicho claro hasta ahora, os habréis dado cuenta que en cuanto activamos la tarjeta y metemos el PIN correcto el módulo se conecta a la red de forma automática. No hay más que esperar y comprobar que realmente lo haya hecho con el comando AT+CREG?.

Sin embargo para conectarnos a la red GPRS y adjuntarnos al servicio de paquetes que nos posibilite conectarnos a Internet tendremos que utilizar el siguiente comando:

AT+CGATT=1 //Conectamos a la red GPRS

Una vez hecho esto tendremos que buscar en Internet el nombre del punto de acceso o APN, usuario y contraseña de la operadora que estemos usando. Una búsqueda rápida y en Google y lo encontraréis sin problemas.

 
  • Un APN (Access Point Name) es el nombre de un punto de acceso que hay que configurar para que nuestro dispositivo se pueda conectar a Internet usando las redes de nuestra operadora.
 
AT+CSTT="Nombre del Punto de Acceso o APN","usuario","contraseña" // Definimos el APN, usuario y clave a utilizar

Y ahora usaremos un par de comandos para activar la conexión GPRS en función de lo que hemos configurado con el comando AT+CSTT, y obtendremos nuestra dirección IP.

AT+CIICR // Activamos el perfil de datos inalámbrico
AT+CIFSR // Para obtener nuestra direccion IP

Y con esto ya tenemos todos los comandos que usaremos para configurar e iniciar el módulo:

void iniciar()
{
  enviarAT("AT+CPIN=\"1867\"", "OK", 1000); //Introducimos el PIN de la SIM
  Serial.println("Conectando a la red...");
  delay (5000);

  //Espera hasta estar conectado a la red movil
  while ( enviarAT("AT+CREG?", "+CREG: 0,1", 1000) == 0 )
  {
  }

  Serial.println("Conectado a la red.");
  enviarAT("AT+CGATT=1\r", "OK", 1000); //Iniciamos la conexión GPRS
  enviarAT("AT+CSTT=\"ac.vodafone.es\",\"vodafone\",\"vodafone\"", "OK", 3000); //Definimos el APN, usuario y clave a utilizar
  enviarAT("AT+CIICR", "OK", 3000); //Activamos el perfil de datos inalámbrico
  enviarAT("AT+CIFSR", "", 3000); //Activamos el perfil de datos inalámbrico
}
 
  • Hemos quitado los comandos AT que configuraban el módulo para el envío y recepción de llamadas y SMS para simplificarlo; pero podéis integrarlos en esta misma función para juntar todas las funcionalidades.
 

Añadiendo alguna de las funciones de las que hemos comentado que se repetían de la sesión anterior, ya tenemos terminado el setup.

void setup()
{
  SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
  Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
  delay(1000);
  Serial.println("Iniciando...");
  power_on();
  iniciar();
}

 

REALIZAR LA PETICIÓN HTTP

 

Una vez hemos realizado correctamente la configuración, vamos a realizar la petición Http. El proceso va a ser prácticamente el mismo que para mandar que para mandar un SMS. Lo primero cambiaremos la variable en la que teníamos el texto del SMS por la dirección Http a la que queremos conectarnos de esta forma:

#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900. Para el Arduino MEGA utilizar pines 10 y 11

int respuesta;
char aux_str[50];

//Contenido de la dirección Http 
char direccion[] = "GET /prueba-http/ HTTP/1.1\r\nHost: www.prometec.net\r\nConnection: close\r\n\r\n";

En ella indicamos el Host, en este caso www.prometec .net, y la página a la que queremos acceder: /prueba-http/ dentro del Host. Es decir sería lo equivalente a acceder a www.prometec.net/prueba-http/.

 
  • Hemos creado esta página para hacer las pruebas. Simplemente contiene el título “PRUEBA PARA CONEXIONES HTTP” y el mensaje “¡Enhorabuena! Has conseguido realizar una conexión HTTP sin utilizar un navegador. Saludos desde Prometec.”
  • Aunque cuando hagamos la petición veréis que una página web contiene un montón más de cosas, y más si está realizada en WordPress como la nuestra. 
prueba

Vamos a programar una función en la que tras comprobar que estamos conectados a la red, iniciaremos una conexión TCP al Host que elijamos (en este caso www.prometec.nety enviaremos la petición a la dirección que hemos guardado en la variable  char direccion[].

Utlizaremos estos dos comandos AT:

AT+CIPSTART  //indicamos el tipo de conexión (TCP/UDP), la dirección IP y el puerto al que se realiza la conexión.
AT+CIPSEND //preparamos el envío de datos. Cuando esté listo devolverá el código ">" como inductor para el comienzo del envío.

Y la función nos queda de esta forma:

void PeticionHttp()
{
 if (enviarAT("AT+CREG?", "+CREG: 0,1", 1000) == 1) //Comprueba la conexion a la red
 {
 enviarAT("AT+CIPSTART=\"TCP\",\"www.prometec.net\",\"80\"", "CONNECT OK", 5000); //Inicia una conexión TCP
 // Envíamos datos a través del TCP
 sprintf(aux_str, "AT+CIPSEND=%d", strlen(direccion));
 if (enviarAT(aux_str, ">", 10000) == 1)
 {
 enviarAT(direccion, "OK", 10000);
 }
 }
 else
 {
 reiniciar();
 iniciar();
 }
}

Y ya en el loop() vamos a crear una estructura de tipo switch para enviar la petición cuando escribamos “h” en el monitor serie. Además incluiremos la opción ce cerrar la conexión utilizando la tecla “q”:

void loop()
{
 if (Serial.available())
 switch (Serial.read())
 {
 case 'h':
 PeticionHttp();
 break;
 case 'q':
 // Closes the socket
 enviarAT("AT+CIPCLOSE", "CLOSE OK", 10000); //Cerramos la conexion
 enviarAT("AT+CIPSHUT", "OK", 10000); //Cierra el contexto PDP del GPRS
 delay(10000);
 break;
 }
 if (SIM900.available()) {
 Serial.write(SIM900.read());
 }
}

Ya estamos preparados para cargar el sketch en nuestro Arduino, y si está todo correcto deberíamos ver cómo se va configurando en el monitor serie:

monitor serie internet gprs

Si ahora escribimos “h” en el monitor serie y pulsamos “Intro”, veremos cómo empiezan a llegar un montón de datos. La gran mayoría de ellos no nos interesan y corresponden a la programación de la página, que además, al ser de tipo WordPress tiene un montón de cosas. Pero si os fijáis veréis como tenemos lo que nos interesaba, y de esta forma podemos verificar que la conexión ha ido bien.

resultado http grps arduino

Aquí os dejamos el programa completo para que lo podáis descargar: gprs_internet.

 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
    • A configurar el módulo GPRS para conectarse a Internet.
    • Hemos realizado una conexión TCP con un servidor.
    • A enviar una petición Http.
    • Hemos realizado una conexión Http sin utilizar un navegador, utilizando nuestro Arduino.
    • Podemos utilizar nuestro Arduino para conectarnos a Internet desde cualquier lugar en el que tengamos cobertura de red móvil
 
 
 

LikeUsOnFacebook_Icon

 

(69) Comments

  • muy bueno el foro… estoy aquí por que no logro enviar la imagen que captura el modulo A6C la Web… ya cree mi servidor así como también realice todos los paso que realizan en los tutoriales que por cierto son similares y poco… no logro enviar la imagen al web. El modulo me responde +CAMPOST:0… … orienten me por favor..

    • Lo siento pero no hemos trabajado con ese módulo, a ver si alguien puede echarte una mano. Un saludo.

  • Hola Ivan, me compre una placa arduino bastante completa. Viene con un puerto serial RS232, el manual de operación dice que no conecte un dispositivo TTL por que se puede dañar. Mi pregunta es, la placa sim900 usa TTL?. De no ser así, que comunicación utiliza?. Saludos y gracias por todo el contenido.

    • Juan

    Funciona para la el modulo SIM808?

    • No lo he probado pero debería de funcionar igual.

    • Ernesto Martinez

    Hola que excelente que ademas del producto hagan este tipo de post, una duda de las 2 formas ya sea en GSM y en GPRS necesito estar ingresando saldo al chip para realizar el envió de datos cierto? ¿o en GPRS no es necesario? gracias.

    • Hola Ernesto, es necesario disponer de saldo, igual que en un teléfono normal. Un saludo.

    • Sergio

    Saludos
    Estoy tratando de conectarme a internet, pero en el monitor me sale esto

    Iniciando…
    AT
    OK
    Conectando a la red…
    AT+CREG?

    +CREG: 0,1
    Conectado a la red.
    AT+CGATT=1

    OK
    AT+CSTT=”internet.digitel.ve”

    ERROR

    AT+CIICR

    ERROR

    A
    T+CIFSR

    10.55.254.114

    Alguna idea?

    • Hola Sergio, lo primero que yo haría sería cerciorarme de que la tarjeta SIM tiene activada la conexión a internet metiéndola en un móvil o hablando con tu operadora.

    • Javier

    Hola a todos

    Tengo dos problemas con el código que se proporciona en la página.

    El primero ya está solucionado y ha consistido en sustituir

    enviarAT(“AT+CPIN=\”1867\””, “OK”, 1000); //Introducimos el PIN de la SIM

    por la siguiente línea:

    SIM900.println(“AT+CPIN=\”1867\””); //Comando AT para introducir el PIN de la tarjeta; //Introducimos el PIN de la SIM

    donde en 1867 se pone el PIN de nuestra SIM. He pasado de obtener la respuesta “ERROR” a la respuesta “OK”.

    El segundo no se ha solucionado. En el bucle que viene a continuación obtengo constantemente:

    AT+CREG?
    +CREG: 0,0
    OK

    ¿Alguien tiene una pista de lo que puede estar pasando?

    Un saludo.

    AT

    • En principio significa que no encuentra la red. Has probado la sim en un teléfono a ver si funciona?

    • Nagerai

    Me funciona genial, y la comunicación es más rápida de lo que esperaba. Solo un problema. En lugar de apuntar a vuestra Web, he apuntado a un servidor propio, el cual me envía en la contestación una serie de parámetros, para realizar distintas funciones con Arduino. Cuando recibo la contestación del servidor, no estoy siendo capaz de buscar una cadena de caracteres determinada. He probado a pasar el char “respuesta” a un String y buscar con respuestaServidor.indexOf(“cadena que busco”) y con (strstr(respuesta, “Cadena que busco”) != NULL) directamente sobre el char “respuesta”
    ¿Me puedes ayudar? Graias

    • Hola, no lo he probado nunca con los servidores, lo he hecho con SMS y me ha funcionado bien con el indexOf. Si se te guarda bien el String, debería funcionar. Puedes comprobar que se te esté guardando correctamente?

  • Ayuda por favor, sigo intentando la conexión a internet pero no lo logro.
    Tras agregar algunos comandos AT mas de lo que lei en la red, esto sale en el monitor
    Iniciando…
    AT

    OK
    AT+CPIN=”1301″

    ERROR

    Conectando a la red…
    AT+CREG?

    +CREG: 0,1
    Conectado a la red.
    AT+CGATT=1

    OK
    AT+CIPCLOSE

    ERROR

    AT+CIPSHUT

    SHUT OK
    AT+CGDCONT=1,”IP”,”broadband.tigo.gt”

    OK
    AT+CSTT=”broadband.tigo.gt”,””,””

    OK
    AT+CIICR

    +PDP: DEACT

    ERROR

    A
    T+CIFSR

    ERROR

    El codigo que agregue se ve asi:
    void iniciar()
    {
    enviarAT(“AT+CPIN=\”1301\””, “OK”, 1000); //Introducimos el PIN de la SIM
    Serial.println(“Conectando a la red…”);
    delay (5000);

    //Espera hasta estar conectado a la red movil
    while ( enviarAT(“AT+CREG?”, “+CREG: 0,1”, 1000) == 0 )
    {
    }

    Serial.println(“Conectado a la red.”);
    enviarAT(“AT+CGATT=1\r”, “OK”, 1000); //Iniciamos la conexión GPRS

    enviarAT(“AT+CIPCLOSE”, “CLOSE OK”, 10000); //agregado
    enviarAT(“AT+CIPSHUT”, “OK”, 1000);// agregado
    enviarAT(“AT+CGDCONT=1,\”IP\”,\”broadband.tigo.gt\””, “OK”, 3000);//agregado

    enviarAT(“AT+CSTT=\”broadband.tigo.gt\”,\”\”,\”\””, “OK”, 1000); //Definimos el APN, usuario y clave a utilizar
    enviarAT(“AT+CIICR”, “OK”, 10000); //Activamos el perfil de datos inalámbrico
    enviarAT(“AT+CIFSR”, “”, 1000); //Activamos el perfil de datos inalámbrico
    }

    anter de agregar las lineas la el AT+CSTT salie como error, ahora sale OK,

    Que podria hacer?

  • Hola, gracias por el aporte. Aunque he logrado hacer funcionar los anteriores ejercicios, este simplemente no lo logro.
    En el monitor serial aparece esto:

    Iniciando…
    AT

    OK
    AT+CPIN=”1301″

    ERROR

    Conectando a la red…
    AT+CREG?

    +CREG: 0,1
    Conectado a la red.
    AT+CGATT=1

    OK
    AT+CSTT=”broadband.tigo.gt”,””,””

    ERROR

    AT+CIICR

    ERROR

    A
    T+CIFSR

    ERROR

    Estoy seguro del PIN, dado que al enviar recibir llamadas y mensajes ha funcionado bien. Estoy seguro del APN, pues he probado el sim en un celular todo bien con el acceso a internet.

    Agradecería mucho su ayuda.

    • Hola Hugo, puede ser que te de error en el pin si ya lo tenías metido y no has apagado el módulo. Por lo demás, estás seguro que la SIM tiene activada la conexión a internet?

      • Gracias por tu respuesta Ivan.
        Primero el pin lo meti en el codigo para mandar y recibir sms, al momento ese programa sigue funcionando.
        Segundo la SIM si tiene activada la conexión a Internet, la saque y la meti a un telefono y si hay conexion a internet. Verifique el APN, usuario y password y todo parece estar bien.

        Después de varias pruebas podras notar que sale un nuevo error +PDP: DEACT, leyendo un poco encontre qu este se debe a conexiones abiertas, pero cuando intendo cerrar la conexion con AT+CIPCLOSE de nuevo me da error.

        Agradecere mucho tus comentarios

    • Jorge

    Hola! Gracias por tus tutoriales he aprendido bastante a través de ellos.
    Tengo un problema al conectar con tu servidor, me muestra lo siguiente:

    HTTP/1.1 301 Moved Permanently
    Date: Thu, 08 Mar 2018 23:24:53 GMT
    Server: Apache
    X-Powered-By: PHP/5.6.34
    Access-Control-Allow-Origin: *
    Set-Cookie: PHPSESSID=oqkoij0qgho2coicvfv5shb3i1; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Location: https://www.prometec.net/prueba-http/
    Vary: Accept-Encoding
    Content-Length: 0
    Connection: close
    Content-Type: text/html; charset=UTF-8

    Según lo que encontré en Internet, la primera línea indica que el servidor existe pero el contenido que estoy solicitando fue movido a otra parte, pero al entrar a la dirección con mi navegador me muestra la página sin problemas, por lo que sé que el contenido que quiero ver aún está ahí.
    ¿Qué puede estar ocurriendo?

    Saludos!

    • La verdad es que no se muy bien qué decirte, porque nunca he tenido ese error. A ver si puedo probarlo estos días por si algo ha cambiado y no funciona… Prueba por si acaso a hacerlo a cualquier página, como http://www.google.es a ver.

      • Rafael

      Hola Jorge Pudiste arreglar ese problema? a mi me sale lo mismo. Gracias!

      • Hola Rafael, lo poco que he podido probar parece que el problema es que hemos movido nuestra página a https y elste módulo no soporta conexión segura.

    • Omar

    Ademas de cambiar los pines 2 y 8 por los pines 10 y 11 que mas se le debe cambiar al programa para que funcione con un arduino mega ?

    • En principio eso es todo. Un saludo.

Give a Reply

WordPress Anti-Spam by WP-SpamShield