#!/usr/bin/env perl use strict; use warnings; use 5.010; use IO::Socket; use POSIX qw(strftime); # '6300120090806 094541 AOCPL|AA23581001108432|ACsipuser|ADSIPK1|', # '6300120090806 094541Y AOCPL|AA23529001223638|ACsipuser|ADSIPK1|', # '6300120090806 094541 Y AOCPL|AA23529000035676|ACsipuser|ADSIPK1|', # '6300120090806 094541 Y AOCPL|AA23529001223638|ACsipuser|ADSIPK1|', # '6300120090806 094541 Y AOCPL|AA23529000035676|ACsipuser|ADSIPK1|', # '6300120090806 094541 Y AOCPL|AA23529000035676|ACsipuser|ADSIPK1|', # '6300120090806 094541 Y AOCPL|AA23529000035676|ACsipuser|ADSIPK1|', my $sequence = 0; my $login_message = [ '9300CNSIPTEST|COSIPK1|CPCPL|' ]; my $terminator = chr(0x0d) . chr(0x0a); my $date; my @messages = ($login_message, [ '11YN', 'DATE', '20110828 093005AO|AA23529001223656|AB502326000376|AC|AD|'], [ '11YN', 'DATE', '20110828 093005AO|AA23529000033739|AB502326000363|AC|AD|'], [ '09N', 'DATE', '20091023 093207AP|AO|AB502326000376|ACSIPK1|'], [ '09N', 'DATE', '20091023 093207AP|AO|AB502326000363|ACSIPK1|'], # logout [ '9900302.00' ], ); my $socket = IO::Socket::INET->new(PeerAddr => 'localhost', PeerPort => 6001, Proto => 'tcp', Type => SOCK_STREAM) or die "Could not connect : $@"; $socket->autoflush(1); for my $m_arr (@messages) { my $req = q{}; for my $chunk ( @{$m_arr} ) { if ($chunk eq 'DATE') { $req .= sipdatetime(); } else { $req .= $chunk; } } $req .= add_checksum($req); print "Request:$req\n"; $req .= $terminator; $socket->send($req); my $response; $socket->recv($response, 1024); $response=~s/\x0d/[0d]/g; $response=~s/\x0a/[0a]/g; print "Response:$response\n"; } close $socket; sub add_checksum { my $msg_buf = shift; my $seq = "AY$sequence" . 'AZ'; ++$sequence; if ($sequence == 10) { $sequence = 0; } $msg_buf .= $seq; my $cksum = checksum($msg_buf); $seq .= sprintf '%04.4X', $cksum; return $seq; } sub checksum { my $pkt = shift; return (-unpack('%16c*', $pkt) & 0xFFFF); } sub sipdatetime { my $now_string = strftime '%Y%m%d %H%M%S', localtime; return $now_string; }