Affichage des résultats 1 à 6 sur 6

Discussion: Obtenir la durée de sonnerie d'un appel sortant

  1. #1
    Membre Junior
    Date d'inscription
    août 2015
    Messages
    4
    Downloads
    0
    Uploads
    0

    Question Obtenir la durée de sonnerie d'un appel sortant

    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 :

    Code:
    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, ...

    Code:
    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/displ...plication_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.
    Code:
    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,

  2. #2
    Membre Junior
    Date d'inscription
    août 2015
    Messages
    4
    Downloads
    0
    Uploads
    0
    Je complète mon analyse :

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

    Code:
    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 :

    Code:
        -- 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.

    Code:
        -- 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 ?

  3. #3
    Membre Association
    Date d'inscription
    septembre 2010
    Messages
    1 236
    Downloads
    0
    Uploads
    0
    A mon avis un bug, ouvre le sur bugtracker.

  4. #4
    Membre Junior
    Date d'inscription
    août 2015
    Messages
    4
    Downloads
    0
    Uploads
    0
    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.

    Code:
    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 :


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

  5. #5
    Membre Association
    Date d'inscription
    septembre 2010
    Messages
    1 236
    Downloads
    0
    Uploads
    0
    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.

  6. #6
    Membre Junior
    Date d'inscription
    août 2015
    Messages
    4
    Downloads
    0
    Uploads
    0
    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 :
    Code:
    SET VARIABLE __PARENTCHANNEL "mychannel"
    EXEC Dial Local/0272xxxxxx@appelsortant/n,20,gH
    J'ai ensuite configuré dans mon extension.conf ceci :

    Code:
    [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})=${DIALEDTIME})
    Une fois l'appel sortant terminé, je peux alors récupérer les infos du temps de sonnerie et du temps de communication.

Les tags pour cette discussion

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •