DÍA 232 DE 365

Fase 4: FreeRTOS y Conectividad IoT

📖 Teoría a Estudiar

El Enrutamiento Celular: APN y PGW

A diferencia de tu router de casa que te conecta directo a internet, las redes celulares son inmensas Intranets corporativas. Cuando tu módem manda un dato, este llega a la Torre Celular (eNodeB) y de ahí viaja al núcleo de la operadora (Packet Core).

El núcleo de la operadora necesita saber hacia dónde quieres salir. ¿Quieres salir al internet público? ¿O tu tarjeta SIM pertenece a un banco y quieres conectarte a una red privada cerrada (VPN Celular)? Esta dirección lógica es el APN (Access Point Name).

El APN le indica a la operadora qué Gateway (PGW - Packet Data Network Gateway) debe asignarte. Una vez que el PGW te acepta, te asigna una dirección IP interna (ej. 10.x.x.x), y a partir de ese momento, tienes un Contexto PDP activo. Tu módem ya es oficialmente parte de Internet.

Los Comandos de Estandarización 3GPP vs Propietarios

El consorcio internacional 3GPP define que el APN se configura con el comando AT+CGDCONT (Define PDP Context) y se enciende con AT+CGACT (PDP Context Activate). Sin embargo, los fabricantes industriales (como Quectel o SIMCom) ofrecen comandos "Wrappers" enriquecidos (como AT+QICSGP y AT+QIACT) que configuran el APN, el usuario, la contraseña y levantan el stack TCP/IP interno de un solo golpe, simplificando radicalmente el código de tu STM32.

ARQUITECTURA PDP: RUTEO DEL APN HACIA INTERNET Despachador Gas APN = "internet.itelcel.com" IP Asignada: 10.45.8.12 Radio LTE eNodeB Antena Base AT+CREG? Packet Core (PGW) El Enrutador Central de Telcel APN Público internet.itelcel.com APN Privado (VPN) m2m.banco.com NAT & IP Asignada Internet (AWS IoT)

⚙️ Ejercicios Prácticos

El Circuito / SIM Card: La tarjeta SIM de tu móvil tiene pines críticos. Si hay ruido eléctrico en el pin de datos o reloj (CLK) del socket USIM, el módem no podrá leer el APN pregrabado ni autenticarse. Asegúrate de que las pistas del socket SIM en tu PCB sean lo más cortas posibles (menos de 2 cm) y tengan capacitores de desacoplo de 33pF (para filtrar interferencia RF de la misma antena).

Ejercicio 1: Programaremos en el STM32 la función LTE_Activar_PDP_Context(). Esta función alimentará el APN al módem, le exigirá la apertura del túnel y, lo más importante, extraerá y parseará la IP asignada para certificar matemáticamente que la máquina tiene salida a Internet.


/**
 * @file lte_pdp_manager.c
 * @brief Gestión del Contexto PDP y Asignación de IP en Módems Quectel
 */

#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <string.h>
#include <stdio.h>

// Utilidades del driver UART
extern bool AT_Enviar_Comando(const char* cmd, uint32_t timeout);
extern bool AT_Capturar_Respuesta(const char* cmd, const char* expect, char* buf, uint32_t timeout);

// Variable global para diagnóstico local (Dashboard)
char ip_local_asignada[20] = "0.0.0.0";

// =======================================================
// CONFIGURACIÓN Y ACTIVACIÓN DEL TÚNEL DE DATOS
// =======================================================
/**
 * @brief  Configura el APN y activa el Contexto PDP para obtener una IP Pública/NAT
 * @param  apn: Access Point Name de la operadora (ej. "hologram")
 * @param  user: Usuario del APN (frecuentemente vacío "")
 * @param  pass: Password del APN (frecuentemente vacío "")
 * @retval bool: true si se obtuvo conexión a Internet válida
 */
