Servidor NTP inalambrico y sin conexion a internet con ESP8266

Error message

  • Notice: Undefined index: taxonomy_term in similarterms_taxonomy_node_get_terms() (line 518 of /home/venydivi/public_html/automatizanos/sites/all/modules/similarterms/similarterms.module).
  • Notice: Undefined offset: 0 in similarterms_list() (line 221 of /home/venydivi/public_html/automatizanos/sites/all/modules/similarterms/similarterms.module).
  • Notice: Undefined offset: 1 in similarterms_list() (line 222 of /home/venydivi/public_html/automatizanos/sites/all/modules/similarterms/similarterms.module).
administrador's picture
Servidor NTP inalambrico basado en GPS y ESP8266

DISPOSITIVOS CONECTADOS A INTERNET Y SINCRONIZACION DE TIEMPO

Muchos dispositivos, que en general tienen acceso a internet hacen uso del protocolo NTP para sincronizar los relojes internos cada cierto tiempo. Los computadores personales (PC) son el caso mas comun. Si bien estos tienen un reloj interno (RTC) generalmente estos relojes se desfasan uno o mas segundos al dia, por lo cual cabo de unos cuantos dias este desface se puede acumular hasta llegar al orden de los minutos y las horas.

* This article is also available in English clicking here

Con la popularidad del internet casi omnipresente, muchos dispositivos del Internet De las Cosas (IdC), para abaratar costos de fabricacion, no poseen ningun tipo de RTC, por lo que cada vez que requieren ejecutar algun proceso que involucre estampa de tiempo, recurren a tomar el tiempo de un servidor de tiempo NTP.

Que sucede si en algun momento se pierde la conexion a internet y cientos de dispositivos requieren una estampa de tiempo para realizar algun proceso?

Como se podrian sincronizar cientos de dispositivos conectados inalambricamente entre si, pero que no cuentan con algun tipo de conexion a internet, por ejemplo sensores en un bosque apartado lejos de cualquier señal de internet o celular?

Como se podrian sincronizar dispostivos industriales en fabricas, donde por seguridad y/o paranoia estos se encuentran conectados entre si, pero desconectados fisicamente del internet?

SERVIDOR NTP INALAMBRICO Y SIN REQUERIR CONEXION A INTERNET

Si se requiere una fuente de tiempo confiable, que no requiera conexion a internet, existen varias posibilidades: Receptor de señales de radio de tiempo , reloj atomico, gps entre otros.

Los receptores de señal horaria son una opcion economica, pero su utilizacion depende de la relativa cercania a una emisora de este tipo. Ademas existen diferentes frecuencias dependiendo de la zona o el pais donde se encuentre, por lo que no es una alternativa universal para cualquier sitio.

Los relojes atomicos son probablemente la mejor opcion cuando se requiere un alto grado de precision. Inicialmente eran grandes aparatos, poco portatiles y con gran consumo de energia. Sinembargo con el pasar del tiempo ya es posible conseguir relojes atomicos del tamaño de un circuitos integrados y que consumen unos cuantos milivatios. Si el precio no es un factor determinante (precios alrededor de los miles de dolares), esta seria la opcion usar!.

El sistema de posicionamiento global GPS o sistemas equivalentes en otras naciones (GLONASS, GALILEO, BAIDU) son una opcion intermedia que proporcionan una mayor flexibilidad de uso con respecto a las señales de tiempo de radio (claro, hay que tener algo de vista despejada al cielo ) y a unos precios mucho mas bajos que un reloj atomico.

En caso de requerirse un alto grado de robustez, por ejemplo si se tiene en mente construir un reactor nuclear casero,o se desean conectar una enorme cantidad de dispositivos que estaran haciendo miles de consultas de tiempo cada segundo, existen soluciones listas en el mercado para este tipo. Por el contrario si se desea algo mas simple para fines de experimentacion, que puedan soportar desfases de tiempo del orden de 1 segundo, es posible construir uno por menos de $10 USD usando un ESP8266-01 y un modulo GPS, tambien se podria utilizar un GPS de mano que tenga salida serial NMEA.

