Over the last 6 months, I have received all kinds of support and help from the freeswitch community (both IRC and this list) in learning to control this incredible piece of software. Im truly grateful, thanks everyone. I run freeswitch at my car dealership. We have approximately 40 sip extensions, an ATT voip connection, and 6 analog outbound fax lines provided by freetdm. Prior to freeswitch, I was running an old Lucent/Avaya Merlin "key" system. One of the features of the Merlin was that it was pretty easy to do "directed callpick". In essence, you would dial *7 + extension you wanted to pickup. Provided the call was either on hold or ringing at that extension, you would pick it up. When I first started using Freeswitch, I was very disappointed in the directed callpick. Before I realized that the call pickup that was built into the sample dialplan was really just an example to show a simple possibility for using intercept. I was convinced that it was a totally useful feature. I couldn't believe that was as good as it got... My problem with the directed pickup that is in the sample dialplan is that it can steal a live call right from another extension, as well as it really only works with the most recent call on that extension. Then I woke up, and rolled my own 8-) . In an effort to provide just another example, I wanted to share the piece of code I've developed. I will warn that this was the first perl script I have ever written, and probably is pretty ugly, but it seems to work perfectly in our environment. Bottom line, do what you want with it...I'm just trying to help other beginner's like myself: To all beginners: You will need to build and enable mod_perl for this to work... First, we need an entry in your XML dialplan to see the user's request to interecept a "held" or "ringing" extension. The only 4 digit extensions at my company are internal ones so I match on ** + 4-digit-extension. In the xML dialplan: <extension name="intercept-ext"> <condition field="destination_number" expression="^\*\*(\d{4})$"> <action application="answer"/> <action application="perl" data="/usr/local/freeswitch/scripts/myintercept.pl $1"/> <action application="sleep" data="2000"/> </condition> </extension> Then, we need the actual perl script: /usr/local/freeswitch/scripts/myintercept.pl: # This is code to allow us to use intercept to grab only calls that are on hold or ringing. # # by Frank Busalacchi 2012-06-13 use strict; use Switch; use Data::Dumper; use XML::Simple; use POSIX qw(strftime); our $session; { my $dest_target = $ARGV[0]; my $api = new freeswitch::API(); my $xml = new XML::Simple; my $chan_xml = $xml->XMLin($api->executeString("show detailed_calls as xml"),KeyAttr => 'row', ForceArray => ['row']); my %candidates; my $result; foreach my $row (@{$chan_xml->{row}}) { if ($row->{callstate} eq "RINGING" && $row->{dest} eq $dest_target) { $candidates{ $row->{created_epoch} - 1000 } = $row->{call_uuid}; #In the case of a tie, we want to pickup ringing calls before held calls... next; } elsif ($row->{callstate} eq "HELD" && $row->{b_sent_callee_num} eq $dest_target ) { $candidates{ $row->{created_epoch} } = $row->{b_uuid}; next; } elsif ($row->{b_callstate} eq "HELD" && $row->{b_callee_num} eq $dest_target ) { $candidates{ $row->{b_created_epoch} } = $row->{uuid}; next; } } if( keys( %candidates ) == 0) { $result = "[Intercept] No suitable channel to intercept on extension $dest_target."; freeswitch::consoleLog("INFO","$result\n"); } else { my $user = $session->getVariable('caller_id_name'); my $cid_num = $session->getVariable('caller_id_number'); for my $winner ( sort keys %candidates ) { my $uuid= $candidates{$winner}; $result = "[Intercept]User:$user" . "[" . "$cid_num" . "] intercepting Extension:$dest_target" . ". UUID:" . "$uuid" . "\n"; freeswitch::consoleLog("INFO","$result\n"); $session->execute("intercept",$uuid); last; } } 1; } Enjoy! -Frank
Thanks for the positive comment. =D BTW, that reminds me. I added a new pickup endpoint that you might want to have a look at as well. It lets you add a special pickup endpoint to a forked dial so say you are calling ext 1000, you can do <action application="bridge" data="user/1000,pickup/1000"/> Then from another call you can execute: <action application="pickup" data="1000"/> And your channel will be returned to that unanswered originate. We should probably get it documented. On Sat, Jun 23, 2012 at 9:29 AM, Frank Busalacchi Jr <frankjr@mcpeekdodge.com> wrote:
Over the last 6 months, I have received all kinds of support and help from the freeswitch community (both IRC and this list) in learning to control this incredible piece of software. Im truly grateful, thanks everyone.
I run freeswitch at my car dealership. We have approximately 40 sip extensions, an ATT voip connection, and 6 analog outbound fax lines provided by freetdm. Prior to freeswitch, I was running an old Lucent/Avaya Merlin "key" system. One of the features of the Merlin was that it was pretty easy to do "directed callpick". In essence, you would dial *7 + extension you wanted to pickup. Provided the call was either on hold or ringing at that extension, you would pick it up. When I first started using Freeswitch, I was very disappointed in the directed callpick. Before I realized that the call pickup that was built into the sample dialplan was really just an example to show a simple possibility for using intercept. I was convinced that it was a totally useful feature. I couldn't believe that was as good as it got... My problem with the directed pickup that is in the sample dialplan is that it can steal a live call right from another extension, as well as it really only works with the most recent call on that extension.
Then I woke up, and rolled my own 8-) . In an effort to provide just another example, I wanted to share the piece of code I've developed. I will warn that this was the first perl script I have ever written, and probably is pretty ugly, but it seems to work perfectly in our environment. Bottom line, do what you want with it...I'm just trying to help other beginner's like myself:
To all beginners: You will need to build and enable mod_perl for this to work...
First, we need an entry in your XML dialplan to see the user's request to interecept a "held" or "ringing" extension. The only 4 digit extensions at my company are internal ones so I match on ** + 4-digit-extension.
In the xML dialplan:
<extension name="intercept-ext"> <condition field="destination_number" expression="^\*\*(\d{4})$"> <action application="answer"/> <action application="perl" data="/usr/local/freeswitch/scripts/myintercept.pl $1"/> <action application="sleep" data="2000"/> </condition> </extension>
Then, we need the actual perl script:
/usr/local/freeswitch/scripts/myintercept.pl:
# This is code to allow us to use intercept to grab only calls that are on hold or ringing. # # by Frank Busalacchi 2012-06-13
use strict; use Switch; use Data::Dumper; use XML::Simple; use POSIX qw(strftime); our $session;
{ my $dest_target = $ARGV[0];
my $api = new freeswitch::API(); my $xml = new XML::Simple; my $chan_xml = $xml->XMLin($api->executeString("show detailed_calls as xml"),KeyAttr => 'row', ForceArray => ['row']);
my %candidates; my $result;
foreach my $row (@{$chan_xml->{row}}) { if ($row->{callstate} eq "RINGING" && $row->{dest} eq $dest_target) { $candidates{ $row->{created_epoch} - 1000 } = $row->{call_uuid}; #In the case of a tie, we want to pickup ringing calls before held calls... next; }
elsif ($row->{callstate} eq "HELD" && $row->{b_sent_callee_num} eq $dest_target ) { $candidates{ $row->{created_epoch} } = $row->{b_uuid}; next; }
elsif ($row->{b_callstate} eq "HELD" && $row->{b_callee_num} eq $dest_target ) { $candidates{ $row->{b_created_epoch} } = $row->{uuid}; next; } }
if( keys( %candidates ) == 0) { $result = "[Intercept] No suitable channel to intercept on extension $dest_target."; freeswitch::consoleLog("INFO","$result\n"); }
else { my $user = $session->getVariable('caller_id_name'); my $cid_num = $session->getVariable('caller_id_number');
for my $winner ( sort keys %candidates ) {
my $uuid= $candidates{$winner};
$result = "[Intercept]User:$user" . "[" . "$cid_num" . "] intercepting Extension:$dest_target" . ". UUID:" . "$uuid" . "\n"; freeswitch::consoleLog("INFO","$result\n"); $session->execute("intercept",$uuid); last; } } 1; }
Enjoy!
-Frank
_________________________________________________________________________ Professional FreeSWITCH Consulting Services: consulting@freeswitch.org http://www.freeswitchsolutions.com
FreeSWITCH-powered IP PBX: The CudaTel Communication Server http://www.cudatel.com
Official FreeSWITCH Sites http://www.freeswitch.org http://wiki.freeswitch.org http://www.cluecon.com
Join Us At ClueCon - Aug 7-9, 2012
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
-- Anthony Minessale II FreeSWITCH http://www.freeswitch.org/ ClueCon http://www.cluecon.com/ Twitter: http://twitter.com/FreeSWITCH_wire AIM: anthm MSN:anthony_minessale@hotmail.com GTALK/JABBER/PAYPAL:anthony.minessale@gmail.com IRC: irc.freenode.net #freeswitch FreeSWITCH Developer Conference sip:888@conference.freeswitch.org googletalk:conf+888@conference.freeswitch.org pstn:+19193869900
Tony, I will get it documented tomorrow. Will create a page just for it. Regards, -- João Mesquita Sent with Sparrow (http://www.sparrowmailapp.com/?sig) On Sunday, June 24, 2012 at 10:54 PM, Anthony Minessale wrote:
Thanks for the positive comment. =D
BTW, that reminds me. I added a new pickup endpoint that you might want to have a look at as well. It lets you add a special pickup endpoint to a forked dial so say you are calling ext 1000, you can do
<action application="bridge" data="user/1000,pickup/1000"/>
Then from another call you can execute:
<action application="pickup" data="1000"/> And your channel will be returned to that unanswered originate.
We should probably get it documented.
On Sat, Jun 23, 2012 at 9:29 AM, Frank Busalacchi Jr <frankjr@mcpeekdodge.com (mailto:frankjr@mcpeekdodge.com)> wrote:
Over the last 6 months, I have received all kinds of support and help from the freeswitch community (both IRC and this list) in learning to control this incredible piece of software. Im truly grateful, thanks everyone.
I run freeswitch at my car dealership. We have approximately 40 sip extensions, an ATT voip connection, and 6 analog outbound fax lines provided by freetdm. Prior to freeswitch, I was running an old Lucent/Avaya Merlin "key" system. One of the features of the Merlin was that it was pretty easy to do "directed callpick". In essence, you would dial *7 + extension you wanted to pickup. Provided the call was either on hold or ringing at that extension, you would pick it up. When I first started using Freeswitch, I was very disappointed in the directed callpick. Before I realized that the call pickup that was built into the sample dialplan was really just an example to show a simple possibility for using intercept. I was convinced that it was a totally useful feature. I couldn't believe that was as good as it got... My problem with the directed pickup that is in the sample dialplan is that it can steal a live call right from another extension, as well as it really only works with the most recent call on that extension.
Then I woke up, and rolled my own 8-) . In an effort to provide just another example, I wanted to share the piece of code I've developed. I will warn that this was the first perl script I have ever written, and probably is pretty ugly, but it seems to work perfectly in our environment. Bottom line, do what you want with it...I'm just trying to help other beginner's like myself:
To all beginners: You will need to build and enable mod_perl for this to work...
First, we need an entry in your XML dialplan to see the user's request to interecept a "held" or "ringing" extension. The only 4 digit extensions at my company are internal ones so I match on ** + 4-digit-extension.
In the xML dialplan:
<extension name="intercept-ext"> <condition field="destination_number" expression="^\*\*(\d{4})$"> <action application="answer"/> <action application="perl" data="/usr/local/freeswitch/scripts/myintercept.pl (http://myintercept.pl) $1"/> <action application="sleep" data="2000"/> </condition> </extension>
Then, we need the actual perl script:
/usr/local/freeswitch/scripts/myintercept.pl (http://myintercept.pl):
# This is code to allow us to use intercept to grab only calls that are on hold or ringing. # # by Frank Busalacchi 2012-06-13
use strict; use Switch; use Data::Dumper; use XML::Simple; use POSIX qw(strftime); our $session;
{ my $dest_target = $ARGV[0];
my $api = new freeswitch::API(); my $xml = new XML::Simple; my $chan_xml = $xml->XMLin($api->executeString("show detailed_calls as xml"),KeyAttr => 'row', ForceArray => ['row']);
my %candidates; my $result;
foreach my $row (@{$chan_xml->{row}}) { if ($row->{callstate} eq "RINGING" && $row->{dest} eq $dest_target) { $candidates{ $row->{created_epoch} - 1000 } = $row->{call_uuid}; #In the case of a tie, we want to pickup ringing calls before held calls... next; }
elsif ($row->{callstate} eq "HELD" && $row->{b_sent_callee_num} eq $dest_target ) { $candidates{ $row->{created_epoch} } = $row->{b_uuid}; next; }
elsif ($row->{b_callstate} eq "HELD" && $row->{b_callee_num} eq $dest_target ) { $candidates{ $row->{b_created_epoch} } = $row->{uuid}; next; } }
if( keys( %candidates ) == 0) { $result = "[Intercept] No suitable channel to intercept on extension $dest_target."; freeswitch::consoleLog("INFO","$result\n"); }
else { my $user = $session->getVariable('caller_id_name'); my $cid_num = $session->getVariable('caller_id_number');
for my $winner ( sort keys %candidates ) {
my $uuid= $candidates{$winner};
$result = "[Intercept]User:$user" . "[" . "$cid_num" . "] intercepting Extension:$dest_target" . ". UUID:" . "$uuid" . "\n"; freeswitch::consoleLog("INFO","$result\n"); $session->execute("intercept",$uuid); last; } } 1; }
Enjoy!
-Frank
_________________________________________________________________________ Professional FreeSWITCH Consulting Services: consulting@freeswitch.org (mailto:consulting@freeswitch.org) http://www.freeswitchsolutions.com
FreeSWITCH-powered IP PBX: The CudaTel Communication Server http://www.cudatel.com
Official FreeSWITCH Sites http://www.freeswitch.org http://wiki.freeswitch.org http://www.cluecon.com
Join Us At ClueCon - Aug 7-9, 2012
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org (mailto:FreeSWITCH-users@lists.freeswitch.org) http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
-- Anthony Minessale II
FreeSWITCH http://www.freeswitch.org/ ClueCon http://www.cluecon.com/ Twitter: http://twitter.com/FreeSWITCH_wire
AIM: anthm MSN:anthony_minessale@hotmail.com (mailto:anthony_minessale@hotmail.com) GTALK/JABBER/PAYPAL:anthony.minessale@gmail.com (mailto:anthony.minessale@gmail.com) IRC: irc.freenode.net (http://irc.freenode.net) #freeswitch
FreeSWITCH Developer Conference sip:888@conference.freeswitch.org (mailto:888@conference.freeswitch.org) googletalk:conf+888@conference.freeswitch.org (mailto:conf+888@conference.freeswitch.org) pstn:+19193869900
_________________________________________________________________________ Professional FreeSWITCH Consulting Services: consulting@freeswitch.org (mailto:consulting@freeswitch.org) http://www.freeswitchsolutions.com
FreeSWITCH-powered IP PBX: The CudaTel Communication Server http://www.cudatel.com
Official FreeSWITCH Sites http://www.freeswitch.org http://wiki.freeswitch.org http://www.cluecon.com
Join Us At ClueCon - Aug 7-9, 2012
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org (mailto:FreeSWITCH-users@lists.freeswitch.org) http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
I recently added some more details to this page: http://wiki.freeswitch.org/wiki/Misc._Dialplan_Tools_pickup
participants (4)
-
Anthony Minessale
-
Frank Busalacchi Jr
-
João Mesquita
-
Vik Killa