tutoriales.com

Crea tu Propio Servidor NTP Preciso con Raspberry Pi y GPS: ¡Hora Sincronizada al Milisegundo!

Este tutorial te guiará paso a paso para transformar tu Raspberry Pi en un servidor NTP stratum 1, obteniendo la hora directamente de satélites GPS. Lograrás una sincronización horaria extremadamente precisa para todos tus dispositivos, ideal para redes domésticas, laboratorios o proyectos que requieran gran exactitud temporal.

Intermedio25 min de lectura16 views
Reportar error

🚀 Introducción: La Importancia de la Hora Precisa

En el mundo digital actual, la sincronización horaria precisa es mucho más que una simple conveniencia; es una necesidad fundamental para el correcto funcionamiento de sistemas informáticos, redes, y aplicaciones distribuidas. Desde la correcta estampación de tiempo de los logs de seguridad hasta el funcionamiento coordinado de transacciones financieras o sistemas de automatización industrial, tener una hora exacta es crítico.

El protocolo NTP (Network Time Protocol) es el estándar de facto para sincronizar la hora a través de redes. La mayoría de los dispositivos se conectan a servidores NTP públicos, que a menudo son servidores de stratum 2 o superior, lo que significa que su hora se deriva de un servidor de stratum 1 (que se sincroniza directamente con una fuente de tiempo de referencia, como un reloj atómico o un receptor GPS).

En este tutorial, te embarcarás en un proyecto fascinante: construir tu propio servidor NTP de stratum 1 utilizando una Raspberry Pi y un módulo GPS. Esto te permitirá tener una fuente de tiempo extremadamente precisa en tu red local, independizándote de la latencia y la variabilidad de los servidores NTP públicos de internet. Además de ser un proyecto educativo y gratificante, te proporcionará un control total sobre la precisión de tu tiempo.

¿Por qué un servidor NTP con GPS? 🤔

  1. Precisión Extrema: Los módulos GPS modernos pueden proporcionar pulsos de tiempo (PPS - Pulse Per Second) con una precisión de nanosegundos respecto al Tiempo Universal Coordinado (UTC), haciendo que tu servidor NTP sea de stratum 1.
  2. Independencia de Internet: Tu red no dependerá de una conexión a internet activa para mantener la hora exacta una vez que el GPS tenga señal.
  3. Reducción de Latencia: Al ser un servidor local, la latencia para sincronizar tus dispositivos será mínima, mejorando la precisión en tu red interna.
  4. Control Total: Tienes control sobre tu propia fuente de tiempo, ideal para entornos sensibles o proyectos de experimentación.
  5. Aprendizaje: Es una excelente oportunidad para profundizar en cómo funcionan los sistemas de tiempo y los protocolos de red.

🛠️ Materiales Necesarios

Antes de sumergirnos en la configuración, asegúrate de tener todos los componentes a mano. La calidad de tu módulo GPS puede influir en la facilidad de obtención de señal y la precisión general.

ComponenteDescripciónEnlace Sugerido (Ejemplo)Cantidad
------------
Raspberry PiCualquier modelo con pines GPIO (Pi 3B+, 4 o Zero W son ideales)Amazon1
Tarjeta MicroSDMínimo 8GB, con Raspberry Pi OS Lite instaladoAmazon1
------------
Fuente de AlimentaciónOficial para Raspberry Pi (5V, 3A)Amazon1
Módulo GPS con PPSNeo-6M, U-blox MAX-M8Q o similar con salida PPSAliExpress1
------------
Antena GPSGeneralmente incluida con el módulo1
Cables Jumper F-MPara conectar el módulo GPS a los GPIO de la PiAmazon4-5
------------
Protoboard (opcional)Para facilitar las conexionesAmazon1
Carcasa (opcional)Para proteger la Pi y el GPS1
---------
Acceso a PC con SSHPara la configuración remota1
💡 Consejo: El módulo GPS Neo-6M es muy popular y económico, pero asegúrate de que tenga el pin PPS disponible. Algunos módulos U-blox más recientes ofrecen mejor rendimiento.

🔌 Conexión del Módulo GPS a la Raspberry Pi

