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.

Imagen de Arduino UNOArduino UNO o equivalente
modulo gprsUn Shield GPRS SIM900
conexionesAlgunos cables de protoboard.
Power supply

 Una fuente de alimentación para Arduino.

 

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

 

(23) Comments

  • Hola, tengo una duda con respecto a la PIN y con el APN, cuando lo corrí el programa al principio me tomaba bien el PIN pero no el APN, si mi APN no lleva usuario ni contraseña como pondría la cadena de caracteres? y la otra pregunta, si es cierto que con 3 veces que ponga mal el pin (que no lo he hecho) como puedo ponerle el puk para que me vuelva a recibir el pin. Saludos y gracias de ante manos

    • Hola Juan, por lo que leo aunque no me queda muy claro el puk se mete con el mismo comando que el pin, pero tienes además que añadir un nuevo pin a la tarjeta. Esto pone más o menos: AT+CPIN=, Si el password que se requiere es el PUK se requiere también el segundo pin para reemplazar el pin anterior de la tarjeta.

      Si tu apn no lleva usuario ni contraseña supongo que bastará con pasarle Strings vacíos “”, pero no puedo probarlo porque mi SIM si me los pide.

      Un saludo.

  • Hola Ivan, primero de todo gracias por tu enfasis en responder a todas las preguntas.
    Hace un mes hice una pregunta acerca de como cambiar los datos para entrar a cualquier otra página y me respondiste que tu conseguiste hacerlo con google.
    Bueno resulta que yo no pude y creo que es básicamente porque Arduino no puede enviar peticiones a páginas con https, tan solo a paginas http como prometec y muchas otras en las que google no es una de ellas.
    Como conseguiste que te funcionase? Luego yo quiero enviar datos a un servidor, heroku exactamente, pero ellos también usan https. Alguna solución si realmente no se puede hacer con https??
    Muchas gracias.

    • Jorge Salazar Alcaraz

    Buen día. Actualmente me asignaron un proyecto y estoy vuelto loco con ésto del FONA Adafruit. ¿No sé si existirá o tendrán algún tutorial para realizar un código básico para Arduino conectado un FONA SIM800H para realizar un método HTTP GET y, aparte, un método HTTP POST en un servidor básico? Agradecería bastante que me pudieran apoyar con esta información.

    • Hola Jorge, nunca he usado ese módulo, pero tiene el mismo chip que el módulo GSM/GPRS con GPS que hemos utilizado y parece que se maneja igual que el SIM900. EL código debería valerte para hacer la petición http. ¿Quéproblemas estás teniendo?

  • Una pregunta.

    Los comandos AT son para cualquier operadora? Tiene algun tipo de restriccion por pais?

    Saludos

    • Hola Ricardo, los comandos AT sirven para comunicar el Arduino con el módulo GPRS, y son los mismos para cualquier operadora. Un saludo.

  • Hola! todo muy bien, pero si en vez de entrar a prometec.net/prueba-http/ quisiéramos entrar en alguna otra pagina por ejemplo esta,
    https://www.google.es/?gfe_rd=cr&ei=P8MmVKa7IsWA8QedoYGwBg&gws_rd=ssl#q=fvnerfvjernvjoefv&*
    de Google, que debería cambiar, he probado lo lógico pero no lo he conseguido, supongo que el problema está aquí

    char direccion[] = “GET /prueba-http/ HTTP/1.1\r\nHost: http://www.prometec.net\r\nConnection: close\r\n\r\n”;
    ¿Como escribimos la dirección exactamente?

    enviarAT(“AT+CIPSTART=\”TCP\”,\”www.prometec.net\”,\”80\””, “CONNECT OK”, 5000); //Inicia una conexión TCP
    En esta me imagino que cambiando la url por http://www.google.es ya estaría bien no?
    Bueno, muchas gracias por todo, hacéis unos tutoriales muy buenos, espero el de recoger datos de un sensor con ganas!
    Un saludo

    • Hola Vince, no tendría más que sustituir

      enviarAT(“AT+CIPSTART=\”TCP\”,\”www.prometec.net\”,\”80\””, “CONNECT OK”, 5000); //Inicia una conexión TCP

      por

      enviarAT(“AT+CIPSTART=\”TCP\”,\”www.google.es\”,\”80\””, “CONNECT OK”, 5000); //Inicia una conexión TCP

      Y en la petición http poner la dirección a la que quieres hacerla, terminado siempre en /, o sea:

      char direccion[] = “GET /search?q=fvnerfvjernvjoefv&*&cad=h/ HTTP/1.1\r\nHost: http://www.google.es\r\nConnection: close\r\n\r\n”;

      Yo lo he probado y me ha funcionado perfectamente. Un saludo.

  • Hola, he conseguido hacer lo que se consigue con esta serie de tutoriales, he conseguido enviar desde mi arduino mediante una placa GPRS y comandos AT enviar datos recogidos de unos sensonres y enviarlos a una base de datos en mi ordenador instalando un servidor en él. La duda que tengo ahora, es como enviar desde mi servidor informacion al arduino, ya que quisiera cambiar parámetros en el arduino como el tiempo que hay entre cada medida o activar un motor desde una pagina web , enviando una peticion http al arduino, pero no se que comando AT existen o si tengo que utilizar otra cosa.

    Gracias!

    Otra duda, he conseguido sincronizar la hora del sistema mediante el comando AT :AT+CNP, y lo muestro por pantalla con AT+CCLK?, pero no se como almacenar el valor que me da AT+CCLK? para despues con la libreria Time.h poner en hora mi arduino y despues sacar el tiempo en el que cada sensor toma la muestra para así poder hacer un seguimiento en el tiempo de como varía.

    • Hola Deuxto, es un proyecto de lo más interesante y precisamente pensábamos publicar algo al respecto porque es muy útil. La verdad que no puedo contestarte así a la ligera, pero intentaremos publicar una sesión tratando ese tema lo antes que podamos. Un saludo.

    • Hola Deuxto, en el proyecto que estoy realizando necesito mandar datos a un servidor web. ¿Podrías mostrarnos cómo lo has conseguido? Y si lo has hecho con la placa GPRS que proponen en esta página. Un saludo

      • Hola Jorge, intentaremos subir un tutorial tratando ese tema las próximas semanas. Un saludo.

    • Hola Deuxto, me interesa el tema de enviar desde mi arduino los datos recogidos por los sensores a un servidor, ya que lo necesito para mi proyecto, debo de almacenar datos de temperatura y humedad entre otros. Podrias mostrar como lo has conseguido?

      Un saludo.

    • Héctor

    Hola, mi problema es el siguiente, necesito enviar los datos que recojo mediante unos sensores (humedad, temperatura, etc) a un servidor para después recogerlos y mostrarlos bien en una pagina web o en una app. Como lo podría hacer?
    Gracias de antemano y un saludo.

    • Hola hector, Puedes enviar los datos de tu modulo como un mensaje TCPIP al servidor web a traves del modulo GSM, pero aun no hemos hecho este tutoria

    • Maxi

    necesito enviar y recibir datos entre dos modulos sim900 mediante gprs, como puedo hacerlo?
    Muchas gracias

    • Puedes hacerlo mediante SMS, si quieres hacerlo por internet, supongo que tendrías que crear un servidor y coger y mandar os datos allí. Un saludo.

  • Buenas, muchas gracias por el tutorial pero tengo un problema que no consigo resolver, mi tarjeta sim no tiene pin entonces pruebo a poner 0000 y me da error de pin, incluso lo pongo en blanco y me sigue dando error en el pin, alguna duda de que pin poner o que codigo para que me conecte automatico? me estoy volviendo loco y no se que hacer gracias.

    • Hola Juancho, pues en teoría sólo tendrías que prescindir de la instrucción en la que metemos el PIN. Un saludo.

  • Excelente amigo he seguido desde el indice GSM/GPRS y me ha salido perfecto, tengo una pregunta existe alguna posibilidad de usar el modulo GPRS como sistema GPS ?

    • Hola Sebas, por lo que yo sé no con este, pero hay módulos que integran ambos sistemas. Estamos pendientes de publicar algo al respecto. Un saludo.

      • otra pregunta se puede alimentarlo con 12v?

Give a Reply

WordPress Anti-Spam by WP-SpamShield

¡Oferta!

Promoción especial de abril.

Tu robot educativo por

49,95

Ir al producto