Asterisk y 3PCC, vía SIP Notify (Hold, Talk)
Buenas,
Hacía tiempo que no escribíamos, como siempre se suele decir, no es que hayamos estado parados, de hecho, todo lo contrario …
En esta ocasión os presentamos un parche propio de la casa para permitir cierto control de la llamada desde el AMI, para canales SIP y terminales que lo soporten.

Antes, un poco de historia/background info:
Los que soléis/solemos trabajar con el AMI somos muchas veces muy entusiastas (“se puede hacer todo vía AMI”), en la práctica, desde AMI muchas veces se comprueba/monitoriza como está todo, se añaden miembros a colas, se ejecutan reloads, etc . Pero sobre el control en si de la llamada estamos un poco limitados: Podemos colgar una llamada, podemos transferirla (Redirect, Atxfer, Bridge) pero no podemos ni responderla ni ponerla en espera de forma limpia.
Para el primer caso: “Responder una llamada”, parece lógico que no se pueda hacer, si una llamada está timbrando en un SIP UA, no existe mecanismo “oficioso” para forzarle a contestar, como muchas veces dice Olle Johansson en SIP el UA “is the King”, salvo cabeceras de auto-answer y tal (pero claro, ya hemos lanzado el INVITE). Para el segundo caso (poner en hold), si que se podría gestionar algo con INVITEs lanzados desde el UAS (Asterisk) sendonly/recvonly y tal. Pero tampoco es un escenario fácil.
Siguiendo con este hilo, la gente de Broadsoft tiene una propuesta de especificación 3PCC (Third Party Call Control) basada en NOTIFY’s en el diálogo, con Event: Hold y Event: Talk. Esta especificación parece que ha sido discutida por la comunidad (Ejemplo: Lista IETF SIP Implementors(comentarios no muy positivos al respecto) y también implementada, al menos por ciertos fabricantes como SNOM, Yealink y seguramente varios mas.
Sin querer entrar en el debate si es la mejor forma de hacer las cosas, a nivel de gestión y estándares por un lado y a nivel técnico por otro, nos limitamos a comentar lo que hemos implementado:
Al igual que muchos otros NOTIFY’s soportados por terminales (Check-SYNC para volverse a provisionar, reboot y compañía) parece claro que sería algo tan sencillo como añadirlo en sip_notify.conf y enviar desde el CLI o AMI “sip notify XXXXX hold” por ejemplo. Sin embargo, esa opción no es posible, ya que esos NOTIFYs que se envían son totalmente fuera del diálogo, de hecho, son un diálogo completamente nuevo (From,To,Call-ID).
Dicho esto, lo que hemos hecho es un pequeño parche que permite enviar dichos NOTIFYs sobre un diálogo en curso, respetando el flujo normal (o al menos, el esperado) de acontecimientos (CSEQ, entre otros). Lo interesante de este mecanismo es que realmente es poco agresivo, ya que cuando lo reciba, el terminal es quien envía el INVITE para poner en hold, el servidor le responde y tal, vamos, que es exactamente igual que si el usuario físicamente pulsa la tecla de Hold, con lo que no hay que tener tracking de estados ni nada similar.
En entornos tipo Callcenter, cuando no se dispone de softphone (por la razón X que sea), es un mecanismo bastante interesante, ya que es mas o menos sencillo implementar un interfaz totalmente independiente del terminal, donde el agente pueda contestar o retener la llamada, sin tener que tenerle todo el rato en línea, o desconectar/reconectar canales y las temidas consecuencias en los CDR’s y los parsers de turno de cada uno.
Nada más, lo tenéis desgargable aquí (SIPNotifyChan_AMI_Event.patch) (Patch de Kaian), añade código nuevo, así que debería aplicarse bien en cualquier 1.8.x reciente.
Para probarlo, una vez aplicado:
telnet localhost 5038
Action: Login
Username: miuser
Secret: mipass
Action: SIPnotifychan
Channel: SIP/XXXXXX
Event: hold
Action: SIPnotifychan
Channel: SIP/XXXXXX
Event: talk
El evento hold retiene una llamada activa, el evento talk la recupera pero también vale para responder una entrante. Comprobado que funciona bien con terminales Yealink T20P,T26P y T28P (no hemos comprobado más), si alguno se anima, bienvenido sea.
Lo hemos probado de forma preliminar y no parece que se rompa nada, pero como siempre, si lo utilizáis, probadlo bien y tal.









En una palabra (en inglés): awesome! Creo que no podía haber estado mejor. Me lo he pasado en grande y he tenido la ocasión de conocer a gente muy interesante y de poder intercambiar experiencias con otros tantos AstriFrikis.
