Solución de Respuesta Automática por SMS Utilizando Software Gratuito

Fecha de publicación:
Última actualización: 2022-12-26
Autor:

 

Las soluciones de respuesta automática por SMS se usan para asignación de turnos y emisión de comprobantes, votación electrónica, encuestas, suscripción y cancelación de servicios, entre muchos otros casos de uso. El usuario envía un SMS con una palabra clave y recibe una respuesta automática. En este artículo se explica cómo implementar este tipo de solución utilizando solamente software gratuito: el Gateway de código abierto Kannel y la app gratuita SMS Proxy para Android.

Una solución de respuesta automática por SMS utilizando Kannel y la app SMS Proxy

 

Centro de Mensajes (SMSC)

El Centro de Mensajes, más oficialmente conocido como Central de Servicio de Mensajes Cortos (en inglés, Short Message Service Center) o SMSC, es el elemento de la red móvil que se encarga de enrutar, almacenar y despachar los mensajes SMS.1 Generalmente, también puede gestionar la tasación, el filtrado (por ejemplo, la protección contra spam) y otras tareas relacionadas con la gestión de SMS. De todos modos, el objetivo principal del SMSC es almacenar y entregar los mensajes SMS. Los mensajes son almacenados hasta que el destinatario esté disponible para recibirlos o dichos mensajes expiren, lo que suceda primero. La función del SMSC es muy similar a la de un servidor de correo electrónico. Los e-mail no se intercambian punto a punto, sino que se entregan a través de un servidor de correo, el cual aplica un modelo de almacenamiento y reenvío (en inglés, store-and-forward). El SMSC es como un servidor de correo electrónico para SMS. El operador móvil puede tener múltiples SMSC. Cuando se envía un SMS a otro usuario, el SMS llegará primero al SMSC. Después de eso, el SMSC intentará entregarlo al usuario final.

Hay casos especiales en los que el SMSC no funciona en modo store-and-forward o los SMS se entregan directamente al usuario final sin pasar por el SMSC. Estos casos especiales están por fuera del alcance de este artículo.

Dado que el SMSC forma parte de la red móvil, la comunicación entre el teléfono y el SMSC es inalámbrica. Sin embargo, los proveedores de servicios prefieren tener una conexión de SMSC dedicada, lo cual puede ser más eficiente y especialmente útil para manejar grandes volúmenes de tráfico. El operador móvil puede permitirles acceder al SMSC a través de una interfaz dedicada utilizando el protocolo SMPP. Existen varios protocolos alternativos: CIMD2, UCP, SEMA e incluso algunas API basadas en HTTP, pero SMPP es el estándar de facto desde los años 90. Actualmente hay más de 30 proveedores de SMSC y prácticamente todos ellos soportan SMPP. También existen proveedores de SMS masivos y concentradores de SMS, los cuales suelen exponer una API o interfaz dedicada para enviar y recibir SMS de la misma forma que un SMSC.

 

Gateway de SMS

Estrictamente hablando, no es obligatorio utilizar un Gateway SMS para enviar y recibir SMS. Generalmente es posible interactuar con el SMSC directamente. El protocolo SMPP es un estándar abierto.2 Cualquiera puede desarrollar un cliente SMPP o reutilizar una librería de código abierto, como OpenSmpp, para interactuar con el SMSC sin intermediarios ni proxies. Sin embargo, el uso de un Gateway de SMS puede ser conveniente para evitar el desarrollo de una implementación propia. Típicamente el Gateway de SMS puede soportar diferentes protocolos de SMSC, no solo SMPP. También puede soportar el filtrado de SMS, la compartición de conexiones SMSC, enrutamiento, encolamiento, registro de logs, autenticación de usuarios, etc. El Gateway de código abierto Kannel tiene todas estas características y muchas más.

Por supuesto, puede utilizar cualquier otro Gateway de SMS de su preferencia. Existen diferentes alternativas gratuitas. Por ejemplo, Apache Camel incluye un Gateway SMS integrado. Jasmin es otro Gateway de SMS de código abierto. También existen muchos Gateway de SMS comerciales. No obstante, en términos de estabilidad y rendimiento, Kannel funciona perfectamente para casi cualquier tipo de proyecto de SMS. Algunos operadores móviles utilizan Kannel incluso para servicios críticos para el negocio.

 

Proxy de SMSC

Un proxy de SMSC es cualquier tipo de servicio intermediario entre el cliente SMS y el SMSC. Por ejemplo, el Gateway de SMS también puede actuar como un proxy de SMSC. Puede haber múltiples proxies, uno detrás de otro. Esto se conoce como una cadena de proxies. Por lo general, un proxy de SMSC se comporta como un proxy transparente. Esto significa que el proxy actúa como un SMSC real y el cliente de SMS puede no estar al tanto de la presencia del proxy.

