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.

[product id=”4998″][product id=”13485″]
[product id=”8646″][product id=”11728″]

 

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, '
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();
}
', 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

 

(103) Comments

    • Jean Angulo

    Hola gracias por el tutorial, tengo algunas preguntas:Por qué en el comando enviarAT(“AT+CGATT=1\r”, “OK”, 1000) se le añade al final un \r? En el resto de comandos AT no lo tiene, habría alguna diferencia si lo omito?

    Por otro lado, la funcion enviarAT cuando no responde lo que se espera retorna ERROR y un 0 ?
    Gracias

      • Ivan Uriarte

      Hola Jean, la verdad es que no me acuerdo ya pero es un retorno de carro que supongo que hay que enviarlo. De todas formas prueba a quitarlo y si funciona pues estupendo. LA función AT espera una respuesta, que puede ser ERROR o nada, si por ejemplo mandas un comando AT que no reconoce.

    • Mitch

    Hola, he seguido este tuto y lo estoy montando con una sim claro, pero no me da red móvil, he probado desde un teléfono y no es problema de la sim, algo que pueda hacer para solucionar el problema?

      • Ivan Uriarte

      Cómo lo estás alimentando? Asegúrate de que sea una fuente de al menor 1A por el Barrel jack.

      • Si, lo estoy alimentando directo al módulo y con el multimetro y me da 1A, cambié algunas cosas en pro de que se conectara, y de hecho el módulo se conecta de acuerdo al parpadeo del led, pero en el monitor me sigue dejando sin acceso.

        enviarAT(“AT+CGATT=1\r”, “OK”, 1000); //Iniciamos la conexión GPRS
        enviarAT(“AT+CSTT=\”internet.comcel.com.co\”,\”\”,\”\””, “OK”, 3000); //Definimos el APN, usuario y clave a utilizar
        enviarAT(“ATD*99#”, “OK”, 1000);
        enviarAT(“AT+CIPSTART=\”TCP\”,\”www.google.com.co\”,\”80\””, “CONNECT OK”, 5000); //Inicia una conexión TCP

        enviarAT(“AT+CIICR”, “OK”, 3000); //Activamos el perfil de datos inalámbrico
        enviarAT(“AT+CIFSR”, “”, 3000); //Activamos el perfil de datos inalámbrico

    • Miguel

    Buenas,
    Tengo un SIM800l 2.0 y quería ver si también funciona para este módulo.
    Me funcionan todos los camandos pero cuando mando el comando AT+CREG? me devuelve:
    AT+CREG?
    +CREG: 0,2
    OK

    He probado la sim en un móvil y me funciona, coge cobertura y me manda mensajes.
    ¿Saben como tengo que conectar el cable del reset del SIM800L? Si lo conecto al reset del arduino, a un pin especifico o lo dejo al aire

    • Jefferson

    Hola puedo enviar una variable que está leyendo voltaje dc y me envíe dicho valor al celular ?

      • Ivan Uriarte

      Sí,, no habría problema. Lo más sencillo sería hacerlo con un SMS.

    • ELIEZER

    Hola
    Esta excelente este tutorial.

    Muchas gracias y felicidades.

    Tengo una situación, me aparece esto al momento de entregarme el resultado de la página:

    12/05/2019 20:26:42.68 [TX] – AT+CIPSEND=73

    12/05/2019 20:26:42.71 [RX] –
    >
    12/05/2019 20:26:43.46 [TX] – GET /prueba-http/ HTTP/1.1

    12/05/2019 20:26:44.27 [TX] – Host: https://www.prometec.net

    12/05/2019 20:26:44.88 [TX] – Connection: close

    12/05/2019 20:26:59.47 [RX] –
    SEND OK
    HTTP/1.1 301 Moved Permanently
    Date: Mon, 13 May 2019 01:26:51 GMT
    Server: Apache
    X-Powered-By: PHP/5.6.40
    Access-Control-Allow-Origin: *
    Set-Cookie: PHPSESSID=ocn6ht0ggd6blqbutgjr3ejdf3; 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/
    Content-Length: 0
    Connection: close
    Content-Type: text/html; charset=UTF-8

    CLOSED

    Pero ya no me aparece lo restante como en tu imagen.

    Sabrás por que es eso?

    Excelente día.

    Saludos

      • Ivan Uriarte

      Es porque ahora hemos cambiado prometec a https y parece que este módulo tiene problemas con eso. Prueba con alguna URL que no sea https a ver si te funciona bien.

    • Byron

    Hola, es posible hacer que un celular se conecte a internet utilizando la sim900 como si la sim900 funcionara como modem?

      • Ivan Uriarte

      Hasta donde yo sé, no es posible.

Give a Reply

WordPress Anti-Spam by WP-SpamShield