La conexión física es un paso crucial. Necesitarás identificar los pines correctos en tu módulo GPS y en tu Raspberry Pi. La mayoría de los módulos GPS usan una interfaz serie (UART) para los datos NMEA y un pin separado para el pulso por segundo (PPS).

Identificación de Pines 📌

Los pines comunes en un módulo GPS (como el Neo-6M) son:

  • VCC: Alimentación (generalmente 3.3V o 5V)
  • GND: Tierra
  • TX: Transmisión de datos (hacia la Pi)
  • RX: Recepción de datos (desde la Pi, a menudo no se usa para solo leer)
  • PPS: Pulso por segundo

En tu Raspberry Pi, utilizaremos los siguientes pines GPIO:

  • Pin 1 (3.3V): Para VCC del GPS (si tu módulo acepta 3.3V directamente)
  • Pin 6 (GND): Para GND del GPS
  • Pin 8 (GPIO14/TXD): Para RX del GPS (la Pi recibe los datos TX del GPS)
  • Pin 10 (GPIO15/RXD): Para TX del GPS (la Pi envía datos al GPS, no lo usaremos en este tutorial si solo escuchamos)
  • Pin 12 (GPIO18): Para PPS del GPS (¡este es importante!)
⚠️ Advertencia: Verifica el voltaje de alimentación de tu módulo GPS. Si es de 5V, conéctalo al Pin 2 o 4 (5V) de la Raspberry Pi. Si tu módulo no es tolerante a 3.3V en su pin RX, necesitarás un conversor de nivel lógico. La mayoría de los módulos modernos son compatibles con 3.3V directamente o tienen reguladores integrados.

Diagrama de Conexión ⚡

Raspberry Pi Módulo GPS Neo-6M 3.3V GND GPIO 14 (TXD) GPIO 18 VCC GND TX PPS

Conecta tu módulo GPS a la Raspberry Pi de la siguiente manera:

  • GPS VCC al GPIO Pin 1 (3.3V) de la Raspberry Pi
  • GPS GND al GPIO Pin 6 (GND) de la Raspberry Pi
  • GPS TX al GPIO Pin 8 (GPIO14/TXD) de la Raspberry Pi
  • GPS PPS al GPIO Pin 12 (GPIO18) de la Raspberry Pi
📌 Nota: Algunos módulos GPS tienen un LED que parpadea una vez que obtiene una señal GPS válida. Esto es útil para verificar que el módulo está funcionando correctamente.

📝 Configuración Inicial de Raspberry Pi OS

Asegúrate de tener una instalación fresca de Raspberry Pi OS Lite (la versión sin escritorio es preferible para un servidor) y acceso SSH. Si no lo tienes, puedes seguir la guía oficial para flashear la imagen y habilitar SSH.

1. Actualizar el Sistema 🔄

Conéctate a tu Raspberry Pi vía SSH y actualiza el sistema. Es una buena práctica hacerlo antes de instalar cualquier software nuevo.

sudo apt update
sudo apt upgrade -y

2. Habilitar la Interfaz Serie (UART) y PPS ⚙️

El puerto serie y el pin PPS necesitan ser configurados. Editaremos el archivo config.txt y deshabilitaremos la consola serie por defecto.

sudo nano /boot/config.txt

Añade las siguientes líneas al final del archivo. Si ya existen algunas de estas, modifícalas o asegúrate de que no haya duplicados que causen conflictos.

# Habilitar UART para el GPS
enable_uart=1

# Deshabilitar la consola serie en el puerto UART, para que el GPS pueda usarlo
dtoverlay=disable-bt

# Habilitar el pulso por segundo (PPS) en GPIO18
dtoverlay=pps-gpio,gpiopin=18
  • enable_uart=1: Habilita la interfaz serie UART.
  • dtoverlay=disable-bt: Deshabilita Bluetooth si lo tienes y lo libera para usar el UART principal (/dev/ttyS0 o /dev/ttyAMA0 dependiendo de tu Pi y configuración). Sin esto, Bluetooth podría usar el UART y tendrías que usar un UART diferente o un software emulado.
  • dtoverlay=pps-gpio,gpiopin=18: Activa el soporte PPS en el pin GPIO18. ¡Este es el pin que conectamos al PPS del GPS!

Guarda el archivo (Ctrl + O, Enter) y sal (Ctrl + X).

