Consulta a un servidor

En este ejemplo, va a utilizar su  Escudo WiFi 101 con la placa Arduino o Genuino Zero, o una placa MKR1000, para consultar un servidor Network Time Protocol (NTP). De este modo, la placa puede obtener el tiempo a través de Internet.

Hardware necesario

Escudo Wifi101 Arduino
Placa Arduino o Genuino Zero
o
Placa MKR1000

Circuito

El pin digital 7 se utiliza como un pin de diálogo entre el escudo WiFi  101 y la placa, y no debe ser utilizado.

Usted debe tener acceso a una red inalámbrica 802.11b/g que se conecte a internet para este ejemplo. Tendrá que cambiar la configuración de red en el programa para que se corresponda con su red SSID particular.



En la imagen superior, la placa Arduino o Genuino Zero se apilan debajo del escudo WiFi.



Código

// Cliente UDP NTP 

// Obtiene la hora de un servidor de tiempo de Network Time Protocol  (NTP) 
// Demuestra uso de UDP sendPacket y ReceivePacket 
// Para más información sobre los servidores de tiempo NTP y // los mensajes que se necesita para comunicarse con ellos, ver // http://en.wikipedia.org/wiki/Network_Time_Protocol 

// Creado el 4 de Septiembre de 2010 por Michael Margolis 
// modificado el 9 de Abril de 2012 por Tom Igoe 

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

#include <SPI.h>
#include <WiFi101.h>
#include <WiFiUdp.h>

int status = WL_IDLE_STATUS;
char ssid[] = "mynetwork";  //  su red SSID (nombre)
char pass[] = "mypassword";       // su password de red
int keyIndex = 0;            // su numero índice clave de red  (sólo se precisa para WEP)

unsigned int localPort = 2390;      // puerto local para escuchar los paquetes UDP

IPAddress timeServer(129, 6, 15, 28); // time.nist.gov servidor NTP 

const int NTP_PACKET_SIZE = 48; // la indicación de la hora esta en los primeros 48 bytes del mensaje NTP 

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer para mantener los paquetes entrantes y salientes

//Una instancia UDP para no retrasar el envío y recepción de paquetes a través de UDP
WiFiUDP Udp;

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

  // comprobar la presencia del escudo:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("Escudo WiFi no presente");
    // no continua:
    while (true);
  }

  // intenta conectar a la red Wifi:
  while ( status != WL_CONNECTED) {
    Serial.print("Intentado conectar con SSID: ");
    Serial.println(ssid);
    // Conectarse a la red WPA / WPA2. Cambie esta línea si se utiliza una red abierta o WEP:
    status = WiFi.begin(ssid, pass);

    // espera 10 segundos para la conexion:
    delay(10000);
  }

  Serial.println("Conectado a wifi");
  printWifiStatus();

  Serial.println("\nIniciando conexión con el servidor...");
  Udp.begin(localPort);
}

void loop()
{
  sendNTPpacket(timeServer); // enviar un paquete a un servidor de tiempo NTP
  // esperar a ver si está disponible una respuesta
  delay(1000);
  if ( Udp.parsePacket() ) {
    Serial.println("Paquete recibido");
    // Hemos recibido un paquete, leer los datos de el
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // leer el paquete en el buffer

    // La marca de tiempo comienza en el byte 40 del paquete recibido y es de cuatro bytes,
    // o dos palabras, long. En primer lugar, extraer las dos palabras:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // Combinar los cuatro bytes (dos palabras) en un entero largo 
    // Esto es la hora NTP (segundos desde el 1 de Enero de 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Segundos desde el 1 de de 1900 = " );
    Serial.println(secsSince1900);

    // Ahora convertir el tiempo NTP en días:
    Serial.print("Unix time = ");
    // El tiempo Unix comienza el 1 de Enero de 1970. En  segundos, eso es 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // restar setenta años:
    unsigned long epoch = secsSince1900 - seventyYears;
    //imprimir el tiempo Unix:
    Serial.println(epoch);


    // imprimir la hora, minutos y segundos:
    Serial.print("El tiempo UTC es ");       // UTC es el tiempo Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // imprimir la hora (igual a 86400 segundos por dia)
    Serial.print(':');
    if ( ((epoch % 3600) / 60) < 10 ) {
      // En los primeros 10 minutos de cada hora, vamos a querer un '0' a la izquierda
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // imprimir el minuto (igual 3600 segundos por minuto)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // En los primeros 10 segundos de cada minuto, vamos a querer un '0' a la izquierda
      Serial.print('0');
    }
    Serial.println(epoch % 60); // imprimir el segundo
  }
  // espera diez segundos antes de pedir de nuevo la hora
  delay(10000);
}

// enviar una solicitud al servidor NTP tiempo en la dirección dada
unsigned long sendNTPpacket(IPAddress& address)
{
  //Serial.println("1");
  // establecer todos los bytes en la memoria intermedia a 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Inicializar los valores necesarios para formar una solicitud NTP 
  // (Ver dirección de arriba para obtener más información sobre los paquetes)
  //Serial.println("2");
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, o tipo de reloj
  packetBuffer[2] = 6;     // intervalo de sondeo
  packetBuffer[3] = 0xEC;  // Mirar reloj de precisión
  // 8 bytes de cero para Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  //Serial.println("3");

  // A todos los campos NTP se han dado valores, ahora 
  // puede enviar un paquete que pide una marca de tiempo:
  Udp.beginPacket(address, 123); // la ssolicitudes NTP ppor el puerto 123
  //Serial.println("4");
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  //Serial.println("5");
  Udp.endPacket();
  //Serial.println("6");
}


void printWifiStatus() {
  // imprimir el SSID de la red a la que está conectado:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // imprimir la dirección IP del escudo WiFi:
  IPAddress ip = WiFi.localIP();
  Serial.print("Dirección IP: ");
  Serial.println(ip);

  // imprimir la potencia de la señal:
  long rssi = WiFi.RSSI();
  Serial.print("Potencia de la señal (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}





No hay comentarios:

Publicar un comentario