Asterisk: callback using AMI
In this post, we will consider using AMI as an example of solving a certain problem: configure Asterisk to generate calls by a given url, in which call parameters should be set.
Configuring Asterisk AMI
The first thing to do is enable AMI and have a user with which the client program authenticates:
/etc/asterisk/manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
/etc/asterisk/manager.conf
[c2call]
secret=FrUyHn6FSaX
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.0.0
read=system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
write=system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
To apply the changes, reload:
asterisk -rx "module reload manager"
Now we need to create an extension number which, in fact, will be connected to the called party:
/etc/asterisk/sip.conf
[3200]
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.0.0
secret=3200
dtmfmode=rfc2833
canreinvite=no
context=OUT_IN1
host=dynamic
type=friend
nat=yes
port=5060
qualify=yes
callcounter=yes
faxdetect=no
After creating the extension, you will need to re-read the Asterisk configuration:
asterisk -rx "sip reload"
This completes the setup of Asterisk.
Callback script
Now let's move on to creating a script in PHP:
callback.php
\n"; }
else {
fputs ($sconn, "Action: login\r\n");
fputs ($sconn, "Username: c2call\r\n");
fputs ($sconn, "Secret: FrUyHn6FSaX\r\n");
fputs ($sconn, "Events: off\r\n\r\n");
usleep(500);
fputs ($sconn, "Action: Originate\r\n");
fputs ($sconn, "Channel: SIP/$cid\r\n");
fputs ($sconn, "Callerid: $cid\r\n");
fputs ($sconn, "Timeout: 15000\r\n");
fputs ($sconn, "Context: $c\r\n");
fputs ($sconn, "Exten: $num\r\n");
fputs ($sconn, "Priority: $p\r\n\r\n");
fputs ($sconn, "Async: yes\r\n\r\n" );
fputs ($sconn, "Action: Logoff\r\n\r\n");
usleep (500);
fclose ($sconn);
}
?>
Now you can check the generation of the call using the following URL:
http://domain.com/callback.php?p=1&c=OUT_EXT2&cid=3200&num=84951234567
We see the result in the console:
*CLI> == Manager 'c2call' logged on from 192.168.0.11
== Using SIP RTP CoS mark 5
-- Executing [84951234567@OUT_EXT2:1] Dial("SIP/3200-0000000a", "SIP/84951234567@TRK1") in new stack
== Manager 'c2call' logged off from 192.168.0.11
== Using SIP RTP CoS mark 5
-- Called SIP/84951234567@TRK1
-- SIP/TRK1-0000000b is ringing
== Spawn extension (OUT_EXT2, 84951234567, 1) exited non-zero on 'SIP/3200-0000000a'
Here are some comments that may be useful to practitioners:
\ r \ n - carriage return with line feed (Carriage Return + Line Feed (CR + LF)). It is usually transmitted by pressing the Enter key and indicates the completion of the command.
Events: off
In this case, we disable sending events to this AMI interface connection. Basically, its value is always off
Channel: SIP / $ cid
The name of the channel to which the call is addressed. In our case, the call will first be sent to the SIP / 3200 subscriber, as soon as he picks up the phone, the call will be redirected to the number 84951234567.
Callerid: $ cid
Caller ID, which must be set for the outgoing channel.
Timeout: 15000
We indicate the waiting time for answering a call - 15 seconds
Async: yes
Asynchronous generation of calls allows you to create one or more calls without waiting for an immediate answer.