SMS, envío local
Por su estabilidad y poco consumo de datos es una buena opción para proveer a nuestra infraestructura la posibilidad de enviar sms en determinas situaciones. Como en principio el objetivo es dar servicio en modo servido, comencé a escribir el articulo pero se me hizo largo, pues me encontré con algunas dificultades que parecen obvias pero cuando te obcecas en algo pasan estas cosas. No cai en que la SIM se tiene que desbloquear al arranque del dispositivo, como nos ocurre con los móviles, pero también cuento esta historia en el articulo. Por eso vamos a empezar por lo basico que es que funcione de manera local.
⚙️ Hardware & 💽 Software
Buscando por el trastero de casa apareció un viejo usb ZTE MF190 que utilice muchísimo en una época para realizar guardias y los fines de semana que salida de viaje. A esto le añadiremos una vieja ya Raspberry Pi 3 B +. Instalaremos sistema operativo Raspbian GNU/Linux 12 (bookworm) en version lite, que no necesitaremos mas. A todo esto le añadimos una SIM de datos que mi proveedor la tiene a buen precio, es realmente un duplicado. Lo bueno que en teoría no tengo limite de envío de mensajes a móviles nacionales, siempre y cuando no sea con uso comercial.
🧩 Preparar el entorno
Instalaremos el software necesario desde el terminal:
sudo apt update
sudo apt install usb-modeswitch minicom gammu gammu-smsd python3-flask python3 python3-venv python3-pip minicomA continuación pinchamos el módem usb y verificamos que lo detecta correctamente desde el terminal:
lsusb
Bus 001 Device 005: ID 19d2:0124 ZTE WCDMA Technologies MSM ZTE WCDMA Technologies MSM
Bus 001 Device 003: ID 0424:ec00 Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubComo podemos ver en la salida del comando en la primera linea detecta en hardware perfectamente:
Bus 001 Device 005: ID 19d2:0124 ZTE WCDMA Technologies MSM ZTE WCDMA Technologies MSM
Ahora necesitamos saber a que tty se asociado el módem,
dmesg | grep tty
[418587.614660] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB0
[418587.627545] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB1
[418587.633068] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB2
[418587.633551] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB3
[418587.634006] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB4Ya sabemos a que tty o tty`s esta asignado el módem. Esta información sera necesaria para el siguiente paso. Yo voy a trabajar con el ttyUSB2, manías … ? si.
Desbloquear la SIM
La primera vez que me puse a trabajar con este tema me volví loco probando configuraciones y el problema fue que la sim no la tenia desbloqueada, vamos lo de introducir el pin cuando encademos el móvil.
Verifica el estado real de la SIM (comandos AT), desbloqueo
Desde nuestro terminal ejecutamos:
minicom -D /dev/ttyUSB2Verificamos que tenemos comunicación con el módem:
AT
Debería responder:
OK
Si responde, el ya estamos conectados al módem.
Ahora escribimos:
AT+CPIN?
Posibles respuestas:
| Respuesta | Significado |
|---|---|
+CPIN: READY |
SIM desbloqueada ✅ |
+CPIN: SIM PIN |
SIM bloqueada con PIN ❌ |
+CPIN: SIM PUK |
SIM bloqueada por PUK 🚫 |
ERROR |
No detecta SIM o fallo de comunicación |
Si la SIM esta bloqueada la desbloqueamos, sin salir de minicom:
AT+CPIN="1234"
Suponiendo que nuestro pin es “1234”, esto debería respondernos con:
OK
A continuación esperamos unos 5 – 10 segundos y escribimos:
AT+CPIN?
Si ahora obtenemos un READY, la SIM ya está desbloqueada ✅. Verificamos que la red está disponible:
AT+CREG?
Respuestas posibles:
| Respuesta | Significado |
|---|---|
+CREG: 0,1 |
Registrado en red local ✅ |
+CREG: 0,5 |
Registrado (roaming) ✅ |
+CREG: 0,2 |
Buscando red 🔄 |
+CREG: 0,0 |
No registrado 🚫 |
Si la respuesta es 0,1 o 0,5, ya tenemos red. Salimos de minicom, pulsando Ctrl + A, luego Z, luego X, y confirmamos salir. Primer problema resuelto, ahora vamos por el segundo, si reiniciamos la Raspberry, seguirá pidiendo el pin. En teoría se debería de poder desactivar este medida de seguridad con comandos at desde minicom de la siguiente manera:
AT+CLCK="SC",0,"1234"
Pero no todos los módems o firmwares lo soporta, que este es mi caso. Con lo cual vamos a ver otras alternativas:
✅ Solución más fiable
Desactiva el PIN una sola vez desde un teléfono móvil:
- Inserta la SIM en cualquier teléfono.
- Desbloquéala introduciendo el PIN 1234.
- Entra en los ajustes de la SIM:
- Android → Ajustes → Seguridad → Bloqueo de tarjeta SIM → Desactivar (introduce el PIN)
- iPhone → Ajustes → Datos móviles → PIN de la SIM → Desactivar (introduce el PIN)
- Apaga el teléfono y vuelve a poner la SIM en tu Raspberry Pi.
🧩 1️⃣ Script de desbloqueo
Vamos a crear un script con las siguientes características:
- Esperar hasta que el dispositivo
/dev/ttyUSB2esté disponible. - Enviar el PIN automáticamente al módem.
- Funcionar de forma silenciosa en cada arranque.
Lo crearemos en la siguiente ruta “/usr/local/bin/desbloquear_sim.sh” como administrador (root)
Contenido del script:
#!/bin/bash
# Script: desbloquear_sim.sh
# Desbloquea la SIM del módem ZTE MF190 con el PIN indicado
# Espera a que el dispositivo esté disponible antes de enviar el comando AT
DEVICE="/dev/ttyUSB2"
PIN="1234"
TIMEOUT=60 # segundos máximo para esperar al dispositivo
echo "[SIM] Esperando a que $DEVICE esté disponible..."
for ((i=0; i<$TIMEOUT; i++)); do
if [ -e "$DEVICE" ]; then
echo "[SIM] Dispositivo detectado en $DEVICE"
break
fi
sleep 1
done
if [ ! -e "$DEVICE" ]; then
echo "[SIM] Error: $DEVICE no se detectó tras $TIMEOUT segundos."
exit 1
fi
# Enviar comando AT para desbloquear la SIM
{
echo "AT+CPIN=\"$PIN\""
sleep 5
} > "$DEVICE"
echo "[SIM] PIN enviado al módem. Esperando registro en red..."
sleep 10
echo "[SIM] Desbloqueo completado."
exit 0Le damos permisos de ejecucion
sudo chmod +x /usr/local/bin/desbloquear_sim.sh⚙️ 2️⃣ Creamos el servicio systemd
Creamos el fichero del servicio “/etc/systemd/system/desbloquear-sim.service” como administrador (root):
Contenido del fichero de servicio:
[Unit]
Description=Desbloquear SIM ZTE MF190 automáticamente
After=dev-ttyUSB2.device
Requires=dev-ttyUSB2.device
[Service]
Type=oneshot
ExecStart=/usr/local/bin/desbloquear_sim.sh
RemainAfterExit=true
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
🚀 3️⃣ Activamos el servicio, lo iniciamos y comprobamos su estado
sudo systemctl daemon-reload
sudo systemctl enable desbloquear-sim.service
sudo systemctl start desbloquear-sim.service
sudo systemctl status desbloquear-sim.serviceSi todo esta correcto deberías ver algo parecido a esto:
[SIM] Dispositivo detectado en /dev/ttyUSB2
[SIM] PIN enviado al módem. Esperando registro en red...
[SIM] Desbloqueo completado.
Configurar Gammu
Gammu sera el encargado de enviar los sms. En este caso en particular no nos interesa que el servio este disponible para todos los usuarios del sistema, con lo cual realizaremos una configuración especifica para nuestro usuario, el que posteriormente sera el que arranque el servidor de envío de sms.En nuestro home creamos el fichero .gammurc. Con el siguiente contenido:
[gammu]
device = /dev/ttyUSB2
connection = at
name = ZTE-MF190
model = auto
Cambiamos los derechos sobre el fichero para aumentar la seguridad del uso.
chmod 600 .gammurc Comprobamos que Gammu esta funcionando:
gammu networkinfo
Network state : home network
Network : Movistar
Signal strength : 70%Si obtenemos una respuesta parecida o igual a la anterior dándonos datos de la conexión, es que todo esta ya ok.
Para comprobar que todo lo anterior funciona, reiniciamos la Raspberry Pi.
Ahora ya por fin vamos a enviar nuestro primer sms desde el terminal:
gammu sendsms TEXT +34666600666 -text "Hola, prueba desde Raspberry Pi"
If you want break, press Ctrl+C…
Enviando SMS 1/1…waiting for network answer..Aceptar, referencia de mensaje=5Donde 666600666 es el numero destino del mensaje, por delante va el código de país.
Buen por hoy hemos terminado, el siguiente configurar un poco mas Gammu en profundidad, su fichero de configuración.