Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

 


Html
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.11';
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

...

Info

Smart Dialplan explains how to use Custom Applications in Wildix Dialplan to interact with external software and databases.

Updated: April 2018

Permalink: https://confluence.wildix.com/x/swBuAQ

Table of Contents

Part 1: AGI in “Custom Application”

...


${foo} → 123456789
${foO:1} → 23456789
${Foo:-4:3} → 678

Dialplan example:Image Removed


  • set(FOO=101) - sets the name of the variable as FOO and the value as 101
  • Dial(SIP/${FOO}) - dials 101

...

${CHANNEL}: The channel (the called number present in the Dialplan procedure)

Example:Screen Shot 2016-10-25 at 16.07.52.pngImage Removed



This Dialplan is assigned to user 102
NoOp function serves to display the variable value in logs:Screen Shot 2016-10-25 at 16.08.57.pngImage Removed


Conditions in Dialplan

You can use execute a conditional jump to another Dialplan procedure, based on the boolean result (true or false) of the Gotoif function.

Syntax to execute a jump: GotoIf(condition?label1:label2)

...

The condition syntax is the following one: $[expr1operatorexpr2], where

  • expr can be a variable, a value, a function, an expression (expressions can be nested)

  • operator as a rule it is relational (comparison) operator ( =, <>..); for nested expressions it’s possible to use logical operators AND, OR, NOT (explained below)

...

expr1 >= expr2 → greater than or equal


Example:  Image Removed


In this example:

...

  • condition: $[${FOO} = 1]

  • label1: users,101,1

  • label2: users,102,1


Condition practical examples and useful functions

Example 1: Check if a device is INUSE before sending a call.  

GotoIf($[ ${DEVICE_STATE(SIP/100)} == NOT_INUSE ]?context,101,1)

The function DEVICE_STATE(SIP/100) returns the state of the device, results can be:
UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING | RINGINUSE | ONHOLD

Example 2: Check if there are available users in a call group before sending a call.

GotoIf($[ ${QUEUE_MEMBER(2,ready)} == 0 ])?context,101,1)

The function QUEUE_MEMBER(2,ready) count the number of ready members of a call group which are identified by the ID 2

Example 3: check if the CALLERID(number) matches a regular expression

GotoIf($[${REGEX("^0[6-7][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$" ${CALLERID(number)})}]?noanswer,01,1)

The function REGEX("<regular expression>" <data>)returns true if the regular expression matches the data.  

In the example above we check if the caller is a French mobile phone:
Start by 0 then a 6 or 7 then followed by 8 digits => ^0[6-7][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$

...

Code Block
<?php
echo 101;
?>

...



Set(foo=${CURL(http://192.168.1.1/echo.php)})

Dial(SIP/${foo})

Add parameters in CURL url

In the following example the PHP script returns “102” if “callernum” parameter is 0612345678, else the script returns “101”.

...

Code Block
<?php
if (isset($_GET['callernum']))
{
     $callernum = $_GET['callernum'];
}
Else
{
     $callernum="UNKOWN ID";
}
if ($callernum === "0612345678") {
echo 102;
}
Else
{
echo 101;
}
?>

...



Set(foo=${CURL(http://192.168.1.1/callernum.php?callernum=${CALLERID(num)})})

...

A database request requires several steps, here is an example:



MYSQL(Connect connid 192.168.1.1 smartdialplan Wil01diX@@ smartdialplan)
MYSQL(Query resultid ${connid} SELECT ext FROM callernum WHERE callernum=${CALLERID(num)})
MYSQL(Fetch fetchid ${resultid} FOO)
MYSQL(Clear ${resultid})
MYSQL(Disconnect ${connid})

Connect: Establishing connection to the BDD
Query:  Request execution
Fetch: Reading the result
Clear: Memory cleaning
Disconnect: Disconnection from the BDD

...

Set MySQL privileges for the PBX to be able to remotely access to this database.

Image Removed

Use DTMF in call

DTMF allows interaction of machines with humans and uses the following functions: Read(), SayNumber() and SayDigits().

Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])
Writes a string of digits (terminated by # or containing a certain number of digits)

...

SayDigits(digits)
Says the digits, one by one, digits can be a variable.

SayNumber(number, gender)
Says number
gender is "f" for female voice; "m" - for male ;"c" - for neutral

Example:

Image Removed


Read(FOO,00000/smartdialplan/numcommande,3,,,10)

SayNumber(${FOO},f)

Dial(SIP/${FOO})

Implementation of Smart Dialplan: limited access to the phone based on the amount of credits purchased

...

You need to:

  • Upload PHP AGI (phpagi.sourceforge.net) to /var/www/agi/phpagi/phpagi.php

  • Upload test script to /var/www/scripts/test.php

...

Then you can use “remote script” in dialplan, example: Remote script


Microsoft SQL Integration

Create /rw2/var/www/scripts/sqllookup.php

...

Call Remote script it in Dialplan:

Image Removed


Part 3: call file directory to generate a call

...

  • Specify the call destination and the channel to use:

    • Channel: <channel>: Channel to use for the call.

    • CallerID: "name" <number> Caller ID, please note: it may not work if you do not respect the format: CallerID: "Some Name" <1234>

    • MaxRetries: <number> Number of retries before failing (not including the initial attempt, e.g. 0 = total of 1 attempt to make the call). Default is 0.

    • RetryTime: <number> Seconds between retries. Default is 300 (5 min).

    • WaitTime: <number> Seconds to wait for an answer. Default is 45.

  • If the call answers, connect it here:

    • Context: <context-name> Context in extensions.conf

    • Extension: <ext> Extension definition in extensions.conf

    • Priority: <priority> Priority of extension to start with

    • Set: Set a variable to be used in the extension logic (example: file1=/tmp/to)

    • Application: Application to run (use it instead of specifying context, extension and priority)

    • Data: The options to be passed to the application

Use Callfile in dialplan

Create a script file in /var/www/scripts dir.

This script will be executed by dialplan.

Copy a template file and move the duplicated file to /var/spool/callweaver/outgoing/

callfile.sh

Code Block
------------------------------------------------------
#! /bin/sh
cp /var/www/scripts/test.call /var/www/scripts/temp.call
mv /var/www/scripts/temp.call /var/spool/callweaver/outgoing/
------------------------------------------------------
Give permissions to execute the script.
#chmod +x /var/www/scripts/callfile.sh
Create a template file in /var/www/scripts dir.
Test.call
------------------------------------------------------
Channel: SIP/0276510950/0970720101
Application: Playback
Data: 00000/callfile/message
---------------------------------------------------------


Call a remote script in dialplan.

Image Removed



Part 4: use device comment field for customize CID  of outgoing call

...

  • Double click on a device to edit it

  • Fill out the “Comment” field and click Save




Image Removed
In users dialplan add the following Custom apps:

Set(Useragent=${SIPCHANINFO(useragent)})

...

GotoIF      "${Descript}"="Trento"       users_Trento
Goto   users_default
Image Removed




Prior to this, you should create  dialplans named like this users_${Descript} and another one -- users_default in our example -- for calls don’t match to a device with comment field.

Image Removed

Image Removed





Html
<div class="fb-like" data-href="https://confluence.wildix.com/x/swBuAQ" data-layout="button_count" data-action="recommend" data-size="large" data-show-faces="true" data-share="true"></div>

...