PROTOCOLOS DE FECHA Y HORA: DAYTIME, TIME Y NTP

Desde que las primeros computadores practicos empezaron a operar, se ha tenido la inquietud de poder sincronizarlos la hora de la forma mas precisa en cada uno de ellos. Existen varios protocolos para ello, unos de los mas conocidos son: daytime, time y NTP.

Protocolo daytime:

Este protocolo esta descrito en el RFC 867. Es uno de los mas antiguos y practicamente ya no es usado. Algunos servidores aun proporcionan este servicio para fines educativos y como posible alternativa a aplicaciones muy viejas de hardware y/o software que todavia puedan usarlo. Este protocolo funciona mediante el puerto 13 y la informacion de fecha y hora es enviada en texto claro. No hay una recomendacion especifica sobre el formato del texto, lo unico que se exige es que pueda ser leido y entendido por humanos.

Protocolo time:

Este protocolo esta descrito en el RFC 868. Funciona mediante el puerto 37 y envia la informacion de fecha y hora, codificada en segundos transcurridos desde las 00:00:00 (medianoche) del primero de Enero de 1970 en un numero de 32 bits.

Protocolo NTP:

El protocolo NTP fue pensado para proveer informacion de tiempo, esta descrito en el RFC 5905 y cuenta con una precision del orden de milisegundos, para ello usa una version modificada del algoritmo de Marzullo que entre otras cosas tiene en cuenta el tiempo del paquete de datos de ida y de regreso. Este protocolo es ampliamente usado en la actualidad, hace uso del puerto 123 e implementa conexiones tipo UDP para minimizar el tiempo tanto de envio como de recepcion de paquetes.

Tramas de datos de protocolos daytime y NTP entregadas por el servidor ESP8266

ESP8266 + GPS

Este proyecto inicio como una mejora al Tardis Time de Ray Burnette que tiene basicamente los mismos componentes de hardware, pero no transmite la informacion del tiempo en protocolos estandar, teniendo que desarrollarse alguna pequeña aplicacion especifica en cada dispositivo a sincronizar. Este proyecto hace uso de los demonios y aplicaciones que y vienen incorporados en computadores portatiles, raspberry pi, e incluso usarse con las librerias para obtener tiempo que poseen los modulos ESP8266.

El GPS usado fue un EM-506 el cual no posee señal PPS. Tambien es posible utilizar un GPS de mano que tenga una salida NMEA RS232. La programacion se realizo mediante el SDK para el ESP8266 en su version 1.5.2. Hay que recordar que programar el ESP8266-01 se requiere algun tipo de interfaz USB-TTL. El programa se puede ver como 3 grandes partes

RECEPCION DE DATOS SERIAL

El ESP8266 cuenta con una FIFO en hardware para la UART de un tamaño maximo de 256 caracteres, ademas de multiples tipos de interrupcion. Se utilizo la interrupcion de cantidad de caracteres recibidos y la interrupcion de timeot.

La interrupcion de numero de caracteres recibidos, se utiliza para disparar automaticamente una rutina de interrupcion cuando han llegado un determinado numero de caracteres al FIFO de la UART. En este caso como se esperan cadenas NMEA procedentes del GPS, y las cadenas pueden tener longitudes entre 30 y 80 caracteres, se programo un numero en este rango como umbral para disparar la funcion que se encargara de sacar los datos de la FIFO de la UART.

La interrupcion de timeout se utiliza cuando se reciben unos pocos caracteres ( menor al umbral anteriormente descrito ) y no se reciban mas dentro de un intervalo de tiempo programable. En este caso particular se programo un timeout equivalente a diez veces el tiempo de byte.

Estas dos funciones por estar ejecutadas mediante interrupciones, se requiere que retornen lo mas rapido posible, asi que su labor, es simplemente tomar los caracteres que hay en la FIFO de la UART y copiarlos a un buffer circular, sin ejecutar ninguna tarea de procesamiento y poder retornar con rapidez.

PROCESAMIENTO DE CADENA, FECHA ACTUAL y CORRECCION DE MICROSEGUNDOS