bool LTE_Activar_PDP_Context(const char* apn, const char* user, const char* pass) {
    
    char cmd_buffer[128];
    char resp_buffer[128];
    
    UART_Enviar_String("[LTE-PDP] Iniciando solicitud de acceso a Internet...\r\n");

    // 1. Desactivar el contexto previamente abierto (Limpieza preventiva)
    // El ContextID 1 es el estándar para el primer túnel.
    AT_Enviar_Comando("AT+QIDEACT=1\r\n", 5000); 

    // 2. Configurar el Contexto PDP (Wrapper de Quectel para AT+CGDCONT)
    // Sintaxis: AT+QICSGP=<ContextID>,<TipoIP>,"<APN>","<User>","<Pass>",<Autenticacion>
    // TipoIP 1 = IPv4. Autenticación 1 = PAP (Común en M2M).
    snprintf(cmd_buffer, sizeof(cmd_buffer), 
             "AT+QICSGP=1,1,\"%s\",\"%s\",\"%s\",1\r\n", 
             apn, user, pass);
             
    if (!AT_Enviar_Comando(cmd_buffer, 2000)) {
        UART_Enviar_String("[LTE-PDP] Error: El módem rechazó la configuración del APN.\r\n");
        return false;
    }

    // 3. Activar el Contexto PDP (Abre la válvula de la operadora)
    // ADVERTENCIA DE LATENCIA: Esta operación requiere que el PGW de la operadora nos 
    // valide y asigne una IP en sus servidores de DHCP. Puede tomar hasta 150 segundos
    // en redes muy congestionadas. Configuramos un timeout conservador de 40s.
    
    UART_Enviar_String("[LTE-PDP] Activando túnel. Esperando asignación de IP del Carrier...\r\n");
    if (!AT_Enviar_Comando("AT+QIACT=1\r\n", 40000)) {
        UART_Enviar_String("[LTE-PDP] TIMEOUT. La operadora denegó el acceso (Revisar saldo/APN).\r\n");
        return false;
    }

    // 4. VERIFICACIÓN ABSOLUTA: Leer la IP asignada
    // Solicitamos al módem que nos diga qué IP nos dio la torre.
    if (AT_Capturar_Respuesta("AT+QIACT?\r\n", "+QIACT: ", resp_buffer, 2000)) {
        
        // El módem Quectel responde algo como: +QIACT: 1,1,1,"10.45.192.15"
        // Extraemos la IP mágicamente usando un puntero y sscanf o strstr.
        char* inicio_ip = strchr(resp_buffer, '"');
        
        if (inicio_ip != NULL) {
            inicio_ip++; // Saltamos la comilla inicial
            char* fin_ip = strchr(inicio_ip, '"'); // Buscamos la comilla final
            
            if (fin_ip != NULL) {
                *fin_ip = '\0'; // Terminamos el string justo ahí
                strncpy(ip_local_asignada, inicio_ip, sizeof(ip_local_asignada));
                
                char msg[64];
                snprintf(msg, sizeof(msg), "[LTE-PDP] ÉXITO. IP Asignada: %s\r\n", ip_local_asignada);
                UART_Enviar_String(msg);
                return true;
            }
        }
    }
    
    // Si la lectura de IP falla, no confiamos en la conexión.
    UART_Enviar_String("[LTE-PDP] Error al certificar la dirección IP local.\r\n");
    return false;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Enrutamiento Multiservicio y Tarjetas SIM M2M (Machine-to-Machine) Multicarrier.

Si equiparas tu máquina con una tarjeta SIM de Oxxo o Telcel comercial (Pre-pago), en el momento en que se acabe el saldo, la red celular seguirá marcando señal máxima (barras llenas), pero el Gateway (PGW) bloqueará tu Contexto PDP. Tu STM32 podría quedarse atascado en un bucle intentando enviar un paquete MQTT a una red muerta.

Para aplicaciones industriales como tu Despachador, utilizarás **Tarjetas SIM M2M Multicarrier** (Por ejemplo, las de la empresa Hologram o 1NCE). Estas SIMs no tienen número de teléfono ni reciben SMS normales; están diseñadas puramente para túneles de datos. Cuando el Despachador de Gas viaja de Guadalajara a un rancho remoto, la SIM puede engancharse a la antena de Movistar, AT&T o Telcel, la que tenga más fuerza. Para que esto funcione, el **APN** es el secreto: en lugar de usar `internet.itelcel.com`, usarás el APN global `hologram`. Al programar la Máquina de Estados de PDP en tu STM32 y certificar matemáticamente la extracción de la dirección IP asignada (`AT+QIACT?`), le garantizas a FreeRTOS que el túnel de datos está abierto, seguro y facturado, permitiéndole vaciar la EEPROM de ventas atrasadas con total confianza.

📝 Resumen del Día