Skinny: split the test into perl lib + bin
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@17124 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
338d64181f
commit
868530fc05
|
@ -0,0 +1,68 @@
|
||||||
|
# Copyright (c) 2010 Mathieu Parent <math.parent@gmail.com>.
|
||||||
|
# All rights reserved. This program is free software; you can redistribute it
|
||||||
|
# and/or modify it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
package Net::Skinny;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use IO::Socket;
|
||||||
|
use Net::Skinny::Protocol qw/:all/;
|
||||||
|
|
||||||
|
our(@ISA);
|
||||||
|
@ISA = qw(IO::Socket::INET);
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
shift->SUPER::new(PeerPort => 2000, @_);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub send_message
|
||||||
|
{
|
||||||
|
my $self = shift;
|
||||||
|
my $type = shift;
|
||||||
|
my $data = shift;
|
||||||
|
my $len = length($data)+4;
|
||||||
|
printf "Sending message (length=%d, type=%s (%X))", $len, Net::Skinny::Protocol::skinny_message_type2str($type), $type;
|
||||||
|
$self->send(
|
||||||
|
pack("VVV", $len, 0, $type).
|
||||||
|
$data);
|
||||||
|
printf ".\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub receive_message
|
||||||
|
{
|
||||||
|
my $self = shift;
|
||||||
|
my $buf;
|
||||||
|
$self->recv($buf, 4);
|
||||||
|
my $len = unpack("V", $buf);
|
||||||
|
printf "Receiving message (length=%d,", $len;
|
||||||
|
if($len < 4) {
|
||||||
|
printf "type=?).\n";
|
||||||
|
printf "Problem! Length is < 4.\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
$self->recv($buf, 4); #reserved
|
||||||
|
$self->recv($buf, 4); #type
|
||||||
|
my $type = unpack("V", $buf);
|
||||||
|
printf "type=%s (%X))", Net::Skinny::Protocol::skinny_message_type2str($type), $type;
|
||||||
|
if($len > 4) {
|
||||||
|
$self->recv($buf, $len-4);
|
||||||
|
}
|
||||||
|
printf ".\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub sleep
|
||||||
|
{
|
||||||
|
my $self = shift;
|
||||||
|
my $t = shift;
|
||||||
|
|
||||||
|
printf "Sleeping %d seconds", $t;
|
||||||
|
while(--$t){
|
||||||
|
sleep(1);
|
||||||
|
printf "." if $t % 10;
|
||||||
|
printf "_" unless $t % 10;
|
||||||
|
}
|
||||||
|
printf ".\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
|
@ -0,0 +1,10 @@
|
||||||
|
# Copyright (c) 2010 Mathieu Parent <math.parent@gmail.com>.
|
||||||
|
# All rights reserved. This program is free software; you can redistribute it
|
||||||
|
# and/or modify it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
package Net::Skinny::Message;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
# Copyright (c) 2010 Mathieu Parent <math.parent@gmail.com>.
|
||||||
|
# All rights reserved. This program is free software; you can redistribute it
|
||||||
|
# and/or modify it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
package Net::Skinny::Protocol;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
no strict "refs";
|
||||||
|
use warnings;
|
||||||
|
use Carp;
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
our @ISA = qw(Exporter);
|
||||||
|
our @EXPORT = qw(skinny_message_type2str);
|
||||||
|
|
||||||
|
my %const;
|
||||||
|
my %sub;
|
||||||
|
my $skinny_protocol_h = 'src/mod/endpoints/mod_skinny/skinny_protocol.h';
|
||||||
|
|
||||||
|
sub import {
|
||||||
|
shift;
|
||||||
|
my $callpkg = caller(0);
|
||||||
|
_find(@_);
|
||||||
|
my $oops;
|
||||||
|
my $all = grep /:all/, @_;
|
||||||
|
foreach my $sym ($all ? keys %sub : @_) {
|
||||||
|
if (my $sub = $sub{$sym}) {
|
||||||
|
*{$callpkg . "::$sym"} = $sub;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
++$oops;
|
||||||
|
carp(qq["$sym" is not exported by the Net::Skinny::Protocol module]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
croak("Can't continue after import errors") if $oops;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _find {
|
||||||
|
my $fh;
|
||||||
|
unless (open($fh, $skinny_protocol_h)) {
|
||||||
|
print STDERR "Can't open $skinny_protocol_h: $!\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while(<$fh>) {
|
||||||
|
if( /^#define\s+([\w_]+)\s+(0x[0-9a-f]+)\s*$/i) {
|
||||||
|
my ($name, $value) = ($1,hex($2));
|
||||||
|
$sub{$name} = sub () { $value };
|
||||||
|
$const{$name} = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@sub{@_};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub skinny_message_type2str {
|
||||||
|
my $message_type = shift;
|
||||||
|
|
||||||
|
keys %const;
|
||||||
|
while (my ($key, $value) = each %const) {
|
||||||
|
if($value == $message_type) {
|
||||||
|
return $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "UnknownMessage";
|
||||||
|
}
|
|
@ -1,8 +1,19 @@
|
||||||
#!/usr/bin/perl
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Copyright (c) 2010 Mathieu Parent <math.parent@gmail.com>.
|
||||||
|
# All rights reserved. This program is free software; you can redistribute it
|
||||||
|
# and/or modify it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
push @INC, 'src/mod/endpoints/mod_skinny';
|
||||||
|
}
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use IO::Socket;
|
|
||||||
|
use Data::Dumper;
|
||||||
|
use Net::Skinny;
|
||||||
|
use Net::Skinny::Protocol qw/:all/;
|
||||||
|
|
||||||
#Config
|
#Config
|
||||||
my $skinny_server = '127.0.0.1';
|
my $skinny_server = '127.0.0.1';
|
||||||
|
@ -11,69 +22,17 @@ my $device_ip = 10+256*(11+256*(12+256*13)); # 10.11.12.13
|
||||||
#======
|
#======
|
||||||
$| = 1;
|
$| = 1;
|
||||||
|
|
||||||
my $socket;
|
my $socket = Net::Skinny->new(
|
||||||
|
|
||||||
sub skinny_connect
|
|
||||||
{
|
|
||||||
$socket = IO::Socket::INET->new(
|
|
||||||
PeerAddr => $skinny_server,
|
PeerAddr => $skinny_server,
|
||||||
PeerPort => 2000,
|
PeerPort => 2000,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
sub skinny_send
|
if(!$socket) {
|
||||||
{
|
print "Unable to connect to server\n";
|
||||||
my $type = shift;
|
exit 1;
|
||||||
my $data = shift;
|
|
||||||
my $len = length($data)+4;
|
|
||||||
printf "Sending message (length=%d, type=%X)", $len, $type;
|
|
||||||
$socket->send(
|
|
||||||
pack("VVV", $len, 0, $type).
|
|
||||||
$data);
|
|
||||||
printf ".\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub skinny_recv
|
|
||||||
{
|
|
||||||
my $buf;
|
|
||||||
$socket->recv($buf, 4);
|
|
||||||
my $len = unpack("V", $buf);
|
|
||||||
printf "Receiving message (length=%d,", $len;
|
|
||||||
if($len < 4) {
|
|
||||||
printf "type=?).\n";
|
|
||||||
printf "Problem! Length is < 4.\n";
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
$socket->recv($buf, 4); #reserved
|
|
||||||
$socket->recv($buf, 4); #type
|
|
||||||
my $type = unpack("V", $buf);
|
|
||||||
printf "type=%X)", $type;
|
|
||||||
if($len > 4) {
|
|
||||||
$socket->recv($buf, $len-4);
|
|
||||||
}
|
|
||||||
printf ".\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub skinny_sleep
|
|
||||||
{
|
|
||||||
my $t = shift;
|
|
||||||
|
|
||||||
printf "Sleeping %d seconds", $t;
|
|
||||||
while(--$t){
|
|
||||||
sleep(1);
|
|
||||||
printf "." if $t % 10;
|
|
||||||
printf "_" unless $t % 10;
|
|
||||||
}
|
|
||||||
printf ".\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
#
|
$socket->send_message(REGISTER_MESSAGE, # Register
|
||||||
# =============================================================================
|
|
||||||
skinny_connect();
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
skinny_send(0x0001, # Register
|
|
||||||
pack("a16VVVVV",
|
pack("a16VVVVV",
|
||||||
$device_name,
|
$device_name,
|
||||||
0, # userId;
|
0, # userId;
|
||||||
|
@ -82,48 +41,41 @@ skinny_send(0x0001, # Register
|
||||||
7, # deviceType;
|
7, # deviceType;
|
||||||
0, # maxStreams;
|
0, # maxStreams;
|
||||||
));
|
));
|
||||||
skinny_recv(); # RegisterAck
|
$socket->receive_message(); # RegisterAck
|
||||||
|
|
||||||
skinny_send(0x0002, # Port
|
$socket->send_message(0x0002, # Port
|
||||||
pack("n", 2000
|
pack("n", 2000
|
||||||
));
|
));
|
||||||
|
|
||||||
skinny_send(0x002b, # HeadSetStatus
|
$socket->send_message(HEADSET_STATUS_MESSAGE,
|
||||||
pack("V",
|
pack("V",
|
||||||
2, # Off
|
2, # Off
|
||||||
));
|
));
|
||||||
|
|
||||||
skinny_recv(); # CapabilitiesReq
|
$socket->receive_message(); # CapabilitiesReq
|
||||||
skinny_send(0x0010, # CapabilitiesRes
|
$socket->send_message(CAPABILITIES_RES_MESSAGE,
|
||||||
pack("V"."Vva10"."Vva10",
|
pack("V"."Vva10"."Vva10",
|
||||||
2, # count
|
2, # count
|
||||||
2, 8, "", # codec, frames, res
|
2, 8, "", # codec, frames, res
|
||||||
4, 16, "", # codec, frames, res
|
4, 16, "", # codec, frames, res
|
||||||
));
|
));
|
||||||
|
|
||||||
skinny_send(0x000e, # ButtonTemplateReqMessage
|
$socket->send_message(BUTTON_TEMPLATE_REQ_MESSAGE, "");
|
||||||
"");
|
$socket->receive_message(); # ButtonTemplateMessage
|
||||||
skinny_recv(); # ButtonTemplateMessage
|
|
||||||
|
|
||||||
skinny_send(0x0028, # SoftKeyTemplateReq
|
$socket->send_message(SOFT_KEY_TEMPLATE_REQ_MESSAGE, "");
|
||||||
"");
|
$socket->receive_message(); # SoftKeyTemplateRes
|
||||||
skinny_recv(); # SoftKeyTemplateRes
|
|
||||||
|
|
||||||
skinny_send(0x0025, # SoftKeySetReq
|
$socket->send_message(SOFT_KEY_SET_REQ_MESSAGE, "");
|
||||||
"");
|
$socket->receive_message(); # SoftKeySetRes
|
||||||
skinny_recv(); # SoftKeySetRes
|
|
||||||
|
|
||||||
skinny_send(0x000B, # LineStatReq
|
$socket->send_message(LINE_STAT_REQ_MESSAGE, pack("V", 1));
|
||||||
pack("V", 1));
|
$socket->receive_message(); # LineStat
|
||||||
skinny_recv(); # LineStat
|
|
||||||
|
|
||||||
skinny_send(0x002D, # RegisterAvailableLines
|
$socket->send_message(REGISTER_AVAILABLE_LINES_MESSAGE, pack("V", 2));
|
||||||
pack("V", 2
|
|
||||||
));
|
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
skinny_sleep(20);
|
$socket->sleep(20);
|
||||||
skinny_send(0x0000, # keepalive
|
$socket->send_message(KEEP_ALIVE_MESSAGE, "");
|
||||||
"");
|
$socket->receive_message(); # keepaliveack
|
||||||
skinny_recv(); # keepaliveack
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue