use strict; use warnings; use Net::SIP; use Net::SIP::Debug; use Getopt::Long qw(:config posix_default bundling); my $debug = 100; my $from = 'sip:100@192.168.56.1'; my $to = 'sip:*69@192.168.56.101'; my $user = '100'; my $pass = 'password1234'; my $outf = 'record.raw'; my $hangup = 30; # hang up after 30 sec my $dtmf = 'ABCD*#123--4567890'; Net::SIP::Debug->level($debug); my $leg = Net::SIP::Leg->new( addr => '192.168.56.1' ); my $ua = Net::SIP::Simple->new( from => $from, auth => [ $user,$pass ], leg => $leg, ); # invite peer my $peer_hangup; # did peer hang up? my $call = $ua->invite( $to, # echo back, use -1 instead of 0 for not echoing back init_media => $ua->rtp( 'recv_echo',$outf,0 ), recv_bye => \$peer_hangup, ) || die "invite failed: ".$ua->error; die "invite failed(call): ".$call->error if $call->error; my $dtmf_done; $call->dtmf( $dtmf, cb_final => \$dtmf_done ); my $stopvar; $ua->add_timer($hangup,\$stopvar); $ua->loop( \$stopvar,\$peer_hangup,\$dtmf_done ); # timeout or dtmf done, hang up if ( $stopvar || $dtmf_done ) { $stopvar = undef; $call->bye( cb_final => \$stopvar ); $ua->loop( \$stopvar ); }