Multiple SendDTMF extension in asterisk - asterisk

Good day, I need type extension after dial, I wrote a macros and use it in Dial command, for example:
Dial(Local/123123#outbound-allroutes,,M(sendnum^5^123)
[macro-sendnum]
exten => s,1,Wait(${ARG1})
exten => s,n,SendDTMF(${ARG2})

But sometimes I need type several ext. numbers, how can I do that?
I guessed pass more params in macros at first param is count of IVR steps, and other params are options for steps then in macros process those params in loop, for example:
Dial(Local/123123#outbound-allroutes,,M(sendnum^2^5^2010^6^123)
and macros for this:
macro-sendnum]
exten => s,1,Set(TIMES=${ARG1})
exten => s,n,Set(i=0})
exten => s,n,While($[${i} < ${TIMES}])
exten => s,n,Set(i=$[ ${i} + 1 ])
exten => s,n,Wait(${ARG$[${i} + 1]})
exten => s,n,SendDTMF(${ARG$[${i} + 2]})
exten => s,n,EndWhile
But that doesn't work. Could you please help me? Thank you in advance and sorry for my bad endgish.

pro-sip*CLI> core show application SendDTMF
-= Info about application 'SendDTMF' =-
[Synopsis]
Sends arbitrary DTMF digits
[Description]
It will send all digits or terminate if it encounters an error.
[Syntax]
SendDTMF(digits[,timeout_ms[,duration_ms[,channel]]])
[Arguments]
digits
List of digits 0-9,*#,a-d,A-D to send also w for a half second pause,
and f or F for a flash-hook if the channel supports flash-hook.
timeout_ms
Amount of time to wait in ms between tones. (defaults to .25s)
duration_ms
Duration of each digit
channel
Channel where digits will be played
So you can use 'w' as pause.

Related

Asterisk Playback with no answer on dahdi channel?