Es común que los operadores móviles prefieran suministrar el acceso a un proxy de SMSC en lugar del SMSC real. Los proxies pueden proporcionar una capa de protección adicional, balanceo de carga, filtrado, control de acceso, etc.

En este artículo, el proxy de SMSC es una app para Android. Al igual que cualquier tipo de equipo móvil, el smartphone suele tener capacidad de envío y recepción de SMS. Por lo tanto, es posible usar una app para convertir el teléfono en un proxy de SMSC. Generalmente la capacidad de un teléfono para enviar y recibir mensajes es bastante limitada. Usualmente, el dispositivo y el operador móvil limitan el ancho de banda a unos pocos SMS por minuto. Si se supera el límite, el operador puede bloquear la suscripción para que no envíe más SMS de forma temporal o permanente. Por eso, si necesita enviar miles de SMS diariamente, definitivamente necesitará usar una conexión de SMSC dedicada en lugar de un solo teléfono móvil. El proxy de SMSC descrito en este artículo sirve para ahorrar tiempo y costos en la fase de prototipo de servicios nuevos de SMS, realizar pruebas unitarias o crear soluciones de bajo tráfico. Aunque la app es gratuita, tenga en cuenta que el operador móvil puede cobrar por cada SMS. En algunos países, las tarifas de SMS pueden ser bastante altas. Se recomienda consultar las tarifas locales de SMS para evitar costos inesperados.

 

Configuración de la app «SMS Proxy»

La app se puede descargar desde Amazon. La versión SMS Proxy Lite es gratuita para cualquier propósito, incluido el uso comercial. No tiene limitaciones, anuncios o avisos de prueba.

Si el teléfono tiene Android 6.0 (Marshmallow) o más reciente, al iniciar la app por primera vez, se solicitará otorgar los permisos para enviar y ver SMS. Es necesario otorgar estos permisos para que la app pueda enviar y recibir SMS. Las versiones anteriores de Android no solicitan estos permisos de manera explícita.

La pantalla principal presenta 2 parámetros de configuración:

  • Puerto es el número de puerto TCP, en el cual el proxy aguardará la conexión SMPP entrante. Puede ser cualquier valor en el rango de 1024 a 65535. Según IANA,3 el número de puerto registrado para SMPP es 2775. En esta app, el valor por defecto es 5011.
  • Limitar el tráfico a una determinada cantidad de SMS por minuto. Este límite puede ser cualquier valor en el rango de 1 a 100. El valor por defecto es 10. De manera predeterminada, Android limita el tráfico saliente a un máximo de 30 SMS cada 30 minutos. Si necesita aumentar este límite, intente buscar en Google por sms_outgoing_check_max_count. Este límite es una característica de seguridad. Si lo aumenta, existe el riesgo de que el tráfico saliente exceda lo permitido por el operador móvil. En ese caso, la línea puede ser bloqueada. Recuerde que el operador puede cobrar por cada SMS. Por lo tanto, no intente aumentar los límites a menos que sea realmente necesario. Ni Android ni la app limitan el tráfico entrante de SMS.

Si se modifica el puerto o el límite de SMS por minuto, los nuevos valores serán tenidos en cuenta la próxima vez que se inicie el SMSC. Pulse el botón Iniciar para desplegar el SMSC.

En Android 6.0 (Marshmallow) o posterior, existe una función de ahorro de batería que restringe las conexiones de red después de unos minutos de inactividad, si el cargador está desconectado. La app desplegará un mensaje de advertencia acerca de esta función cuando el SMSC se inicie por primera vez. Para evitar que el SMSC se desconecte después de unos minutos, puede mantener el cargador conectado o deshabilitar la optimización de batería para la app SMS Proxy. Esto último se puede realizar presionando el botón Ajustes para desplegar el listado de apps y el estado de optimización de batería correspondiente. Inicialmente la lista desplegará solo las apps sin optimización de batería. Puede ajustar el filtro para listar todas las apps. Después de eso, podrá encontrar en el listado la app SMS Proxy y deshabilitar la optimización de batería para dicha app. De esta manera podrá evitar desconexiones inesperadas. La app SMS Proxy está diseñada para ahorrar batería, incluso cuando la optimización de batería de Android está desactivada.

Si WiFi está activa, el proxy utilizará la dirección IP del adaptador WiFi. En la parte inferior de la pantalla podrá ver un mensaje indicando que el SMSC espera conexión en X.X.X.X:YYYY, donde X.X.X.X es la IP (normalmente 192.168.X.X) y YYYY es el número de puerto configurado más arriba.

