Monday, January 26, 2009

Using the Asterisk Manager Interface (AMI) to make calls in C#

for some reasons, i've been interested in using Asterisk.NET (mostly because code completion in a GUI beats grokking code in a command line). one problem i'd always had, though, was making calls. for some reason, i'd just get the message 'Originate failed' returned to me. today i was working on my sample program again, when i got the same error. i then started looking through the Asterisk.NET code to find out what i could be doing wrong. i also dug out my trusty copy of .NET Reflector to analyze the assembly.

the main source of aggravation was that i could use call files, and they'd work. but with Asterisk.NET, at most i'd get a missed call. my code went something like this:

var myManagerConn = new ManagerConnection();
myManagerConn.Hostname = "asterisk-server";
myManagerConn.Username = "admin";
myManagerConn.Password = "god";
myManagerConn.Port = 5038;
var action = new OriginateAction();
action.Channel = "SIP/3595009";
action.CallerId = "3595009";
action.Context = "robocall";
action.Exten = "10";
action.Priority = 1;

myManagerConn.Login();

myManagerConn.SendAction(action);

myManagerConn.Logoff();
after some sniffing around in Reflector, i found the Timeout property for the OriginateAction class. i went looking in the code, and found that Asterisk would set it to a specific value (30000 milliseconds) if it wasn't set. knowing .NET initialization, however, i guessed that the underlying field was probably set to 0, and set the property explicitly to 30000. i ran the program again, and the call came in, the phone kept ringing (yay!) — but the program generating the call threw an exception complaining about a timeout. i increased the timeout to one minute to no avail. i then decided to set the timeout parameter for the SendAction() method of the Asterisk.NET.Manager.ManagerConnection. the resulting call was like this:
myManagerConn.SendAction(action, 30000);
. and the program worked. like that. so i guess i may just be able to get this automated call thing done without using a terminal to the Asterisk server.

1 comment:

Ramón Miñarro Romero said...

I using the Asterisk Manager Interface in vb .net, but I have a problem with redirect action, You know to use that action?