AMI Commands List

AMI es la interface que tiene disponible Asterisk para permitir la integración con sistemas externos.

En esta ocasión te dejo el listado completo en Asterisk 18 de comandos disponibles para interactuar con tu PBX

AbsoluteTimeout Set absolute timeout.
AGI Add an AGI command to execute by
AOCMessage Generate an Advice of Charge mess
Atxfer Attended transfer.
BlindTransfer Blind transfer channel(s) to the
Bridge Bridge two channels already in th
BridgeDestroy Destroy a bridge.
BridgeInfo Get information about a bridge.
BridgeKick Kick a channel from a bridge.
BridgeList Get a list of bridges in the syst
BridgeTechnologyList List available bridging technolog
BridgeTechnologySuspend Suspend a bridging technology.
BridgeTechnologyUnsuspend Unsuspend a bridging technology.
CancelAtxfer Cancel an attended transfer.
Challenge Generate Challenge for MD5 Auth.
ChangeMonitor Change monitoring filename of a c
Command Execute Asterisk CLI Command.
ConfbridgeKick Kick a Confbridge user.
ConfbridgeList List participants in a conference
ConfbridgeListRooms List active conferences.
ConfbridgeLock Lock a Confbridge conference.
ConfbridgeMute Mute a Confbridge user.
ConfbridgeSetSingleVideoSrc Set a conference user as the sing
ConfbridgeStartRecord Start recording a Confbridge conf
ConfbridgeStopRecord Stop recording a Confbridge confe
ConfbridgeUnlock Unlock a Confbridge conference.
ConfbridgeUnmute Unmute a Confbridge user.
ControlPlayback Control the playback of a file be
CoreSettings Show PBX core settings (version e
CoreShowChannels List currently active channels.
CoreStatus Show PBX core status variables.
CreateConfig Creates an empty file in the conf
DAHDIDialOffhook Dial over DAHDI channel while off
DAHDIDNDoff Toggle DAHDI channel Do Not Distu
DAHDIDNDon Toggle DAHDI channel Do Not Distu
DAHDIHangup Hangup DAHDI Channel.
DAHDIRestart Fully Restart DAHDI channels (ter
DAHDIShowChannels Show status of DAHDI channels.
DAHDITransfer Transfer DAHDI Channel.
DBDel Delete DB entry.
DBDelTree Delete DB Tree.
DBGet Get DB Entry.
DBGetTree Get DB entries, optionally at a p
DBPut Put DB entry.
DeviceStateList List the current known device sta
DialplanExtensionAdd Add an extension to the dialplan
DialplanExtensionRemove Remove an extension from the dial
Events Control Event Flow.
ExtensionState Check Extension Status.
ExtensionStateList List the current known extension
FAXSession Responds with a detailed descript
FAXSessions Lists active FAX sessions
FAXStats Responds with fax statistics
Filter Dynamically add filters for the c
G729LicenseList G.729 License List
G729LicenseStatus G.729 License Status
GetConfig Retrieve configuration.
GetConfigJSON Retrieve configuration (JSON form
Getvar Gets a channel variable or functi
Hangup Hangup channel.
IAXnetstats Show IAX Netstats.
IAXpeerlist List IAX Peers.
IAXpeers List IAX peers.
IAXregistry Show IAX registrations.
ListCategories List categories in configuration
ListCommands List available manager commands.
LocalOptimizeAway Optimize away a local channel whe
LoggerRotate Reload and rotate the Asterisk lo
Login Login Manager.
Logoff Logoff Manager.
MailboxCount Check Mailbox Message Count.
MailboxStatus Check mailbox.
MeetmeList List participants in a conference
MeetmeListRooms List active conferences.
MeetmeMute Mute a Meetme user.
MeetmeUnmute Unmute a Meetme user.
MessageSend Send an out of call message to an
MessageSendInfo
MixMonitor Record a call and mix the audio d
MixMonitorMute Mute / unMute a Mixmonitor record
ModuleCheck Check if module is loaded.
ModuleLoad Module management.
Monitor Monitor a channel.
MuteAudio Mute an audio stream.
Originate Originate a call.
Park Park a channel.
ParkedCalls List parked calls.
Parkinglots Get a list of parking lots
PauseMonitor Pause monitoring of a channel.
Ping Keepalive command.
PJSIPCallIDToChannel
PJSIPNotify Send a NOTIFY to either an endpoi
PJSIPQualify Qualify a chan_pjsip endpoint.
PJSIPRegister Register an outbound registration
PJSIPShowAors Lists PJSIP AORs.
PJSIPShowAuths Lists PJSIP Auths.
PJSIPShowContacts Lists PJSIP Contacts.
PJSIPShowEndpoint Detail listing of an endpoint and
PJSIPShowEndpoints Lists PJSIP endpoints.
PJSIPShowRegistrationInboundContactStatuses Lists ContactStatuses for PJSIP i
PJSIPShowRegistrationsInbound Lists PJSIP inbound registrations
PJSIPShowRegistrationsOutbound Lists PJSIP outbound registration
PJSIPShowResourceLists Displays settings for configured
PJSIPShowSubscriptionsInbound Lists subscriptions.
PJSIPShowSubscriptionsOutbound Lists subscriptions.
PJSIPUnregister Unregister an outbound registrati
PlayDTMF Play DTMF signal on a specific ch
PlayMF Play MF digit on a specific chann
PresenceState Check Presence State
PresenceStateList List the current known presence s
PRIDebugFileSet Set the file used for PRI debug m
PRIDebugFileUnset Disables file output for PRI debu
PRIDebugSet Set PRI debug levels for a span
PRIShowSpans Show status of PRI spans.
QueueAdd Add interface to queue.
QueueChangePriorityCaller Change priority of a caller on qu
QueueLog Adds custom entry in queue_log.
QueueMemberRingInUse Set the ringinuse value for a que
QueuePause Makes a queue member temporarily
QueuePenalty Set the penalty for a queue membe
QueueReload Reload a queue, queues, or any su
QueueRemove Remove interface from queue.
QueueReset Reset queue statistics.
QueueRule Queue Rules.
QueueStatus Show queue status.
QueueSummary Show queue summary.
QueueWithdrawCaller Request to withdraw a caller from
Redirect Redirect (transfer) a call.
Reload Send a reload event.
SendText Sends a text message to channel.
Setvar Sets a channel variable or functi
ShowDialPlan Show dialplan contexts and extens
SorceryMemoryCacheExpire Expire (remove) ALL objects from
SorceryMemoryCacheExpireObject Expire (remove) an object from a
SorceryMemoryCachePopulate Expire all objects from a memory
SorceryMemoryCacheStale Marks ALL objects in a sorcery me
SorceryMemoryCacheStaleObject Mark an object in a sorcery memor
Status List channel status.
StopMixMonitor Stop recording a call through Mix
StopMonitor Stop monitoring a channel.
UnpauseMonitor Unpause monitoring of a channel.
UpdateConfig Update basic configuration.
UserEvent Send an arbitrary event.
VoicemailRefresh Tell Asterisk to poll mailboxes f
VoicemailUsersList List All Voicemail User Informati
VoicemailUserStatus Show the status of given voicemai
WaitEvent Wait for an event to occur.

Issabel – Error 500 con Smarty

Hacía tiempo que no instalaba una PBX con Issabel desde 0. Ya estando a mediados del 2021, creí que el proceso iba a salir redondo, y no se iba a presentar ningún problema. Que pena enterarme que sigue teniendo algunos bugs.

Esta vez, luego de terminar la instalación, y actualizar paquetes (yum update), al ingresar al portar web tenía un error 500.

Por ello lo primero que debes hacer es ir a ver logs:

tail -f /var/log/httpd/ssl_error_log

Un error se repetía con cada intento de acceso que realizaba:

[Sun Jun 13 11:51:43.298260 2021] [:error] [pid 1312] [client 172.0.4.102:52760] PHP Fatal error: Uncaught –> Smarty: unable to create directory /var/www/html/var/templates_c <– \n thrown in /usr/share/php/Smarty/sysplugins/smarty_internal_runtime_writefile.php on line 51

Lo primero que debes hacer es entender el mismo:

smarty_internal_runtime_writefile.php

Es el encargado de escribir la cache en su directorio destino. Aquí te das la idea es que una cuestión de permisos

unable to create directory /var/www/html/var/templates_c

Aquí confirmamos la teoría de cúal es el directorio que no tiene permisos (o que no existe)

La solución es bastante sencilla:

  • Creamos el directorio
  • Le damos permisos
mkdir /var/www/html/var/templates_c
chmod 777 /var/www/html/var/templates_c

Con esto debería ser mas que suficiente para solucionar el problema.

No graba en las transferencias

El siguiente problema fue detectado en un Elastix 4.0 con Asterisk 11.24. No descartó que persista en Issabel, pero habría que confirmar.

El origen de la cuestión es que las grabaciones no incluía las transferencias. Para ser más claro, una llamada entrante (IN) que era dirigida hacia una cola (queue), es atendida por un coordinador. Luego este la vuelve a transferir, y en ese momento que realiza el corte (hangup), ya que alguien lo atendía del otro lado, la grabación se cortaba.

Esto puntualmente tiene que ver con una propiedad de asterisk (herencia), la cúal no estaba seteada. La forma de correguirlo es agregando la siguiente línea en el archivo: extensions_override_freepbx.conf (o extensions_override_elastix.conf)

Dependiente de tu versión deberías verificar en cúal de esos dos archivos agregar la línea

1-Haz backup de tu archivo

cp /etc/asterisk/extensions_override_freepbx.conf /etc/asterisk/extensions_override_freepbx.conf.bak

2-Busca la siguiente línea

exten => s,n(record),MixMonitor(${MIXMON_DIR}${CALLFILENAME}.${MIXMON_FORMAT},,${MIXMON_POST})

3-Agregá al final de esta (y en una nueva línea) , lo siguiente

exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)

4-Reinicia el servicio del asterisk

sudo service asterisk restart

o ingresa a la consola del asterisk y haz un reinicio por aplicación

Stopping and Restarting Asterisk From The CLI – Asterisk Project – Asterisk Project Wiki

core restart gracefully

Listo!!!

A partir de ahora, la llamada inicial, contendrá en la grabación todas las transferencias que puede haber sufrido, hasta el último corte (Tanto del cliente o del agente) que haya transcurrido.

Configurar Grandstream 410x en Argentina

En la era de troncales de SIP mediante MPLS por Fibra, quedan algunos rezagados que mantienen sus líneas análogas. Lo importante es estar conectados a la PSTN sin importar él como.

Este es el caso con el que me encontré con la necesidad de digitalizar 4 líneas del proveedor de Telefónica de Argentina, y tras indagar las ofertas de mercado que habían vigente se decidió por la compra de un gateway Grandstream GXW 410x.

Este equipo cuenta dos versiones: de 4 puertos FXO (4104) y 8 puertos (4108). Fuera de ellos son exactamente iguales.

El primer obstaculo que puedes encontrarte es que este en un Firmware desactualizado. Aquí te cuento como llevarlo a su versión mas vigente

Subsanado esta parte restaba configurarlo. Para ello la parte más difícil fue detectar la correcta frecuencia de los tonos. Existen varias configuraciones dando vueltas en la red, pero la solución más cercana fue usar la herramienta de Test (Line Analysis). Sin embargo no es del todo correcto. El tip para esta etapa consiste en subirle el volumen mediante el incremento de la ganancia. Tanto para la llamada entrante, y poder detectar el CID (número) como para detectar el corte (HangUp)

Les comparto las imágenes que hablan por si solo…

En esta configuración en particular, los números ingresan una central Asterisk 13. Para ello es que directamente se dio de alta un troncal para manejar los 4 puertos:

Espero que les sea útil…

Actualizar Grandstream GXW4104

Tocó trabajar con este Gateway para convertir 4 líneas analógicas de Telefónica de Argentina y digitalizarlas para trabajar sobre un Asterisk, con distro de Issabel 4.5

http://www.grandstream.com/products/gateways-and-atas/voip-gateways/product/gxw4104/4108

La primer dificultad es tener el GXW con la última versión del firmware. Para ello debes tener las diferentes versiones para irlo actualizando de forma gradual.

La recomendación es que hagas un reset factory, para borrar la cache, y luego comenzar con la actualización, sino puedes recibir el siguiente error:

ERROR Failed to write firmware /hm/gxw410x/1_0_1_10/load64b.bin to Flash: Data MD5 fail(4105)

Luego puedes comenzar con la actualización cambiando el URL de Firmware.

A continuación te dejo un server privado de Grandstream en donde podremos obtener las versiones ya descontinuadas.

http://173.254.235.113/hm/gxw410x

– 1.0.1.25

http://173.254.235.113/hm/gxw410x/1_0_1_25/

– 1.3.4.9

http://173.254.235.113/hm/gxw410x/1_3_4_9/GXW410x_R_1_3_4_9/

– 1.4.1.4

http://173.254.235.113/hm/gxw410x/1_4_1_4/

– 1.4.1.5

http://firmware.grandstream.com

Cualquier duda deja tus comentarios. Ya hoy tenemos este esquema funcionando!!!

Renovar certificado de Elastix o Issabel

La aparición de asterisk como alternativa a las centrales telefónicas pagas motivo la creación de diferentes aplicaciones que tomaran como base este servicio, y facilitarán su administración mediante interfaces web. Este es el caso de AsteriskNow, hoy FreePBX (https://www.freepbx.org/). Continuando con esta idea hubo empresas que aprovecharon esta idea, y crearon una aplicación que trabajara sobre el esquema anterior. Así fue que Palos Santos Solutions de la mano de Edgar Landivar fundaron Elastix.

Hoy Elastix ya desaparecido del mercado, y con la lenta continuación del proyecto a través de Issabel (https://www.issabel.org/) es que seguimos usando ambas distro de esta PBX. Lo que resulta muy común que luego de varios años de tener nuestras plantas en producción ya tendremos nuestros certificados SSL vencidos, y recibimos el molesto mensaje de advertencia por parte de nuestros navegadores.

Estos son los simples pasos para generar un nuevo certificado SSL para nuestra PBX con Elastix o Issabel

Crear un nuevo certificado

Lo primero que haremos es generar nuestro nueva key. En este punto nos solicitará un password.

openssl genrsa -des3 -out server.key 1024

A partir de este pediremos el certificado autoafirmado. Deberemos completar los datos de nuestra organización.

openssl req -new -key server.key -out server.csr
openssl x509 -req -days 730 -in /root/server.csr -signkey /root/server.key -out /root/server.crt

Ahora podremos reemplazar nuestra key y certificado actual. Si tienes duda de donde están puedes verificar en: /etc/httpd/conf.d/ssl.conf

(opcional) hacemos un backup de la key y el certificado actual

 cp /etc/pki/tls/private/localhost.key /etc/pki/tls/private/localhost.key.bakcp /etc/pki/tls/certs/localhost.crt /etc/pki/tls/certs/localhost.crt.bak

Reemplazamos los mismos

cp server.key /etc/pki/tls/private/localhost.key
cp server.crt /etc/pki/tls/certs/localhost.crt
Reiniciamos el servicio. En este momento nos solicitará el password que usamos antes en la key
service httpd restart

Ya está listo.

Encuesta con Asterisk

Polls Cuestionario por IVR para Asterisk

Existen diversas formas de obtener indicadores del servicio prestado. Sin embargo la mejor retroactividad es la que puede brindarte tu propio cliente. Para ello muchas veces es necesario implementar una encuesta de calidad que permite sondear diferentes aspectos del servicio brindado.

En esta oportunidad se trabajo bajo la siguiente plataforma:

  • Elastix 4
  • Asterisk 11.24

El proceso para armarla la misma consiste en:

  • Una BD MYSQL para guardar los resultados
  • Un ID de la instancia que vamos a guardar (normalmente el ID de tu CRM, o el número de llamada ,etc)
  • DialPlan para que Asterisk interprete los pasos que debe llevar el mismo.
  • Una extensión sobre la cúal recae la encuesta (IVR)
  • Tener audios grabados de las preguntas, los saludos y los mensajes de error ante ingresos erróneos.

Primero que nada vamos a entender como funciona:

  1. Primero éxito una comunicación teléfonica entre el cliente y el personal interno.
  2. Se deja al cliente en línea (hold) y el personal interno procede a llamar a la encuesta
  3. La encuesta es un IVR que atiende automáticamente y solicita el ID para almacenar las respuestas enlazadas a este último.
  4. Una vez que el IVR confirmó que recibió bien el parámetro empieza con la encuesta
  5. Segundos antes el personal interno transfiere el cliente que estaba en línea a la extensión de la encuesta que está a punto de comenzar
  6. Toda respuesta por parte del teclado del cliente es recibida y almacenada en la BD MYSQL por parte del IVR

Como es el archivo del DIALPLAN

En la primer parte se define las variables a usar y la conexión a la BD MYSQL:

;----------------------- INICIO DE PARAMETROS DE ENCUESTA
; 2099 IVR Encuesta
; Inicio
exten => 2099,1,Answer                          ; Atiendo
;exten => 2099,n,Wait(1)                                ; Espero 1 Segundo para darle tiempo al SIP
exten => 2099,n(begin),Set(TIMEOUT(digit)=3)    ; Defino parametros de tiempo
exten => 2099,n,Set(TIMEOUT(response)=3)        ; Defino Parametros de tiempo
;exten => 2099,n,Set(CHANNEL(hangup_handler_push)=hangup-sql,2099,1);  SubRutina de Guardar en Base :: cuando el cliente corta no se puede detectar, se descarta
exten => 2099,n,MYSQL(Connect connid 172.15.15.15 usuario clave base_datos) ; Me conecto a la Base de Datos

; Asignacion de Variables
exten => 2099,n,Set(MSGN=custom/ivr-n)  ; Cargo el Mensaje de Num de Expediente
exten => 2099,n,Set(MSG0=custom/ivr-0)  ; Cargo el Mensaje de Bienvenida
exten => 2099,n,Set(MSG1=custom/ivr-1)  ; Cargo la Pregunta 1
exten => 2099,n,Set(MSG2=custom/ivr-2)  ; Cargo la Pregunta 2
exten => 2099,n,Set(MSG3=custom/ivr-3)  ; Cargo la Pregunta 3
exten => 2099,n,Set(MSG4=custom/ivr-4)  ; Cargo la Pregunta 4
exten => 2099,n,Set(MSG5=custom/ivr-5)  ; Cargo la Pregunta 5
exten => 2099,n,Set(MSG6=custom/ivr-6)  ; Cargo la Pregunta 6
exten => 2099,n,Set(MSGError0=custom/ivr-error0)  ; Cargo el error 0
exten => 2099,n,Set(MSGError1=custom/ivr-error1)  ; Cargo el error 1
exten => 2099,n,Set(MSGError2=custom/ivr-error2)  ; Cargo el error 2
exten => 2099,n,Set(MSGEnd=custom/ivr-end)  ; Cargo el Fin de la Encuesta

Luego viene la parte en donde le pregunto al personal interno el ID inicial para almacenar

;-------------- PREGUNTA N de ID ---------------------------------
;Empiezo con la Pregunta del Numero de ID
exten => 2099,n(pregN),Playback(${MSGN})        ; Reproduzco la Pregunta Num de ID
exten => 2099,n,Goto(2099,pregNresp)    ; voy a esperar la respuesta

;Esperando Respuesta1
exten => 2099,n(pregNresp),Read(NUMBEREXP,,5,1)         ; Leo lo que marca el personal Interno: Num de ID
exten => 2099,n,GotoIf($["${NUMBEREXP}" = ""]?pregN); Si la respuesta es nula entonces Pregunto de Nuevo Num de Expediente
;exten => 2099,n,SayNumber(${NUMBEREXP},f)
exten => 2099,n(pregNconf),Read(NUMBER,,1,1)            ; Leo lo que marca el operador: 1 correcto, 0 correguir
exten => 2099,n,GotoIf($[${NUMBER} = 0]?pregN:intro); Si la respuesta es 0 voy a la pregunta 1

Seguido y validado lo anterior le reproduzco la bienvenida al cliente:

; -------------- INTRO -------------------------------------
; Mensaje explicando el funcionamiento de la encuesta
exten => 2099,n(intro),Playback(beep)   ; Reproduzco un Beep
exten => 2099,n,Set(PREFIJO="2019") ; Asigno un prefijo personalizado. Ej: El año
;exten => 2099,n,Set(NUMBEREXP=$[${PREFIJO}~~${NUMBEREXP}])
exten => 2099,n,Wait(3)  ; Espero 3 Segundos
exten => 2099,n,Playback(${MSG0})       ; Reproduzco la intro
exten => 2099,n,Wait(1)
exten => 2099,n,MYSQL(Query consulta0 ${connid} insert into encuestas(ID,IDCRM,Personal,Fecha1,Fecha2,Activo) values (1,${NUMBEREXP},"Mauro",NOW(),NOW(),1)) ; Inserto la$

Luego debería seguir con las “N” preguntas que pueda tener configurado. Y al final reproducir un mensaje de FIN.

Esto es una idea de cómo se puede implementar.