3. Deshabilitar la Consola Serie 🚫

Para asegurarte de que ningún proceso de consola interfiera con el GPS, deshabilita la consola serie del sistema.

sudo raspi-config

Navega a 3 Interface Options > P6 Serial Port.

  • ¿Te gustaría que se habilite el inicio de sesión de la shell por el puerto serie? Selecciona No.
  • ¿Te gustaría que el puerto hardware serie esté habilitado? Selecciona Yes.

Reinicia tu Raspberry Pi para que los cambios surtan efecto:

sudo reboot

🛰️ Configuración del Módulo GPS y PPS

Una vez reiniciada la Pi, el puerto serie debería estar libre para tu GPS y el pin PPS activo. Vamos a verificarlo.

1. Instalación de Herramientas GPS 📦

Necesitaremos gpsd para leer los datos NMEA del GPS y pps-tools para verificar el pulso PPS.

sudo apt install gpsd gpsd-clients pps-tools -y

2. Verificación del PPS (Pulso Por Segundo) ✅

Antes de configurar gpsd, es crucial verificar que el PPS está siendo detectado correctamente. El pin gpiopin=18 que configuramos en config.txt se mapeará a un dispositivo /dev/pps0.

watch -n 1 ppstest /dev/pps0

Deberías ver una salida similar a esta, donde assert y clear se actualizan cada segundo, indicando que el sistema está detectando los pulsos del GPS:

waiting for PPS event...
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
kernel PPS monitor:  /dev/pps0
  source 0 - assert 1678886400.123456789, sequence: 1234 - clear  0.000000000, sequence: 0
  source 0 - assert 1678886401.123456789, sequence: 1235 - clear  0.000000000, sequence: 0

Si no ves esto, o los valores no se actualizan, revisa tus conexiones físicas, el archivo config.txt y asegúrate de que tu módulo GPS tenga una buena señal (sácalo al exterior si es posible).

⚠️ Advertencia: El GPS necesita una visión clara del cielo para obtener una posición y tiempo precisos. Puede tardar unos minutos en adquirir suficientes satélites ('time to first fix' - TTFF).

3. Configuración de gpsd para NMEA 📝

gpsd es un demonio que lee los datos NMEA del GPS y los pone a disposición de otras aplicaciones. Necesitamos configurarlo para que apunte a nuestro puerto serie.

Edita el archivo de configuración de gpsd:

sudo nano /etc/default/gpsd

Modifica las siguientes líneas:

# Comenta o elimina la línea preexistente si la hay para DEVICES
# DEVICES=""

# Añade la línea para especificar el puerto serie del GPS
DEVICES="/dev/ttyS0"

# Configura las opciones para que gpsd no escuche en localhost por defecto
# y lo haga en todas las interfaces, si lo deseas más adelante para clientes remotos
GPSD_OPTIONS="-n"

# Opcional: Si quieres que gpsd escuche en una IP específica o en todas las interfaces,
# puedes añadir -L a GPSD_OPTIONS o cambiar el INTERFACE.
# Para la mayoría de los casos de NTP, el -n es suficiente y ntpd accederá directamente.
# O si vas a usar gpsd para otras aplicaciones, considera:
# USBAUDIO="yes"
# GPSD_SOCKET="/var/run/gpsd.sock"
# LISTEN_ADDR="0.0.0.0"
📌 Nota: En Raspberry Pi 3 y 4, `/dev/ttyS0` suele ser el mini-UART y `/dev/ttyAMA0` es el UART principal. Sin `dtoverlay=disable-bt`, Bluetooth usa `/dev/ttyAMA0`. Si el GPS sigue sin funcionar con `/dev/ttyS0`, prueba con `/dev/ttyAMA0` después de asegurarte de que `disable-bt` está correctamente aplicado y reiniciado.

Guarda y cierra. Ahora, reinicia gpsd:

sudo systemctl restart gpsd
sudo systemctl enable gpsd

4. Verificación de Datos GPS 📊

Usa cgps para ver si gpsd está recibiendo datos NMEA del GPS. Tardará un poco en fijar la posición y el tiempo.

cgps

Verás una interfaz de texto con la información de los satélites, la posición, la hora UTC, etc. El campo Time debería actualizarse. Los campos Fix y Satellites son importantes: 3D FIX y un número decente de satélites indican una buena señal. Observa también el campo PPS y Time (PPS) para confirmar que el pulso PPS se está utilizando.