Si WiFi no está activa, la dirección IP no se mostrará. En este caso, es posible conectar el cliente SMS a través de USB, configurando ADB con redirección de puertos, por ejemplo:

adb forward tcp:5011 tcp:5011

Mientras el túnel ADB esté activo, se podrá conectar con el proxy en 127.0.0.1:5011, a menos que haya cambiado el número de puerto.

Tome nota de la IP y el número de puerto. Estos valores se configurarán en el Gateway Kannel para establecer la conexión SMPP. Mantenga la app SMS Proxy ejecutándose en primer plano para evitar desconexiones.

 

Configuración del Gateway «Kannel»

Kannel se utiliza principalmente en Linux. Los instaladores están disponibles para muchas distribuciones populares de Linux. Por lo general, instalar Kannel en Linux requiere un solo clic o unos pocos comandos de consola. También es posible hacerlo funcionar en Windows y otros sistemas operativos. Si tiene una buena razón para no usar Linux, aunque no se me ocurre alguna, existen varios tutoriales que explican cómo ejecutar Kannel con Cygwin para Windows. En este artículo no usaremos ninguna herramienta externa, pero en cualquier proyecto de SMS de la vida real es necesario implementar scripts y servicios web para personalizar y automatizar la operación de Kannel. Linux y otros sistemas operativos Unix tienen todas las herramientas necesarias para esto. Esta es una de las razones por las que la mayoría de los proyectos de gran escala que utilizan Kannel se implementan en Linux.

Para los novatos y los usuarios que no disponen de mucho tiempo libre para instalar Linux, existen sitios que permiten descargar imágenes preconfiguradas de Linux para máquinas virtuales como VMware o VirtualBox. Varios sitios web ofrecen imágenes para máquinas virtuales listas para usar de forma gratuita, por ejemplo: OSboxes. Cuando utilice una máquina virtual para ejecutar Linux, asegúrese de configurar los adaptadores de red en modo puente para permitir la conectividad entre Linux y el teléfono Android.

Mi servidor de pruebas es CentOS 7 para x64. Por lo tanto, descargué este instalador de Kannel preparado por Roman Dmitriev: kannel-1.4.4-1cnt7.x86_64.rpm. El RPM descargado se puede instalar directamente, por ejemplo:

wget 'ftp://***/kannel-NNN.rpm'
sudo rpm -ivh kannel-NNN.rpm

Nota: En el ejemplo anterior, simplemente reemplace *** y NNN por la URL y el nombre del instalador apropiados, según la distribución de Linux y la CPU.

Antes de iniciar Kannel, editemos su archivo de configuración principal. La ubicación predeterminada es /etc/kannel.conf:

group = core
admin-interface = 127.0.0.1
admin-port = 13000
admin-password = modificar
smsbox-interface = 127.0.0.1
smsbox-port = 13001
sms-resend-retry = 1
access-log = /var/log/kannel/access.log
log-file = /var/log/kannel/kannel.log
log-level = 1

group = smsbox
bearerbox-host = 127.0.0.1
sendsms-interface = 127.0.0.1
sendsms-port = 13013
global-sender = 123

group = sendsms-user
username = ""
password = ""
default-smsc = celersms

# Esta es la conexion con la app SMS Proxy
# 192.168.X.X es la IP del adaptador WiFi del smartphone
group = smsc
smsc-id = celersms
smsc = smpp
host = 192.168.20.22
port = 5011
transceiver-mode = 1
smsc-username = ""
smsc-password = ""
system-type = ""
log-file = /var/log/kannel/smpp.log

# Captura palabras clave SI y NO (mayusculas o minusculas)
group = sms-service
keyword-regex = ^(?i)(si|no)$
catch-all = 1
text = Mensaje recibido (%t)
max-messages = 1

# Descarta todos los demas SMS
group = sms-service
keyword = default
text = N/A
max-messages = 0

En la sección core configuramos la interfaz de administración. Esto es obligatorio, incluso si no vamos a enviar ningún comando administrativo. Por razones de seguridad, se recomienda evitar desplegar los puertos de Kannel en las interfaces de red públicas, a menos que sea necesario. En este ejemplo, desplegamos todos los puertos en la interfaz local 127.0.0.1 para restringir el acceso remoto. Si necesita permitir el acceso remoto, asegúrese de habilitar SSL y configurar contraseñas seguras para minimizar los riesgos de seguridad.

Nuestro Gateway Kannel abrirá los siguientes tres puertos:

  • 127.0.0.1:13000 es la interfaz de administración obligatoria
  • 127.0.0.1:13001 es el servicio de SMS box
  • 127.0.0.1:13013 es el puerto de sendsms (sirve para enviar SMS)

