Asterisk auto-dial out use call files

Asterisk auto-dial out

Asterisk Call Files


Asterisk call files are structured files which, when moved to the appropriate directory, are able to automatically place calls using Asterisk. Call files are a great way place calls automatically without using more complex Asterisk features like the AGI, AMI, and dialplan, and require very little technical knowledge to use.

The Asterisk dial plan extensions.conf responds to someone calling an extension on a channel. If you want to initiate a call from an external application, there are several ways to do this.

There are basically four ways to initiate outgoing calls in Asterisk

  • Use .call files. A call file is a text file that when placed in the correct directory makes Asterisk make an outgoing call.
  • Use the manager API to activate a call. See Asterisk manager dialout
  • Use the Asterisk CLI originate command
  • FollowMe command of Asterisk 1.4: Since this has the abitility to fork (create multiple calls) it could be 'misused' to initiate outgoing calls.


See also additional Digium documents.

How Does It Work?

 

  • Move a call file into /var/spool/asterisk/outgoing/ (or the equivalent astspooldir directory defined in asterisk.conf).
  • If autoload=no in modules.conf be sure to load pbx_spool.so, otherwise call files will not work.
  • If the modification date on the call file is in the future, Asterisk will wait until the system time matches the modification time before executing the call file.
  • Asterisk will notice and immediately execute the directives defined in the call file. This can include either connecting to an Asterisk dial plan context, or performing a single Asterisk dial plan function call.
  • Asterisk will then remove the call file from the spooling directory (typically /var/spool/asterisk/outgoing).
  • Examples: See Minimal Call File Example and Syntax of Call Files sections.

Syntax of call files

  • Specify where and how to call
    • 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, Don't hammer an unavailable phone. Default is 300 (5 min).
    • WaitTime: <number> Seconds to wait for an answer. Default is 45.
    • Account: Set the account code to use.
  • 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 for use in the extension logic (example: file1=/tmp/to ); in Asterisk 1.0.x use 'SetVar' instead of 'Set'
    • Application: Asterisk Application to run (use instead of specifiying context, extension and priority)
    • Data: The options to be passed to application
  • New (?) in Asterisk 1.4
    • Set: Can now also write to dialplan functions like CDR()
    • AlwaysDelete: Yes/No - If the file's modification time is in the future, the call file will not be deleted
    • Archive: Yes/No - Move to subdir "outgoing_done" with "Status: value", where value can be Completed, Expired or Failed.


At least one of app or extension must be specified, along with channel and destination

Minimal Call File Example


The most minimal call file example that we can make does nothing more than dial a number, and play a sound file.

hello-world.call


Channel: SIP/trunkname/18882223333
Application: Playback
Data: hello-world