Las rutinas de interrupcion del serial escriben los caracteres recibidos en un buffer circular, cuya longitud es el doble del tamaño de la cadena que se requiere analizar. En este caso es la cadena NMEA que empieza con el identificador $GPRMC. Dicha cadena es la que contiene el dato de la fecha/hora. La funcion de procesamiento es llamada por las rutinas de interrupcion una vez que los datos esten escritos en el buffer circular mediante el mecanismo de mensajes provisto por el SDK system_os_post.

Las cadenas NMEA pueden tener longitud variable, por lo que no se deben usar posiciones absolutas de caracteres para extraer los valores. El numero de separadores, en este caso las comas "," son invariables y son usadas para extraer los parametros de fecha y hora. Un ejemplo de esto es el siguiente:

$GPRMC,201705.000,A,0000.0000,N,00000.0000,W,1.10,265.50,120816,,,A*79

Entre los separadores coma "," #1 y #2 se encuentra el numero 201705.000 que corresponde a 20 horas, 17 minutos, 05.000 segundos. Entre los separadores coma "," #9 y #10 se encuentra el numero 120816 que corresponde al dia 12 mes 08 (Agosto) y año 16 (2016).

Como dato adicional, se lee el valor del contador ciclico de microsegundos del sistema (no del GPS), para hacer un ajuste y dar un tiempo mas acertado en el momento que se haga una peticion de tiempo

ENTREGA DE RESULTADOS, SOCKETS

Se crearon 3 sockets independientes para atender cualquier tipo de servicio daytime, time o NTP. Para el caso de daytime, al recibir una peticion, se toma las variables globales que contienen los datos de fecha y hora y se transforman en una cadena de texto que pueda ser leida por un humano. En el caso de una peticion time, se debe transformar
la fecha y la hora al formato exigido por este protocolo, para ello se creo la funcion SecondsSince1900. Este numero es enviado como respuesta

En el caso del servicio NTP, se debe almacenar el paquete recibido, hacerle algunas modificaciones a dicho paquete y luego enviarlo como respuesta. Puesto que el GPS usado solo entrega datos de hora en intervalos de cada segundo, y una peticion por parte de un cliente podria llegar en la mitad de dicho intervalo, para mitigar un poco este inconveniente, se toma los datos del contador de microsegundos del sistema mediante system_get_time() cada que llega una nueva trama. En el momento que se recibe una peticion de NTP, se lee de nuevo dicho contador, y asi se puede obtener el tiempo en microsegundos que ha transcurrido desde que llego la ultima actualizacion de segundos, hasta que se recibio una peticion de NTP. Este tiempo se suma al tiempo que esta almacenado en las variables globales (que se actualiza cada segundo ) y es enviado en el paquete de respuesta.

Circuito completo con ESP8266 como servidor inalambrico y GPS con extension

PRUEBAS Y CONCLUSIONES

- Se utilizaron las aplicaciones estandar (en este caso en Linux) para probar los servicios de tiempo programados en el ESP8266 como son netcat, rdate, ntpdate.
- Por su pequeño tamaño, bajo consumo y contar con conexion inalambrica, puede ser instalado es sitios donde tenga una mejor vista del cielo: cerca de ventanas, terrazas, etc
- Con un GPS que tenga señal de PPS se puede lograr un sistema con mayor precision
- Podria ser alimentado mediante un panel solar ( y baterias para la noche ) para tener un sistema de operacion continuo y totalmente inalambrico.
- Dependiendo del GPS usado sera necesario usar algun tipo de convertidor de nivel 5V TTL -> 3V TTL o RS232 -> 3V TTL

DOCUMENTACION

(Ver en la parte inferior - Archivos adjuntos)

* Articulo en PDF
* Esquematicos de circuitos de acople para el modulo GPS EM-506
* Esquematicos de circuitos de acople para el GPS de Mano con salida RS232 NMEA, en este caso un Garmin Etrex Legend
* Codigo fuente del programa para el ESP8266 + GPS usando el SDK

VIDEO

Video demostrativo de la conexion de distintos componentes, ademas de las pruebas realizadas