Si alguno de estos puertos ya está en uso, puede cambiarlo. Tome nota del puerto sendsms, ya que este puerto se utilizará para enviar los mensajes SMS de prueba.

Nótese que tenemos configurados dos servicios de SMS. El primero usa una expresión regular para capturar todos los mensajes con las palabras clave “SI” y “NO” (sin distinción entre mayúsculas y minúsculas) y responde con la fecha y hora cuando se recibió el mensaje. Como tal, este es nuestro servicio de respuesta automática. El segundo servicio captura todos los demás SMS y los descarta. Es necesario configurar un servicio predeterminado para ignorar los SMS no deseados, ya que de lo contrario Kannel responderá con un mensaje de error.

Todos los logs se escriben en /var/log/kannel:

  • kannel.log es el log principal que escribe el Gateway Kannel. Este es el primer log a revisar si el Gateway no inicia correctamente.
  • access.log registra la actividad de SMS. Si necesita obtener el listado de usuarios que enviaron cierta palabra clave durante un período de tiempo específico, el log de acceso contiene esta información.
  • smpp.log contiene las trazas del protocolo SMPP. Si se produce un error de conexión hacia la app de SMS Proxy, este log puede revelar mayor detalle acerca del problema.

 

Enviar y recibir SMS

Intentemos iniciar el Gateway. Esto se puede hacer por medio del comando service:

sudo service kannel start

Revise el contenido de kannel.log para ver si existe algún error. Si el Gateway se inició correctamente, revise smpp.log para ver si la conexión con la app SMS Proxy se estableció correctamente. Esto también se puede ver en la interfaz de usuario de la app. Si la conexión no es exitosa, verifique que la app se esté ejecutando en primer plano, no esté bloqueada por políticas de ahorro de batería, la IP y el puerto estén configurados correctamente y la conectividad no esté bloqueada por un firewall.

Si todo está bien, intentemos enviar un SMS de prueba (reemplace 1234567 con el número destino apropiado):

wget 'http://127.0.0.1:13013/cgi-bin/sendsms?username=&password=&to=1234567&text=Hola'

Generalmente es posible enviar el SMS a uno mismo, especificando el número de teléfono propio como número de destino. Esto puede ser útil si no se dispone de otra línea para hacer pruebas. En este ejemplo, no estamos especificando un nombre de usuario y contraseña para enviar el SMS porque configuramos un nombre de usuario vacío en kannel.conf. Omitir la autenticación de usuario, como hacemos en este ejemplo, no es recomendable para los servicios productivos.

Intentemos enviar un SMS con formato Unicode con algún emoji. Nótese que agregamos el parámetro coding=2 para activar la codificación Unicode:

wget 'http://127.0.0.1:13013/cgi-bin/sendsms?username=&password=&to=1234567&coding=2&text=%D8%3D%DE%00'

El valor correspondiente en hexadecimal para diferentes emoticonos y emoji se puede encontrar en esta tabla (consulte la columna UTF16). Para mayor información acerca de la codificación de SMS con emoticonos y emoji puede consultar este artículo.

Si el envío de SMS funciona correctamente, lo siguiente que podemos probar es el servicio de respuesta automática. Este servicio producirá una respuesta cuando el SMS entrante tenga la palabra clave “SI” o “NO”. Un caso de uso más realista invocaría una URL de un servicio web para procesar los SMS que coincidan con el filtro que se tiene configurado. Por ejemplo:

group = sms-service
keyword-regex = ^(?i)(si|no)$
catch-all = 1
get-url = "http://127.0.0.1:13013/cgi-bin/sendsms?username=&password=&to=%p&text=Mensaje+recibido+(%t)"
max-messages = 0

La configuración anterior utiliza la API de sendsms para enviar la respuesta. El resultado será el mismo que antes. Sin embargo, en este caso puede configurar su propio servicio web para procesar estos mensajes e implementar escenarios más complejos y personalizados. Tenga en cuenta que en este caso max-messages se deja en cero para evitar que se produzcan dos respuestas.

Kannel soporta muchas funcionalidades avanzadas y diferentes tipos de mensajes. Todos estos casos de uso están cubiertos en la documentación oficial. Además, la app SMS Proxy Pro se puede utilizar para enviar SMS binarios, si el dispositivo Android es compatible con esta función. Los SMS binarios se pueden usar para realizar configuración remota de dispositivos, enviar contenido interactivo, rastrear la ubicación del móvil y mucho más.

 

Referencias

  1. «Technical realization of the Short Message Service (Release 16)» (en inglés), ETSI (2020)
  2. «Short Message Peer-to-Peer Protocol Specification Version 5.0» (en inglés), SMS Forum (2003)
  3. «Service Name and Transport Protocol Port Number Registry» (en inglés), Internet Assigned Numbers Authority