To run the call file above, you would type the following commands (we assume that the file already belongs to the asterisk user:


mv hello-world.call /var/spool/asterisk/outgoing/



How does this work? Asterisk does the following when reading the above call file:

  • Dial the number 18882223333 out of the trunkname SIP trunk.
  • Once the call has been answered, play the sound file /var/lib/asterisk/sounds/hello-world (this sound file is included by default)
  • Hang up the call.


As you can see, this is a very minimal call file example.

The 'failed' extension

If the call is not answered, and the standard extension failed with priority 1 exists in the same context, control will jump there (feature introduced in either Asterisk 1.2 or 1.4. NOTE: This works in asterisk 1.2.14)

  •  
    • Note 1: This only works if you made the call with context, extension, and priority defined, and didn't use the application, data form.
    • Note 2: This is a good place to update the CDR UserField with a value of the phone number that was being dialed using the SetCDRUserfield() application. Asterisk (as of 1.2.10) does not make the dialed channel (eg. IAX2/15551234567) available anywhere, so you have to pass it to yourself using Set: field of the .call file. (Along with anything else you want pass to the channel in this same variable).
    • Note 3: The ${REASON} channel variable receives a value that represents the reason why the call failed. See more on Asterisk Reason variable.

 

Example

In .call file:
Set: PassedInfo= 15551234567-moreinfo-evenmoreinfo 

extensions.conf
exten => failed,1,Set(NumberDialed=${CUT(PassedInfo,,1)})
exten => failed,n,SetCDRUserField(${NumberDialed})

Creating and Moving Call Files


Because Asterisk can grab these files at any time (e.g. when the file is only 1 / 2 written), do not create the file directly in the /var/spool/asterisk/outgoing directory. Do something like this:

  • Create the call file in a different directory - e.g. /tmp/callfile-18882223333-01252010-104400.call
  • If Asterisk is running as a different user than you are creating the call file with (eg: If Asterisk runs as 'asterisk', but you are creating the call file as 'root',) then you will need to change the file's ownership permissions before sending it to the Asterisk spooling directory: chown asterisk:asterisk /tmp/callfile-18882223333-01252010-104400.call
  • mv /tmp/callfile-18882223333-01252010-104400.call /var/spool/asterisk/outgoing/

This works because the Unix move operation (mv command) merely moves the "inode" — the pointer to the file — making the entire file appear all at once and eliminates the possibility that Asterisk could read and act upon a partially written file. (Note that this is only true if the source and destination are on the same file system; otherwise, it does the equivalent of a "cp"; see below.)

Note: Using the copy command (cp) is not a safe method for adding a file to the outbound directory since other programs can read the new file in the midst of the copy operation when the file is only partially written. If you want to use CP you should copy the file in your call file directory under permissions which don't allow asterisk to read or remove it, then chown the file. This will save you from having to create an extra backup of the file.

VB Scripts for creating your call files from a simple text file and then moving the files to asterisk spool directory using pscp.


First you have to create the text files using a text file that has all the phone numbers, this script expects the text file to be in format of one phone number per line.
It then goes thru the text file and creates a new subfolder in current working directory for each 20 phone numbers it finds.
It uses the phone number as the file name for each call file. Each subfolder that contains 20 call files is named with a number starting from 1.
Once the call files are created use the second script to move it into the spool directory using pscp.
Pscp is a free file transfer program that works over SSH, before you use this script make sure you have putty on your machine, create a saved session on putty for your asterisk system.


;!!!!!!!!!!!!!!!!!!!!!
;Creates call text files taking the numbers from a flat text file that has one phone number per line
;expample phonenumbers.txt
;1234567890
;2134567890
;a text file that contains the 2 lines above (without the colons) will create 2 text files one for each number
;you can copy and paste this whole code into a .vbs file in windows and then execute it.
;put the file in the same directory as the text file with the phone numbers are.

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFilePhones = objFSO.OpenTextFile("C:/calls/Phone.txt",1) ;change this line to your path
strfname=1
strcnt=1
Set objFolders=objFSO.CreateFolder(strfname)
Do While objFilePhones.AtEndOfStream = False
	If strcnt=20 then;change this number to anything else if you want more or fewer simultaneous calls.
		strfname=strfname+1

		Set objFolders=objFSO.CreateFolder(strfname)
		strcnt=1
	end if
	strLine = objFilePhones.ReadLine

	strFullName = objFSO.BuildPath(strfname, strLine)
	Set objFileCalls = objFSO.CreateTextFile(strFullName)
	objFileCalls.close
	Set objFileCalls = objFSO.OpenTextFile(strFullName,2)
	objFileCalls.Write("Channel: ");put your channel information here, add a 1 before the number if your provider requires that
	objFileCalls.WriteLine(strLine)
	objFileCalls.WriteLine("CallerID: Name <1234>");change caller id as needed
	objFileCalls.WriteLine("MaxRetries: 0");change this if you want it to retry
	objFileCalls.WriteLine("RetryTime: 3")
	objFileCalls.WriteLine("WaitTime: 30");change this if you want it to ring longer before giving up
	objFileCalls.WriteLine("Context: test");put context here
	objFileCalls.WriteLine("Extension: 800");put extension here
	objFileCalls.WriteLine("Priority: 1");put priority here
	objFileCalls.Close
	strcnt=strcnt+1
Loop
;end code for first script that creates the call files.
;the next script moves the files to the asterisk spool directory expecting pscp to be located under c:/pscp.exe and a 
;named saved session to your asterisk box in putty as asterisk.
;paste as needed
Set objFSO = CreateObject("Scripting.FileSystemObject")

strcnt=1
strfldr="C:/calls/"&strcnt

for i=1 to 1000 ;assuming that you don't have more than 1000 folders or 20000 files, if you do change this number
If objFSO.FolderExists(strfldr) Then
	strfldr="C:/calls/"&strcnt ;change path as needed
	Set objShell = CreateObject("WScript.Shell")
	strcmd="C:/pscp -pw passwordhere c:/calls/"&strcnt&"/* root@asterisk:/var/spool/asterisk/outgoing"
        ;change username and password as needed, as well as path to pscp and call files
	objShell.Run strcmd
	strcnt=strcnt+1

else
	exit for
End If

wscript.sleep(36000)
;change time interval between every folder it moves, when I created it I was dealing with recordings of 
;15-20 seconds and 30 second wait time to answer the call, since I didn't want more than 20 calls 
;simultaneous this worked for me. change as you like

next
;end second file, paste this to a new .vbs file under the same directory then execute it.
;end code


Examples

Example 1

Filename: 1.call

 
 Channel: Zap/1/1XXXXXXXXXXXX
 MaxRetries: 2
 RetryTime: 60
 WaitTime: 30
 Context: callme
 Extension: 800 
 Priority: 2



This will hook up to priority 2 of extension 800 in context callme in extensions.conf.

Example 2


To create a call to 14109850123 on an analog channel in group 2 and then connect it to the hypothetical extension 84 (which would map to 84,1,Dial(SIP/84) ) inside your network, here's the file you'd create in /var/spool/asterisk/outgoing:

 #
 # Create the call on group 2 dial lines and set up
 #  some re-try timers
 #
 Channel: Zap/g2/14109850123
 MaxRetries: 2
 RetryTime: 60
 WaitTime: 30
 #
 # Assuming that your local extensions are kept in the
 #  context called [extensions]
 #
 Context: extensions
 Extension: 84
 Priority: 1



The above examples are good if you want to automatically play some recorded message, or something automatic that must start when the other party picks up the phone. In fact if you use the above for a conversation, you will have the outgoing phone ring, and when the other person picks up his phone, only then your extension starts to ring, so you miss the initial "hello" and maybe some more words!
If you have outgoing calls in your dialplan defined in the [outgoing] context, to call 14109850123 do this:

Example 3


To create a call to 14109850123 on a SIP phones called bt101, here's the file you'd create in /var/spool/asterisk/outgoing (whatever name is good, of course must be accessible and deletable by asterisk GNU/Linux user):

 Channel: SIP/bt101
 MaxRetries: 1
 RetryTime: 60
 WaitTime: 30
 #
 # Assuming that your outgoing call logic is kept in the
 #  context called [outgoing]
 #
 Context: outgoing
 Extension: 14109850123
 Priority: 1



Example 4


Auto dial a number and play a prerecorded message, allow replay, and message acknowledgement
See: Auto-dial and Deliver Message


Example 5


To create a call to an internal or external extension connected to an AGI

 Channel: Local/1000@from-internal
 MaxRetries: 0
 RetryTime: 15
 WaitTime: 15
 Application: AGI
 Data: myagi.agi


On a trixbox/freepbx system this will dial internal extension 1000 (or you can put even an outside # here and it will follow outbound rules) and connect it to an AGI program. Note that unlike in extensions.conf where you can specify AGI(file.agi), here it must be separated. I use one agi to detect an incoming call to a special extension#, record the caller id, and then create the .call file to call back that number and connect it to a second agi.

Example 6: Use Asterisk as a PA system for emergency announcements.


Your Asterisk PABX can easily be used to send a voice message instantly to all (or a group of) phones.

It is quite easy to set this up. First you need to record 2 prompt sounds:

pa-welcome.wav

Please record you broadcast after the beep. End by pressing the hash key

pa-confirm.wav

Press 1 to send your message to all phones. Press 0 to cancel.

In your dialplan you create a context called [pa-system] and you Goto that context if the user dials 911 (or any other extension you find appropriate).


exten => 911,1,Goto(pa-system,s,1)

[pa-system]
exten => s,1,Answer
exten => s,n,Wait(2)
exten => s,n,Playback(pa-welcome)
exten => s,n,Wait(1)
exten => s,n,Record(pa-message.wav)
exten => s,n,Wait(1)
exten => s,n,Background(pa-confirm)
exten => s,n,WaitExten(10)
exten => s,n,Hangup()
exten => 1,1,System(cp /etc/asterisk/pa-system/*.call /tmp/)
exten => 1,n,System(mv /tmp/*.call /var/spool/asterisk/outgoing/)
exten => 0,1, Hangup()


Now what the above context does is to copy call files that you have prepared from a directory you create under /etc/asterisk to the outgoing queue. To avoid timing problems we first copy the files to the temp directory and then move them to the outgoing queue.
The call file you create has to have the extension .call and is best to have the extension as file name. For example:

Filename: 218.call


Channel: SIP/218
Callerid: 911
MaxRetries: 10
RetryTime: 5
WaitTime: 20
Context: pa-call-file
Extension: 10


So all call files in the directory /etc/asterisk/pa-system have the same content, except for the first line where you put the channel (like Zap/1 of SIP/218)
The Context line refers to the context that will be executed. You have to create that context in you extensions.conf too:


[pa-call-file]
exten => 10,1,Answer()
exten => 10,n,Wait(1)
exten => 10,n,Playback(pa-message)
exten => 10,n,Wait(1)
exten => 10,n,Hangup()


And you have a functional PA system!

One more feature you can add:
If you use (SIP) phones that support a distinctive ringtone, you can program these phones to ring differently when Callerid 911 calls (to indicate it's an emergency).




How to schedule a Call in the Future

Files with a modified date in the future are ignored until that time arrives. Create the file in /var/spool/asterisk/tmp, modify the mtime using "touch", and then move it...


 $ date
 Mon Mar 19 13:52:30 EDT 2007
 $ touch -d 20080101 /var/spool/asterisk/tmp/blah
 $ mv /var/spool/asterisk/tmp/blah .
 $ ls -l blah
 -rw-r--r--    1 andrew   users           0 Jan  1 00:00 blah




Bash example: to schedule a call in 100 s :

 # gives you the current time in seconds since dawn of UNIX
 NOW=`date +%s`
 # add 100 seconds
 let NOW=$NOW+100
 # create a timestamp used by 'touch -t' (no space between %M. %S, but the Wiki wants a space at this place)
 TOUCH_TMSP=`date -d "1970-01-01 $NOW sec GMT" +%Y%m%d%H%M. %S`
 # and do the touch
 touch -t $TOUCH_TMSP blah


Tip on managing the number of simultaneous outbound calls

You can limit the number of simultaneous outgoing calls by managing the number of files in the outbound directory (/var/spool/asterisk/outgoing). For example, to limit Asterisk to only doing 10 simultaneous outdials just limit the number of files in the outbound directory to 10 at any one time. As the number decreases, you can move additional files into the directory to maintain the number of outgoing calls at the desired level.

Note: There are various user reports of Asterisk choking (=not processing some of the .call files) when too many files are moved simultaneously into the outgoing directory. Therefore it may be advisable to move them step-by-step with a slight delay.
However, even then it is possible that Asterisk once in a while 'forgets' to process a call file (seen e.g. in 1.0.9). Possible soltuions:
  • 1. Find the cause and fix it in the source code,
  • 2. Use the Manager API which hopefully doesn't exhibit this problem,
  • 3. Design your application to cope with this effect, for example counter check the existence of CDR data against your .call file details (execution time, destination, accountcode etc).

Asterisk auto-dial out deliver message

Auto-dial out and deliver a prerecorded message

This example showes how to automatically dial out to a phone number and deliver a specified prerecorded message. The outgoing messages may be rerecorded at any time, and the person answering the call is asked to acknowledge receipt. The trigger for the dial-out could be a cron job, an alarm from an network management system, or other external event.


; This is a sample section from an extensions.conf file showing how to auto-dial an outbound call
; and play a prerecorded message when the call is answered.
; To install this application:
;     Create message directory see [record-outboundmsgs] below for details
;     If needed, modify extension numbers and context names to make compatible with your local dialing plan
;     Add the contexts below to your /etc/extensions.conf file
;     Record messages see [record-outboundmsgs] below for details
;     Create a call file to test
;
; The outbound call can be triggered by a call file or manager commands via a telnet session
;
; Creating a call file to call 7026241632 using context @syndeo in the sip.conf file
; set the caller ID to 7022340175 when placing the call
; A correct Caller ID may be required when using some VOIP to PSTN gateway services.
;
; cat <<EOF > /var/spool/asterisk/tmp01
; Channel: SIP/7026241632@syndeo
; Callerid: 7022340175
; MaxRetries: 5
; RetryTime: 300
; WaitTime: 45
; Context: outboundmsg1
; Extension: s
; Priority: 1
; EOF
; mv /var/spool/asterisk/tmp01 /var/spool/asterisk/outgoing
;
;
; For more information see:
;   http://www.voip-info.org/wiki-Asterisk+auto-dial+out+deliver+message
;   http://www.voip-info.org/wiki-Asterisk+auto-dial+out
;   http://www.voip-info.org/wiki-Asterisk+manager+dialout
;



[outboundmsg1]
exten => s,1,Set(TIMEOUT(digit)=5)             ; Set Digit Timeout to 5 seconds
exten => s,2,Set(TIMEOUT(response)=10)         ; Set Response Timeout to 10 seconds
exten => s,3,Answer
exten => s,4,Wait(1)
exten => s,5,Background(outboundmsgs/msg1)         ; "play outbound msg"
exten => s,6,Background(outboundmsgs/how_to_ack)   ; "Press 1 to replay or 2 to acknowledge receiving this message"
exten => 1,1,Goto(s,5)   ; replay message
exten => 2,1,Goto(msgack,s,1) ; acknowledge message
exten => t,1,Playback(vm-goodbye)
exten => t,2,Hangup
; at this point we could do something like reschedule the call to try again later
; or send an email saying the msg was not received,
; or ...


[outboundmsg2]
exten => s,1,Set(TIMEOUT(digit)=5)             ; Set Digit Timeout to 5 seconds
exten => s,2,Set(TIMEOUT(response)=10)         ; Set Response Timeout to 10 seconds
exten => s,3,Answer
exten => s,4,Wait(1)
exten => s,5,Background(outboundmsgs/msg2)         ; "play outbound msg"
exten => s,6,Background(outboundmsgs/how_to_ack)   ; "Press 1 to replay or 2 to acknowledge receiving this message"
exten => 1,1,Goto(s,5)   ; replay message
exten => 2,1,Goto(msgack,s,1) ; acknowledge message
exten => t,1,Playback(vm-goodbye)
exten => t,2,Hangup
; at this point we could do something like reschedule the call to try again later
; or send an email saying the msg was not received,
; or ...


[msgack]
exten => s,1,Playback(outboundmsgs/thankyou)
exten => s,2,Playback(vm-goodbye)
exten => s,3,Hangup
; at this point we might want to log the message acknowledgement somewhere
; and perhaps trigger some additional processing


[record-outboundmsgs]
; Record voice files
;
; Before using this the first time
;    mkdir /var/lib/asterisk/sounds/outboundmsgs
;    chown asterisk_user:asterisk_user /var/lib/asterisk/sounds/outboundmsgs
;    (Where asterisk_user = the user that asterisk runs under: = root for many installations)
;
; In a context for incoming calls put something like
;  include => record-outboundmsgs
;
; Then call
;   2051 to Record a new outbound msg1
;   2052 to Record a new outbound msg2
;
;   2061 to Record the msg played when the recipient acks the message
;   2062 to Record the "How to ACK message"
;
; After dialing one of the extensions above:
;   Wait for the record start tone
;   Record your message
;   Press # to stop recording
;   Listen to an automatic playback of your new message
;
; outbound msg1
exten => 2051,1,Wait(2)
exten => 2051,2,Record(outboundmsgs/msg1:gsm)
exten => 2051,3,Wait(2)
exten => 2051,4,Playback(outboundmsgs/msg1)
exten => 2051,5,wait(2)
exten => 2051,6,Hangup
;
; outbound msg2
exten => 2052,1,Wait(2)
exten => 2052,2,Record(outboundmsgs/msg2:gsm)
exten => 2052,3,Wait(2)
exten => 2052,4,Playback(outboundmsgs/msg2)
exten => 2052,5,wait(2)
exten => 2052,6,Hangup
;
;
; Msg played when msg is acked
exten => 2061,1,Wait(2)
exten => 2061,2,Record(outboundmsgs/thankyou:gsm)
exten => 2061,3,Wait(2)
exten => 2061,4,Playback(outboundmsgs/thankyou)
exten => 2061,5,wait(2)
exten => 2061,6,Hangup
;
; Msg played after outbound msg: "Press 1 to replay or 2 to acknowledge receiving this message"
exten => 2062,1,Wait(2)
exten => 2062,2,Record(outboundmsgs/how_to_ack:gsm)
exten => 2062,3,Wait(2)
exten => 2062,4,Playback(outboundmsgs/how_to_ack)
exten => 2062,5,wait(2)
exten => 2062,6,Hangup

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值