Here is my sample dialplan
exten => _X.,1,Progress()
exten => _X.,n,Playback(welcome,noanswer)
exten => _X.,n,Hangup()
When I tried to call through dhadi channel. I am getting the below logs in asterisk console.
-- Accepting call from '9042394773' to '33468550' on channel 0/8, span 1
-- Executing [33468550#test:1] Progress("DAHDI/i1/9042394773-8", "") in new stack
-- Executing [33468550#test:2] Playback("DAHDI/i1/9042394773-8", "welcome,noanswer") in new stack
-- <DAHDI/i1/9042394773-8> Playing 'welcome.slin' (language 'en')
-- Executing [33468550#test:3] Hangup("DAHDI/i1/9042394773-8", "") in new stack
-- Hungup 'DAHDI/i1/9042394773-8'
But the welcome voice is not audio able.. How do I play weclome voice before atten the call??? Whether I have to change any configuration in asterisk????
Am using asterisk 13.5.
I found this example where a Wait(1) is used between Progress and Playback.
Maybe you can give it a try.
exten => 500,1,Progress()
exten => 500,n,Wait(1)
exten => 500,n,Playback(WeAreClosedGoAway,noanswer)
exten => 500,n,Hangup()

Asterisk AMD doesn't start on outbound call

Please can you tell me where I am wrong, I am new on Asterisk.
I am trying to detect voicemail on outgoing call (remote provider)
exten => _011225XXXXXXXX,1,Dial(SIP/${EXTEN}#dinstar)
exten => _011225XXXXXXXX,n,AMD()
exten => _011225XXXXXXXX,n,GotoIf($["${AMDSTATUS}" = "HUMAN"]? human:machine)
exten => _011225XXXXXXXX,n(machine),WaitForSilence(2000)
exten => _011225XXXXXXXX,n,Playback(asterisk-friend)
exten => _011225XXXXXXXX,n,Hangup()
exten => _011225XXXXXXXX,n(human),Verbose(3, We've got a human on the line!)
exten => _011225XXXXXXXX,n,Playback(transfer)
exten => _011225XXXXXXXX,n,Dial(SIP/${EXTEN}#dinstar)
exten => _011225XXXXXXXX,n,Playback(im-sorry)
exten => _011225XXXXXXXX,n,Hangup()
Cli print
CLI> == Using SIP RTP CoS mark 5
-- Executing [01122548484444#LocalSets:1] Dial("SIP/mor-00000002", "SIP/01122548484444#dinstar") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/01122548484444#dinstar
-- SIP/dinstar-00000003 is making progress passing it to SIP/mor-00000002
-- SIP/dinstar-00000003 answered SIP/mor-00000002
-- Remotely bridging SIP/mor-00000002 and SIP/dinstar-00000003
== Spawn extension (LocalSets, 01122548484444, 1) exited non-zero on 'SIP/mor-00000002'
Asterisk AMD in this example will start like you asked - after dial command compleated.
If you want use AMD for provisioning dial answer you should use it in on-answer macro(M param in dial command).
If you want use AMD to detect what happens and route calls, you should implement AMD on other end of call/add that to your dialling core. For examples see vicidial.org or other dialler.

Asterisk 11.7 Matching on Caller ID

I've an asterisk pbx that manages some sip providers (a ISDN Patton) and some Voip providers.
I'm trying to use matching of CID in my dialplan as described here.
This is the relevant part of my dialplan, please note that this part of dialplan is included my extension.conf:
[patton];Calls from Patton
exten => 0219999999/_0031X.,1,Answer(0)
exten => 0219999999/_0031X.,n,Hangout()
exten => 0219999999,1,Answer(0)
exten => 0219999999,n,Goto(in_4,${EXTEN},1)
[in_4]
exten => 0219999999,1,Noop(Exten: ${EXTEN})
exten => 0219999999,n,Noop(CID: ${CALLERID(NUM)})
In short I want do something different when the CID of the caller cames from Netherlands.
Watching what happens in Asterisk CLI I see:
== Using SIP RTP CoS mark 5
-- Executing [0219999999#patton:1] Answer("SIP/patton-00000011", "0") in new stack
-- Executing [0219999999#patton:2] Goto("SIP/patton-00000011", "in_4,0219999999,1") in new stack
-- Goto (in_4,0219999999,1)
-- Executing [0219999999#in_4:1] NoOp("SIP/patton-00000011", "Exten: 0219999999") in new stack
-- Executing [0219999999#in_4:2] NoOp("SIP/patton-00000011", "Cid: 0031123456789") in new stack
So what I understand is that Asterisk don't apply the CID matching but I don't understand why, considering that if I print the CID it matches perfectly my expression.
Here is a section of my extensions.conf file that deals with inbound caller ID matching (from a PSTN line)
There might be another/better way to do this, but its been a working config for me since 1.4 and I'm now running 13.7 without any issues. (Individual numbers have been replaced with '#') - This is a simple dial plan.
This is used to catch anyone who send an 084 or 087 prefix, a couple of specific numbers and anything from 'international' or lazy system administrators 'UNAVAILABLE'
I've the same thing set up for SIP trunks as well so this should work across any channel type.
[from-pstn]
exten => s,1,Verbose(CLID From BT ${CALLERID(all)})
exten => s,2,GotoIf($[${CALLERID(num):0:3} = 087]?103:3)
exten => s,3,GotoIf($[${CALLERID(num):0:3} = 084]?103:4)
exten => s,4,GotoIf($[${CALLERID(num):0:11} = 07896######]?103:5)
exten => s,5,GotoIf($[${CALLERID(num):0:11} = 01494######]?103:6)
exten => s,6,GotoIf($["${CALLERID(name):0:13}" = "INTERNATIONAL"]?103:7)
exten => s,7,GotoIf($["${CALLERID(name):0:11}" = "UNAVAILABLE"]?103:8)
exten => s,8,GotoIf($[${CALLERID(num):0:10} = 020315####]?103:9)
exten => s,103,Answer
exten => s,104,Wait(1)
exten => s,105,Playtones(info)
exten => s,106,Wait(7)
exten => s,107,Hangup
exten => s,9,Goto(internal-ext,5800,1)
You would want something like;
[from-yourtrunk]
exten => s,1,Verbose(CLID From <yourtrunk> ${CALLERID(all)})
exten => s,2,GotoIf($[${CALLERID(num):0:4} = 0031]?103:3)
exten => s,103,<do something with the call that matches the CLI>
exten => s,3,Goto(<your-internal-ext>,<number>,1)
Something to keep in mind - if you handle inbound caller ID that could start 0031 but its not a call from .nl then you would need to apply some additional patten matching to the 2nd line to enforce a minimum number of digits (for example) otherwise that will match any call that comes in with a CLI of 0031...............................
If you need any more explanation, or I've got the wrong end of the stick just add a comment to this answer.
There can be non zero probability, that cid is go in other format(use Verbose or Noop command to show real cid)
Also in this case any dialplan can work if cid match
Asterisk not select "most matching" dialplan. Insead it select FIRST matching dialplan.
You can use different contexts and include directive to control matching. See examples in extensions.conf.sample
-- Executing [19#test:1] Answer("SIP/test2-0000821a", "") in new stack
-- Executing [19#test:2] Set("SIP/test2-0000821a", "CALLERID(num)=0031123456789") in new stack
-- Executing [19#test:3] Goto("SIP/test2-0000821a", "patton,0219999999,1") in new stack
-- Goto (patton,0219999999,1)
-- Executing [0219999999#patton:1] Answer("SIP/test2-0000821a", "0") in new stack
[Feb 10 08:26:09] WARNING[15817][C-00008bfe]: pbx.c:4869 pbx_extension_helper: No application 'Hangout' for extension (patton, 0219999999, 2)
== Spawn extension (patton, 0219999999, 2) exited non-zero on 'SIP/test2-0000821a'
[Feb 10 08:26:45] NOTICE[1499]: chan_sip.c:28210 handle_request_register: Registration from '"407" <sip:407#78.47.159.180:5060>' failed for '221.144.172.3:5083' - Wrong password
pro-sip*CLI> dialplan show pa
park-dial park-hints park-orphan-routing park-return-routing parkedcalls parkedcallstimeout
patton
pro-sip*CLI> dialplan show patton
[ Context 'patton' created by 'pbx_config' ]
'0219999999' (CID match '_0031X.') => 1. Answer(0) [pbx_config]
2. Hangout() [pbx_config]
'0219999999' => 1. Answer(0) [pbx_config]
2. Goto(in_4,${EXTEN},1)
[pbx_config] pro-sip*CLI> core show applications like Hang
-= Matching Asterisk Applications =-
ChangeMonitor: Change monitoring filename of a channel.
Hangup: Hang up the calling channel.
HangupCauseClear: Clears hangup cause information from the channel that is available through HANGUPCAUSE.
SoftHangup: Hangs up the requested channel.
-= 4 Applications Matching =- pro-sip*CLI>
Addon2(please note, debug is OFFTOPIC on SO)
-- Executing [0219999999#patton:1] NoOp("SIP/test2-0000821c", "cid match") in new stack
-- Executing [0219999999#patton:2] Answer("SIP/test2-0000821c", "0") in new stack
[Feb 10 08:32:18] WARNING[15826][C-00008c00]: pbx.c:4869 pbx_extension_helper: No application 'Hangout' for extension (patton, 0219999999, 3)
== Spawn extension (patton, 0219999999, 3) exited non-zero on 'SIP/test2-0000821c'
pro-sip*CLI> dialplan show pa
park-dial park-hints park-orphan-routing park-return-routing parkedcalls parkedcallstimeout
patton
pro-sip*CLI> dialplan show patton
[ Context 'patton' created by 'pbx_config' ]
'0219999999' (CID match '_0031X.') => 1. Noop(cid match) [pbx_config]
2. Answer(0) [pbx_config]
3. Hangout() [pbx_config]
'0219999999' => 1. NOOP(CIDNOTMATCH) [pbx_config]
2. Answer(0) [pbx_config]
3. Goto(in_4,${EXTEN},1) [pbx_config]

Initiate call from extension

It is possible to initiate call from extension? My extension is look like the following:
[read_text]
exten => s,1,Answer( )
exten => s,n,Dial(SIP/1,G(99))
exten => s,n,Dial(SIP/2,G(99))
exten => s,n,Goto(1)
exten => s,100,System(echo '${text}' | /usr/bin/espeak --stdout |sox -t wav - -r 8000 /tmp/voice.wav)
exten => s,n,Playback(/tmp/voice)
exten => s,n,System(rm /tmp/voice.wav)
exten => s,n,Hangup( )
So if SIP/1 or SIP/2 answers, It plays text and hangup, if nobody answer it continues to Dial
I tried to make call file, but it requires some channel to be setup, I tried to use Local, but unsuccess.
I also found that there are queues, but can't find a way to initiate call to queue from call file. I'm very new to asterisk.
What your trying to do can get pretty messy from the dialplan. Try something along these lines:
[call_read_text]
exten => s,1,Dial(SIP/1,gG(read_text,s,1))
exten => s,n,Dial(SIP/2,gG(read_text,s,1))
exten => s,n,Goto(1)
[read_text]
exten => s,1,System(echo '${text}' | /usr/bin/espeak --stdout |sox -t wav - -r 8000 /tmp/voice.wav)
exten => s,n,Playback(/tmp/voice)
exten => s,n,System(rm /tmp/voice.wav)
exten => s,n,Hangup()
Dont answer the call before you start!
g will continue in the dialplan if the call isn't answered, and call the next extension
G() will jump to read_text,s,1 if the call IS answered, and end the hunt
You can jumpstart all this with a call file, by connecting the first context with the second (will happen on answer).
Something along these lines:
Channel: Local/s#call_read_text
Context: read_text
Extension: s
Priority: 1
More on call files here: http://www.voip-info.org/wiki/view/Asterisk+auto-dial+out. Use Set: foo=bar in the call file to set ${text}

Replace characters in Asterisk Dialplan

I want to change a couple off characters * # for A and P to have the monitor filename with characters more friendly. The only solution I could find was to do it my self within the dialplan but it generates a lot of verbosity output and is not as efficient(fast) as I would like to. I'll post it here just in case someone wants to use it. But I'm looking for an asterisk function that I can compile something that I can call withing the dialplan like ${REPLACE(${EXTEN},*,a)} and have the exten **123**456*** converted to AA123AA456AAA.
;
; MACRO REPLACE
;
[macro-replace]
;
; ${ARG1} - String source
; ${ARG2} - Chars to replace
; ${ARG3} - Chars to replace with
;
exten => s,1,NoOp(Replacing ${ARG2} for ${ARG3} in ${ARG1})
exten => s,n,Set(str=${ARG1})
exten => s,n,Set(find=${ARG2})
exten => s,n,Set(replace=${ARG3})
exten => s,n,Set(i=0)
exten => s,n,Set(length=${LEN(${str})})
exten => s,n,While($[${i} < ${length}])
exten => s,n,GotoIf($["${str:${i}:1}" != "${find}"]?continue)
exten => s,n,Set(pre=)
exten => s,n,GotoIf($["${i}" = "0"]?post)
exten => s,n,Set(pre=${str:0:${i}})
exten => s,n(post),Set(post=)
exten => s,n,GotoIf($["${i}" = $[${length} - 1]]?write)
exten => s,n,Set(post=${str:$[${i} + 1]})
exten => s,n(write),Set(str=${pre}${replace}${post})
exten => s,n(continue),Set(i=$[${i} + 1])
exten => s,n,EndWhile
exten => s,n,Set(REPLACERESULT=${str})
The REPLACE() function now does this easily:
exten => 100,1,Set(find=**123**456***)
same => n,NoOp(find=${find})
same => n,Set(replace=${REPLACE(find,*,A)})
same => n,NoOp(find=${find}, replace=${replace})
same => n,hangup()
Output:
*CLI> channel originate local/100#default extension null#default
-- Executing [100#default:1] Set("Local/100#default-c758;2", "find=**123**456***") in new stack
-- Executing [100#default:2] NoOp("Local/100#default-c758;2", "find=**123**456***") in new stack
-- Executing [100#default:3] Set("Local/100#default-c758;2", "replace=AA123AA456AAA") in new stack
-- Executing [100#default:4] NoOp("Local/100#default-c758;2", "find=**123**456***, replace=AA123AA456AAA") in new stack
-- Executing [100#default:5] Hangup("Local/100#default-c758;2", "") in new stack
== Spawn extension (default, 100, 5) exited non-zero on 'Local/100#default-c758;2'
That's really the best way to do it (without using regex). If you want to use regex (regular expressions), Asterisk 1.1+ has full support for it. This will allow you to do your entire macro in a single line. The documentation for using regex in dialplan is here: voip-info.
Hopefully this helps! There are plenty of examples on that voip-info page that should be able to help you along!
Another alternative to what you've done is to use an AGI script. Just write your code in bash/python/etc and use it as AGI(replace,${arg1},${arg2},${arg3}). Might not be as fast as an internal function but it's more compact and potentially faster than your solution.

Resources