⚠️ Advertencia: Si ves `gpsd: no active NMEA data sources` o similar, revisa la conexión física del GPS, la configuración en `/etc/default/gpsd` y los permisos del puerto serie (a veces `sudo chmod 666 /dev/ttyS0` puede ayudar temporalmente para pruebas, pero la configuración correcta de usuario/grupo es mejor).

⏰ Configuración del Servidor NTP (Chrony)

Ahora que el GPS y PPS están funcionando, configuraremos chrony, que es un cliente y servidor NTP más moderno y con mejor rendimiento para fuentes de tiempo intermitentes (como un GPS con mala señal ocasional) que el antiguo ntp.org daemon (ntpd).

1. Instalación de Chrony 📦

sudo apt install chrony -y

2. Configuración de Chrony 📝

Ahora, editaremos el archivo de configuración principal de Chrony.

sudo nano /etc/chrony/chrony.conf

Asegúrate de comentar o eliminar las líneas pool o server existentes que apunten a servidores NTP externos, o al menos colocarlas después de nuestras fuentes GPS/PPS. Queremos que el GPS sea la fuente principal.

Necesitamos añadir las entradas para la fuente NMEA (GPS) y la fuente PPS.

# --- Fuentes de tiempo locales (GPS y PPS) --- 

# Fuente NMEA (datos de tiempo del GPS, fecha y hora)
# La precisión se basa en la hora que reporta el GPS, que puede tener algo de jitter.
# Usamos 'refid NMEA' para identificar esta fuente.
refclock SHM 0 offset 0.0 rtcsync precision 1e-1

# Fuente PPS (pulso por segundo, para una precisión atómica)
# Este es el verdadero 'stratum 1' que nos da la precisión de nanosegundos.
# Usamos 'refid PPS' para identificar esta fuente y 'prefer' para darle prioridad.
# El driver PPS para SHM es el 1, y 'offset 0.0' compensa cualquier retraso.
refclock SHM 1 offset 0.0 refid PPS prefer

# --- Configuración del servidor NTP local --- 

# Permite que la red local se sincronice con este servidor NTP
# Reemplaza '192.168.1.0/24' con el rango de tu red local
allow 192.168.1.0/24

# Opcional: Permite consultas de estado de clientes de la red local
# cmdallow 192.168.1.0/24

# --- Opciones generales --- 

# El archivo de deriva, donde chrony almacena información sobre cómo se desvía el reloj de la Pi.
# Permite a chrony arrancar más rápido con una estimación de la deriva.
 걱le driftfile /var/lib/chrony/chrony.drift

# Habilitar la sincronización del reloj de hardware (RTC) si está disponible
# rtcsync

# Intervalo mínimo y máximo entre sondeos (minpoll, maxpoll)
# Ajusta según sea necesario, pero los valores por defecto suelen ser buenos.
# Esto indica a Chrony con qué frecuencia debe preguntar a sus fuentes de tiempo.
minpoll 4
maxpoll 4

# Guardar la desviación del reloj en el archivo de deriva al salir.
# Esto ayuda a Chrony a arrancar con una mejor estimación de la deriva la próxima vez.
makestep 1 -1

# Un último 'pool' de servidores externos como respaldo en caso de que el GPS falle completamente.
# Comenta o elimina si quieres dependencia cero de internet.
# pool 0.debian.pool.ntp.org iburst
# pool 1.debian.pool.ntp.org iburst
# pool 2.debian.pool.ntp.org iburst
# pool 3.debian.pool.ntp.org iburst
🔥 Importante: Asegúrate de que las líneas `refclock SHM 0` y `refclock SHM 1` estén presentes y correctamente configuradas. `SHM 0` es para los datos NMEA (fecha/hora) y `SHM 1` es para el pulso PPS de alta precisión.

Guarda el archivo y sal. Reinicia Chrony para que aplique la nueva configuración:

sudo systemctl restart chrony
sudo systemctl enable chrony

3. Verificación de Chrony 📊

Ahora, verifica el estado de Chrony para asegurarte de que está usando el GPS y PPS como fuentes.

chronyc sources

