Dial(${PJSIP_DIAL_CONTACTS(Alice)} & ${PJSIP_DIAL_CONTACTS(Bob)}) How Not To Fail If One Endpoint Has No Registered AOR?

Home » Asterisk Users » Dial(${PJSIP_DIAL_CONTACTS(Alice)} & ${PJSIP_DIAL_CONTACTS(Bob)}) How Not To Fail If One Endpoint Has No Registered AOR?
Asterisk Users 3 Comments

Dear List

It’s probably been more than a year now I switched from chan_sip to pjsip. pjsip works much cleaner than chan_sip.

But!

I have come across a Problem I was not able to solve with Asterisk Dialplan Logic.

With pjsip an endpoint can have multiple AOR, so you need to expand them with ${PJSIP_DIAL_CONTACTS()} to be able to Dial() all of them simultaneously.

But there are also situation where you need to Dial() not only one endpoint, but multiple ones, even mixing technologies like IAX and SIP.

You can specify those multiple endpoints with the & separator in the Dial() function.

Unfortunately if an pjsip endpoint has NO registered AORs,
${PJSIP_DIAL_CONTACTS()} returns an empty sting.

So consider:

same => n,Dial(IAX2/guest@pbx.digium.com/s@default &
${PJSIP_DIAL_CONTACTS(Guest)})

If there is no Guest registered, the resulting string to dial passed to Dial() is: “IAX2/guest@pbx.digium.com/s@default &” which Dial complains is not valid, because of a missing second line to dial after the &.

Well, I could try to expand all the PJSIP Endpoints in a perl AGI
script and then compose a variable to contain a valid string for Dial(), but I would prefer to do this with Asterisk Logic.

(Yes, with only two endpoints this can somehow be done with Set(if and compare for empty string), but the more endpoints to ring the more complicated it is getting.

Anyone having figured an ‘easy’ way to do this? Or is there even an alternative to ${PJSIP_DIAL_CONTACTS(Guest)} which would Dial all AOR, and still work if no AOR is present?

Sidenote:

Set Variable IF(string emptry) constructions also return en empty sting if the condition does NOT match, is there a reversed way to do it?
IF(string empty) SET variable= ?

-Benoît-

3 thoughts on - Dial(${PJSIP_DIAL_CONTACTS(Alice)} & ${PJSIP_DIAL_CONTACTS(Bob)}) How Not To Fail If One Endpoint Has No Registered AOR?

  • Le 09/06/2019 à 13:19, Benoit Panizzon a écrit :

    Hello

    What about to put eveything in a variable and the remove the last character if it equal &

    Something like

    same =
    n,Set(toDial=IAX2/guest@pbx.digium.com/s@default&${PJSIP_DIAL_CONTACTS(Guest)})
    same = n,ExecIf($[“${toDial:-1}”==”&”]?Set(toDial=${toDial:0:-1}))
    same = n,Dial(${toDial})

    […]

    Daniel

  • Yes, I considered this…

    What if you dial three endpoints and the middle one (or last one) is empty? You would also need to remove the first & and any double &
    within that string. Is it faisable with asterisk logic?

    -Benoît-

  • Le 10/06/2019 à 10:53, Benoit Panizzon a écrit :

    When I’m in your case I add *not empty* EP one by one adding & after each. At the end, my variable is empty or finish with &. I then have to remove this last character and start dial.


    Daniel