Recibe notificaciones push en tu móvil de llamadas hechas en Asterisk

13 Dic
pushover

Pushover está disponible para iOS y Android

Hace unos cuantos meses empecé a probar una aplicación para iOS/Android llamada Pushover que te permite crear notificaciones personalizadas de tipo push en tu móvil. El servicio es gratuito (solo debes comprar la aplicación que cuesta $4 USD) y te permite recibir hasta 7500 notificaciones al mes (suficientes creo yo). La aplicación es muy fácil de configurar: tras darte de alta solo debes registrar una aplicación (se te proporcionará un token al registrarla) y tomar nota de tu user key. Tras obtener esos datos, crea un script como el que sigue (puedes ponerlo en /sbin/push.php):

#!/usr/bin/php
<?php

// Reemplaza este valor por tu verdadero userKey de Pushover
$userKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

/**************************************************
 Reemplaza este valor con el de tu propia aplicación.
 Si no lo cambias recibirás notificaciones de parte de "Asterisk México"
 (según la cantidad de usuarios que usen este token, pueden acabarse las notificaciones
 permitidas por Pushover al mes 
***************************************************/
$appToken="ptTjW6PlKHU7lB5jOdhLN7vHlKSIei";

curl_setopt_array($ch = curl_init(), array(
  CURLOPT_URL => "https://api.pushover.net/1/messages.json",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POSTFIELDS => array(
     "token" => $appToken,
     "user" => $userKey,
     "message" => $argv[1],
   )));
curl_exec($ch);
curl_close($ch);

?>

No te olvides de hacer el script ejecutable:

chmod 755 /sbin/push.php

Con esto el script ya debe de enviarte notificaciones a tu teléfono. Puedes enviarte un mensaje de prueba para validarlo. Teclea en el CLI de Linux:

/sbin/push.php "Este es un mensaje de prueba"

Si lo ejecutas, deberas recibir una notificación como la siguiente:

Ejemplo de notificación de Pushover

Ejemplo de notificación de Pushover

Ahora toca decirle a Asterisk que nos envíe notificaciones. Vamos a ver el código necesario para 2 escenarios: Asterisk puro y Asterisk bajo FreePBX (Elastix/Trixbox)

 

Para Asterisk Puro:

Lo que necesitamos insertar es insertar una llamada a la aplicación System que invoque nuestra aplicación con los valores que necesitamos. Por ejemplo, supongamos que tenemos esta línea en nuestro plan de llamadas para hacer una marcación internacional (archivo extensions.conf):

exten => _00ZXXXX.,1,Dial(DAHDI/g0/${EXTEN})

Lo que requerimos es mandar llamar a la notificación antes de que se genere el Dial, quedando algo así:

exten => _00ZXXXX.,1,System(/sbin/push.php "Llamada de ${CALLERID(num)} hacia ${EXTEN}")
exten => _00ZXXXX.,n,Dial(DAHDI/g0/${EXTEN})

Es importante que escapemos correctamente las comillas ” “, de lo contrario solo nos llegará la primer palabra del mensaje.

Si tratamos de marcar al exterior, recibiremos una notificación como la que sigue:

Notificaciones de llamadas de Asterisk en Pushover

Notificaciones de llamadas de Asterisk en Pushover

Con esto ya quedan las notificaciones a nuestro sistema usando Asterisk puro.

Para FreePBX/Trixbox/Elastix:

Editamos el archivo de extensions_custom.conf y hacemos uso del hook que ya existe en FreePBX para no tener que modificar nuestro código:

[macro-dialout-trunk-predial-hook]
exten => s,1,System(/sbin/push.php "Llamada de ${CALLERID(num)} hacia ${OUTNUM}")

Ojo: esto enviará notificaciones por cada llamada que use troncales. Si quieren que solo se use para cierto tipo de llamadas, necesitan validar la variable ${OUTNUM} para que solo contenga los números que ustedes quieran.

 

¡Suerte!

Christian Cabrera

Soy un ingenieron en comunicaciones con especial interés en el área de voz sobre IP y tecnologías sobre información. He usado Asterisk de manera diaria desde hace más de 12 años.En el 2011 co-fundé Enlaza Comunicaciones, una empresa que se especializa en brindar servicios profesionales de consultoría sobre voz sobre IP basadas en Asterisk.

  • @melvex

    Está bien este sistema pero yo estoy utilizando Twitter. Todos los móviles tienen clientes Twitter que muestran notificaciones nada mas recibirlos, por otra parte también varios clientes que pueden enviar tuits desde CLI, con lo que la integración es muy fácil. Yo estoy usando TTYtter [http://www.floodgap.com/software/ttytter/]. Si alguien está interesado en conocer mas que me de un toque.

    • En efecto, todos los SO móviles tienen Twitter, y aunque es una alternativa, no es una herramienta que considere que haya sido inventada para este propósito.

      Twitter es muy completo y tiene muchos usos, pero el que quise darle al usarle Pushover es que fuera muy sencillo, muy ligero y que sean notificaciones que pueda notar o ignorar fácilmente sin temor a perderme. Con Twitter (al menos en mi caso), es relativamente fácil de que pueda perder las alertas de mi Asterisk entre las menciones o DMs que recibo por mis propias cuentas.

      Saludos,

  • Buen articulo Christian, hace tiempo que deseaba hacer algo para notificar las caídas de mi asterisk o dandi pero por falta de tiempo no he podido pero con eso no me tarde ni 10min. Saludos desde Acapulco!!!

    • Gracias Pedro, es bueno saber que te fue útil. En efecto, el propósito que buscaba darle es que fuera muy rápido y sencillo de implementar. Veo que logro el objetivo.

      Saludos,

  • Pingback: Pushover para notificaciones en asterisk « b.acevedo()

  • Hola Christian, oye me parece muy atractivo está aplicación lo estoy
    tratando de aplicar en Asterisk puro y ya copie tal cual pusiste en el
    archivo push.php en /sbin solo que al hacer la prueba:
    /sbin/push.php “Este es un mensaje de prueba”
    Me manda este error:
    PHP Fatal error: Call to undefined function curl_setopt_array() in /sbin/push.php on line 16

    me doy cuenta que en la línea 16 del código que pusiste está:
    CURLOPT_URL => “https://api.pushover.net/1/messages.json”,

    como después de “http:” lleva el “//” entonces “/api.pushover.net/1/messages.json”,” lo está poniendo como comentario que puedo hacer? GRACIAS

    • El problema no es el doble //, sino que no tienes instalador el módulo de CURL en PHP. Según la distribución que tengas, en Debian puedes conseguirlo con

      apt-get install php5-curl

      Si tienes otra distribución, solo tienes que conseguir el módulo necesario equivalente.

      • Tienes la razón solo que ahora me puso este error:

        PHP Notice: Undefined variable: enlazatoken in /sbin/push.php on line 20

        • Gracias, tenia un error en el codigo. Reemplaza $enlazaToken por $appToken