Deberías ver una salida similar a esta (puede tardar unos minutos en adquirir las fuentes):

210 Chrony sources:
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
#* NMEA                           0   4   377    22   +123us[ -123us] +/-  13ms
#x PPS                            0   4   377    22    -52ns[  +63ns] +/-  22ns
  • El * o # indica el estado de la fuente. * significa que es la fuente sincronizada actualmente. # significa que está online pero no es la seleccionada o está siendo medida.
  • NMEA y PPS deberían aparecer como fuentes. PPS debería tener una precisión mucho mayor (nanosegundos - ns).
  • Stratum 0 para las fuentes NMEA y PPS indica que son fuentes de referencia directas (stratum 1 desde la perspectiva del servidor).
  • Reach debe ser 377 (octal) para indicar que la fuente es estable y accesible.

También puedes usar chronyc tracking para ver el estado de la sincronización de tu propio servidor:

chronyc tracking

Deberías ver que Reference ID es PPS (si está seleccionada), y Stratum debería ser 1 o 2 (si está sincronizado con una fuente stratum 1). El System time debería estar muy cerca del Reference time.

Reference ID    : A002130F (PPS)
Stratum         : 1
Ref time (UTC)  : Wed Mar 15 10:30:00 2023
System time     : 0.000000001 seconds slow of NTP time
Last offset     : -0.000000001 seconds
RMS offset      : 0.000000002 seconds
Frequency       : 2.123 ppm fast
Residual freq   : +0.000 ppm
Skew            : 0.001 ppm
Root delay      : 0.000000000 seconds
Root dispersion : 0.000001000 seconds
Update interval : 2.0 seconds
Leap status     : Normal

🌐 Configuración de Clientes NTP

Ahora que tu Raspberry Pi es un servidor NTP stratum 1, puedes configurar otros dispositivos en tu red para que se sincronicen con ella.

1. Clientes Linux/Unix (como otras Raspberry Pi) 🐧

En un cliente Linux, si usas chrony, edita /etc/chrony/chrony.conf y reemplaza o añade tu Raspberry Pi como servidor NTP. Asegúrate de comentar los pool o server existentes si quieres que tu Pi sea la única fuente.

# Reemplaza 'raspberrypi.local' o la IP de tu Raspberry Pi
server raspberrypi.local iburst prefer

# Opcional: Pool de respaldo si el servidor local falla
# pool 0.debian.pool.ntp.org iburst

Guarda, reinicia chrony y verifica:

sudo systemctl restart chrony
chronyc sources

Deberías ver tu Raspberry Pi como una fuente con Stratum 1.

Si usas ntp.org daemon (ntpd), edita /etc/ntp.conf y añade:

server raspberrypi.local iburst

Reinicia ntpd y verifica:

sudo systemctl restart ntp
ntpq -p

2. Clientes Windows 🖥️

  1. Abre el Panel de control.
  2. Ve a Reloj y región > Fecha y hora.
  3. En la pestaña Hora de Internet, haz clic en Cambiar configuración.
  4. Desmarca Sincronizar con un servidor horario de Internet y cámbialo a tu servidor NTP de Raspberry Pi (por ejemplo, raspberrypi.local o la dirección IP de tu Pi).
  5. Haz clic en Actualizar ahora.

3. Clientes macOS 🍎

  1. Ve a Preferencias del Sistema > Fecha y hora.
  2. Desbloquea el candado para hacer cambios.
  3. En la pestaña Fecha y hora, desmarca Establecer fecha y hora automáticamente o cambia el servidor a tu Raspberry Pi.
💡 Consejo: Si tu Raspberry Pi tiene un nombre de host configurado (e.g., `raspberrypi.local`), puedes usarlo en lugar de la dirección IP, siempre que tu red soporte mDNS/Bonjour.

📈 Monitoreo y Mantenimiento

Una vez que tu servidor NTP está en funcionamiento, es importante monitorearlo para asegurar su precisión y estabilidad.

1. Comandos de Chrony 📋

  • chronyc sources: Muestra las fuentes de tiempo que Chrony está usando y su estado.
  • chronyc tracking: Muestra el estado actual de sincronización del reloj del sistema.
  • chronyc activity: Muestra la actividad de los clientes NTP.
  • chronyc clients: Muestra los clientes NTP conectados y la última vez que consultaron.

2. Logs del Sistema 📜

Revisa los logs del sistema para cualquier error relacionado con gpsd o chrony:

journalctl -u gpsd -f
journalctl -u chrony -f

3. Consideraciones para la Estabilidad ⛰️

  • Ubicación del GPS: Asegúrate de que la antena GPS tenga una vista despejada del cielo. Las obstrucciones (edificios, árboles densos) reducirán la calidad de la señal y la precisión. Un cable de extensión para la antena puede ser útil.
  • Fuente de Alimentación: Una fuente de alimentación estable para la Raspberry Pi es crucial para evitar reinicios o comportamientos erráticos.
  • Entorno: Protege tu Raspberry Pi y el módulo GPS de elementos externos si lo instalas en exteriores.
📌 Nota: Es normal que al inicio el GPS tarde unos minutos en obtener una fijación ('fix') y que Chrony tarde un poco más en estabilizarse y seleccionar las fuentes PPS y NMEA. ¡Ten paciencia!

🎨 Posibles Mejoras y Proyectos Futuros

Este proyecto es una excelente base para futuras expansiones y mejoras:

  • Antena Externa: Considera usar una antena GPS externa activa con un cable más largo para colocarla en una ubicación óptima (ej. en el tejado).
  • Carcasa para Exteriores: Si la Pi y el GPS van a estar fuera, una carcasa resistente a la intemperie es indispensable.
  • Monitoreo con Grafana/InfluxDB: Recopila datos de precisión del tiempo de Chrony y visualízalos en un dashboard para un monitoreo a largo plazo.
  • Batería de Respaldo (RTC): Aunque el GPS proporciona la hora al arrancar, un módulo RTC (Real Time Clock) con batería puede mantener la hora entre reinicios sin señal GPS, reduciendo el tiempo de adquisición del fix.
  • Servidor NTP redundante: Si la precisión es crítica, puedes configurar una segunda Raspberry Pi con GPS como servidor de respaldo.
¿Qué es un 'stratum' en NTP?El 'stratum' indica la distancia de un servidor NTP a una fuente de tiempo de referencia primaria. Un servidor de stratum 0 es un dispositivo de referencia (reloj atómico, GPS). Un servidor de stratum 1 se sincroniza directamente con un stratum 0. Un servidor de stratum 2 se sincroniza con un stratum 1, y así sucesivamente. Cuanto menor el número de stratum, más precisa es la fuente de tiempo.
¿Cuál es la diferencia entre NMEA y PPS? NMEA (National Marine Electronics Association) es un protocolo estándar para la comunicación entre dispositivos electrónicos marinos, incluyendo los GPS. El mensaje NMEA contiene la fecha, la hora, la posición y otra información. La hora NMEA es precisa, pero puede tener un poco de *jitter* (pequeñas variaciones) debido a la latencia de la comunicación serial.

PPS (Pulse Per Second) es una señal eléctrica que se genera exactamente una vez por segundo, en el segundo exacto UTC. Esta señal es extremadamente precisa (nivel de nanosegundos) y se usa para alinear el momento exacto del segundo, mientras que los datos NMEA proporcionan la fecha y la hora completa. PPS es la clave para un servidor NTP de stratum 1.

¿Puedo usar mi Raspberry Pi con GPS como servidor NTP para mi router? ¡Sí! Muchos routers domésticos permiten configurar servidores NTP personalizados. Puedes introducir la dirección IP de tu Raspberry Pi en la configuración NTP de tu router. De esta manera, todos los dispositivos conectados a tu router (que usan la configuración NTP del router) se sincronizarán con tu servidor GPS local. Consulta el manual de tu router para saber cómo configurar esto.

🎉 Conclusión

¡Felicidades! Has construido con éxito tu propio servidor NTP de stratum 1 utilizando una Raspberry Pi y un módulo GPS. Este proyecto no solo es una gran forma de aprender sobre sincronización horaria y el funcionamiento del GPS, sino que también te proporciona una herramienta extremadamente útil y precisa para tu red doméstica o laboratorio. Disfruta de la satisfacción de tener la hora más exacta posible, directamente de los satélites, controlada por ti. La precisión del tiempo nunca fue tan accesible.

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!