Getting Real Sip Status After Dial

Home » Asterisk Users » Getting Real Sip Status After Dial
Asterisk Users 7 Comments

Hi,

Is there any way I can get exact sip status from pjsip after a dial ?
or all we can get is asterisk hangup causes ?

Thanks in advance.

KKh

7 thoughts on - Getting Real Sip Status After Dial

  • It seems very weird to me that we cannot access sip code of a call from pjsip which information is actually returned from the provider, so it is available to asterisk, why does asterisk hide it ?

  • I think HANGUPCAUSE is channel agnostic.

    See: core show function HANGUPCAUSE

    Some thing like this IIRC:
    Set(my_cause=${HANGUPCAUSE(${CHANNEL(name)},tech)})

    Remember the incoming leg of the call and the outgoing leg of the call are different channels. Make sure you are giving HANGUPCAUSE the correct channel.


    http://help.nyigc.net/

  • Thanks for your response Eric,

    Here is some testing code, as you can see ${HANGUPCAUSE(${ARG1},tech)}
    is empty if number is not found (HANGUPCAUSE=1) or if sip request times-out (HANGUPCAUSE=0) (a dead far end for example) so I had to check value HANGUPCAUSE and filter out zero and one before moving on. where all I need is simply the sip code returned from the server that even softphones are able to give me.

    [autodial_out]
    exten => _X.,1,NoOP( testing manager dial out )
    same => n,Dial(PJSIP/${EXTEN}@${TRUNK},25,b(autodial_out^setup_hup_handler^1)g)
    same => n,Hangup()

    exten => setup_hup_handler,1,Set(CHANNEL(hangup_handler_push)=hdlr1,s,1(${CHANNEL}))
    same => n,Return()

    [hdlr1]
    exten => s,1,NoOp(START==============================================================================)
    same => n,Set(HANGUPCAUSE_STRING=${HANGUPCAUSE_KEYS()})
    same => n,Set(ASTcause=${HANGUPCAUSE})
    same => n,Set(GO=Found)
    same => n,GotoIf($[${ASTcause}=0]?NotFound0:Check2)
    same => n(Check2),GotoIf($[${ASTcause}=1]?NotFound1:Found)
    same => n(Found),Set(SIPcause=${HANGUPCAUSE(${ARG1},tech)})
    same => n,Goto(End)
    same => n(NotFound0),Set(SIPcause=SIP 500 Server Internal Error)
    same => n,Goto(End)
    same => n(NotFound1),Set(SIPcause=SIP 404 Not Found)
    same => n,Goto(End)
    same => n(End),Set(============================ ${SIPcause} /
    ${ASTcause} =======================END)
    same => n,Return()

  • I think HANGUPCAUSE is channel agnostic.

    See: core show function HANGUPCAUSE

    Some thing like this IIRC:
    Set(my_cause=${HANGUPCAUSE(${CHANNEL(name)},tech)})

    Remember the incoming leg of the call and the outgoing leg of the call are different channels. Make sure you are giving HANGUPCAUSE the correct channel.


    http://help.nyigc.net/

  • My actual dialplan hangupcause handling is in AGI and AEL, so the dialplan below has not been tested.

    Don’t use HANGUPCAUSE_KEYS, the order of the channels varies. Save the channel name while the dialplan is in the predial handler like below. MASTER_CHANNEL is used to avoid silly issues with the scope of the out_chan variable.

    [test]
    exten => _X.,1,Set(CHANNEL(hangup_handler_push)=caller_hangup,s,1)
    same => n,Dial(SIP/my-peer/12125551212,30,b(test_pre_dial^s^1))

    [test_pre_dial]
    ; while in the handler save the channel exten => _X.,1,Set(MASTER_CHANNEL(out_chan)=${CHANNEL{name})
    same => n,Return

    You should be able to use the caller hangup handler to get tech hangupcauses like “SIP 480 Temporarily Unavailable”.

    [caller_hangup]
    exten =>
    s,1,Noop(HANGUPCAUSE(${MASTER_CHANNEL(out_chan)},tech)=’${HANGUPCAUSE(${MASTER_CHANNEL(out_chan)},tech)}’)
    exten => n,Return


    http://help.nyigc.net/

  • This does not work either. getting returned sip code out of asterisk turns out to be very time consuming, even though it is something that is already available to PJSIP, I can see the information in sip logger, and asterisk forwards the sip status code to the soft-phone. but does not give access it on the dial-plan.