PDA

Voir la version complète : Obtenir la durée de sonnerie d'un appel sortant



sebclick49
14/08/2015, 10h34
Bonjour,

Je développe des SVI (IVR) sur un Asterisk 13 en AGI.
Les SVI sont développés en Python et l'AGI est lancé comme suit dans le extension.conf :


exten => _XXXXXXXXXX,1,AGI(agi://xx.xx.xx.xx/)


Sur un nouveau SVI, j'ai besoin de créer un appel sortant et de bridger l'appel entrant et l'appel sortant pour que les 2 personnes puissent discuter ensemble.
Cela se fait très bien avec la commande DIAL

Actuellement, je récupère la variable DIALSTATUS qui m'indique l'état de l'appel : BUSY, ANSWER, ...


EXEC Dial SIP/mynumber@yyy,50
GET VARIABLE "DIALSTATUS"

Mais j'aimerais également récupérer la durée de sonnerie et la durée de communication une fois l'appel bridgé.
Selon la doc, cela est possible en récupérant la variable DIALEDTIME. Cf https://wiki.asterisk.org/wiki/display/AST/Asterisk+13+Application_Dial

J'ai donc le résultat ci-dessous mais la variable DIALEDTIME ne contient pas l'info escomptée.
Au lieu d'avoir la durée de sonnerie pour l'appel sortant, j'ai la durée complète de l'appel entrant.

EXEC Dial SIP/mynumber@yyy,50
GET VARIABLE "DIALEDTIME"
GET VARIABLE "DIALSTATUS"

J'ai fait le test sur un Asterisk 11 et cela semblait fonctionner.

Avez-vous une idée de ce qui pourrait bloquer ?
Avez-vous une autre façon de faire et est t-il possible d'échanger des variables entre 2 appels bridgés ?

Merci d'avance,

sebclick49
18/08/2015, 10h47
Je complète mon analyse :

Sur Asterisk 13, j'utilise le dialplan suivant pour tester :


exten => _017013xxxx,1,Answer()
exten => _017013xxxx,n,wait(5)
exten => _017013xxxx,n,Dial(SIP/027273xxxx@CBV2-BCT1,20,gH)
exten => _017013xxxx,n,NoOp(DIALSTATUS is ${DIALSTATUS}, ANSWEREDTIME is ${ANSWEREDTIME}, DIALEDTIME is ${DIALEDTIME})

Et cela me donne le résultat suivant dans la console Asterisk :


-- Executing [017013xxxx@public:1] Answer("SIP/CBV2-BCT1-0000002b", "") in new stack
-- Executing [017013xxxx@public:2] Wait("SIP/CBV2-BCT1-0000002b", "5") in new stack
-- Executing [017013xxxx@public:3] Dial("SIP/CBV2-BCT1-0000002b", "SIP/027273xxxx@CBV2-BCT1,20,gH") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/027273xxxx@CBV2-BCT1
-- SIP/CBV2-BCT1-0000002c is ringing
-- SIP/CBV2-BCT1-0000002c is making progress passing it to SIP/CBV2-BCT1-0000002b
-- SIP/CBV2-BCT1-0000002c answered SIP/CBV2-BCT1-0000002b
-- Channel SIP/CBV2-BCT1-0000002b joined 'simple_bridge' basic-bridge <f79aafa2-149a-49d0-b13b-1c3dee8c5db0>
-- Channel SIP/CBV2-BCT1-0000002c joined 'simple_bridge' basic-bridge <f79aafa2-149a-49d0-b13b-1c3dee8c5db0>
-- Channel SIP/CBV2-BCT1-0000002c left 'simple_bridge' basic-bridge <f79aafa2-149a-49d0-b13b-1c3dee8c5db0>
-- Channel SIP/CBV2-BCT1-0000002b left 'simple_bridge' basic-bridge <f79aafa2-149a-49d0-b13b-1c3dee8c5db0>
-- Executing [017013xxxx@public:4] NoOp("SIP/CBV2-BCT1-0000002b", "DIALSTATUS is ANSWER, ANSWEREDTIME is 19, DIALEDTIME is 19") in new stack

La variable DIALSTATUS récupère bien que l'appel a été décroché (j'ai BUSY si le poste sonne occupé) mais par contre les variables ANSWEREDTIME et DIALEDTIME ne contiennent pas les informations concernant l'appel sortant mais ceux de l'appel en cours.

Or, sur Asterisk 11 avec le même dialplan, les variables DIALSTATUS et ANSWEREDTIME ont les bonnes valeurs.
ANSWEREDTIME est à 2 ce qui est la durée effective de bridge des 2 appels. A partir de là, je peux récupérer la durée de sonnerie si je calcule la durée de la commande dial.



-- Executing [testdial@public:5] NoOp("SIP/localhost-00000046", "testdial -> DIALSTATUS is ANSWER, ANSWEREDTIME is 2, DIALEDTIME is 20") in new stack

Il y a peut être eu des modifications entre les versions 11 et 13, mais je n'ai rien trouvé de tel dans les changelog.
Ou alors c'est un bug Asterisk, mais ce serait étrange.
Qu'en pensez-vous ?

Reaper
20/08/2015, 22h46
A mon avis un bug, ouvre le sur bugtracker.

sebclick49
21/08/2015, 09h23
Bonjour Reaper,

J'ai en effet ouvert un bug sur le Jira Asterisk : https://issues.asterisk.org/jira/browse/ASTERISK-25328
Mais d'après les premiers retours, il ne s'agirait pas d'un bug.
Pour eux, l'information est correcte mais il ne faut pas décrocher l'appel entrant avant de faire la commande Dial.
Et en effet, avec la configuration suivante, la valeur de ANSWEREDTIME est valable.



exten => _017013xxxx,1,wait(5)
exten => _017013xxxx,n,Dial(SIP/027273xxxx@CBV2-BCT1,20,gH)
exten => _017013xxxx,n,NoOp(DIALSTATUS is ${DIALSTATUS}, ANSWEREDTIME is ${ANSWEREDTIME}, DIALEDTIME is ${DIALEDTIME})

Problème, j'ai besoin de décrocher l'appel car j'ai un SVI avec un sommaire et des choix en amont.
J'ai trouvé d'autres personnes ayant eu la même problématique :

https://issues.asterisk.org/jira/browse/ASTERISK-24439
https://issues.asterisk.org/jira/browse/ASTERISK-24943


Mais à ce jour, il n'y a pas de solution simple.
Farzan explique sur le forum (http://forums.asterisk.org/viewtopic.php?f=1&t=91596&sid=6dc3fe4b7e16f65edc07c0e331e04956) qu'il a utilisé les locals channels pour résoudre son problème. Du coup, je suis en train d'étudier cette partie.

Reaper
21/08/2015, 18h18
Ah je vois, j'ai cru que c'est pour les appels sortants, effectivement su tu décroche immédiatement le temps de sonnerie est à 0 c'est normal. Enregistrer la variable avant la sonnerie vers extension et timestamp du décroché de l'extension et faire la différence doit te permettre récupérer cette info.

sebclick49
25/08/2015, 10h01
En fait je veux dans mon appel entrant récupérer la durée de l'appel sortant (durée de com' et durée de sonnerie idéalement).

J'ai suivi les conseils de Farzan qui avait eu la même problématique que moi et j'ai donc utilisé des "local channels".

En gros, je fais un premier dial que j'envoi en local après avoir setter une variable Asterisk :


SET VARIABLE __PARENTCHANNEL "mychannel"
EXEC Dial Local/0272xxxxxx@appelsortant/n,20,gH


J'ai ensuite configuré dans mon extension.conf ceci :



[appelsortant]
exten => _XXXXXXXXXX,1,Dial(SIP/${EXTEN}@CBV2,20,H)
exten => h,1,NoOp(h -> DIALSTATUS is ${DIALSTATUS}, ANSWEREDTIME is ${ANSWEREDTIME}, DIALEDTIME is ${DIALEDTIME})
exten => h,n,Set(SHARED(MY_ANSWEREDTIME,${PARENTCHANNEL})=$ {ANSWEREDTIME})
exten => h,n,Set(SHARED(MY_DIALEDTIME,${PARENTCHANNEL})=${D IALEDTIME})


Une fois l'appel sortant terminé, je peux alors récupérer les infos du temps de sonnerie et du temps de communication.