# SMPP from Perl to Ruby

**URL:** <https://www.ruby-forum.com/t/smpp-from-perl-to-ruby/189012>\
**Category:** Ruby\
**Created:** [May 21, 2010, 11:13pm UTC](https://www.ruby-forum.com/t/smpp-from-perl-to-ruby/189012 "2010-05-21T23:13:17Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![macanab](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/839c29/32.png) [@macanab](https://www.ruby-forum.com/u/macanab)\
**Post date:** [May 21, 2010, 11:13pm UTC](https://www.ruby-forum.com/t/smpp-from-perl-to-ruby/189012/1 "2010-05-21T23:13:17Z")

</div>

I have this code in perl to send SMS via SMPP

Can somebody help me to translated to Ruby

I try the ruby-SMPP but it doesnt work well and i need it deploy it on  
SUNOS 3

Please help

#!/usr/bin/perl -w

use IO::Socket;

$SMSCIP = ‘localhost’;  
$SMSCPORT = ‘9988’;  
$SYSID = ‘user’;  
$SYSTYPE = ‘smpp’;  
$PWD = ‘password’;

$LSYSID = length($SYSID);  
$LSYSID++;  
$LSYSTYPE = length($SYSTYPE);  
$LSYSTYPE++;  
$LPWD = length($PWD);  
$LPWD++;

$SYSID = pack(“a$LSYSID”,$SYSID);  
$SYSTYPE = pack(“a$LSYSTYPE”,$SYSTYPE);  
$PWD = pack(“a$LPWD”,$PWD);  
$ADDR\_TON = pack(“C”, 0);  
$ADDR\_NPI = pack(“C”, 0);  
$INT\_VERS = pack(“C”, 52);  
$ADDR\_RANG = pack(“C”, 0);

@SubmitSM\_resp = ();  
$phonenumber = $ARGV[0];  
$message = $ARGV[1];  
$origin = $ARGV[2];

my $sock = new IO::Socket::INET (  
PeerAddr =\> $SMSCIP,  
PeerPort =\> $SMSCPORT,  
Proto =\> ‘tcp’,  
); die “Could not create socket: $!\n” unless $sock;

$sock-\>autoflush(1);

########### START SEQUENCE ##############

$flag = 0;  
&SendBindTransmit;  
$RBTStat = &ReadBindTransmit;  
if ($RBTStat ne “00000000”) {

# print “Bind transmitter OK\n”;

$flag = 1;  
print “Bind transmitter response returned status code $RBTStat for  
$phonenumber\n”;  
}  
&SendSubmitSM($phonenumber, $message, $origin);  
@SubmitSM\_resp = &ReadSubmitSM;  
if ($SubmitSM\_resp[0] ne “00000000”) {

# print “Submit message OK, message ID is $SubmitSM\_resp[1]\n”;

$flag = 1;  
print “Submit message response returned status code $SubmitSM\_resp[0]  
for $phonenumber\n”;  
}  
&SendUnbind;  
$RUBStat = &ReadUnbind;  
if ($RUBStat ne “00000000”) {

# print “Unbind OK\n”;

$flag = 1;  
print “Unbind response returned status code $RUBStat for  
$phonenumber\n”;  
}

if ($flag == 0) {  
print “Message: $message\nSent successfully to: $phonenumber\n”  
}  
else {  
print “Message unsuccessfully sent to $phonenumber\n”  
}

########### END SEQUENCE ################

close($sock);

sub SendBindTransmit {  
my $seq = 1;  
my $cst = 0;  
my $cln = 16;  
my $cid = “00000002”;  
my $PDU\_L = 20 + $LSYSID + $LSYSTYPE + $LPWD;  
my $PDU\_header = pack(“NNNN”, $PDU\_L, $cid, $cst, $seq);

my $PDU = $PDU\_header . $SYSID . $PWD . $SYSTYPE . $INT\_VERS .  
$ADDR\_TON . $ADDR\_NPI . $ADDR\_RANG;  
print $sock $PDU;  
}

sub SendSubmitSM {  
my $seq = 1;  
my $cst = 0;  
my $cln = 16;  
my $cid = “00000004”;  
my $sertype = “\0”;  
my $s\_addr\_ton = pack(“H2”,“05”);  
my $s\_addr\_npi = pack(“H2”,“01”);  
my $s\_addr = "$_[2]\0";  
my $d\_addr\_ton = pack(“H2”,“01”);  
my $d\_addr\_npi = pack(“H2”,“01”);  
my $d\_addr = $_[0] . “\0”;  
my $esm\_class = pack(“H2”,“01”);  
my $proto\_id = pack(“H2”,“00”);  
my $priority\_flg = pack(“H2”,“00”);  
my $sch\_del\_time = pack(“H2”,“00”);  
my $val\_period = pack(“H2”,“00”);  
my $reg\_del = pack(“H2”,“00”);  
my $replace\_ifpres = pack(“H2”,“00”);  
my $data\_coding = pack(“H2”,“00”);  
my $sm\_def\_msgid = pack(“H2”,“00”);  
my $mesg = $\_[1];  
my $mesg\_l = length($mesg);

my $PDU\_L = 28 + length($sertype) + length($s\_addr) + length($d\_addr)

- length($val\_period) + length($sch\_del\_time) + $mesg\_l;  
$mesg\_l = pack(“C”,$mesg\_l);  
my $PDU\_header = pack(“NNNN”, $PDU\_L, $cid, $cst, $seq);  
my $PDU = $PDU\_header . $sertype . $s\_addr\_ton . $s\_addr\_npi . $s\_addr  
. $d\_addr\_ton . $d\_addr\_npi . $d\_addr . $esm\_class . $proto\_id .  
$priority\_flg . $sch\_del\_time . $val\_period . $reg\_del . $replace\_ifpres  
. $data\_coding . $sm\_def\_msgid . $mesg\_l . $mesg;  
print $sock $PDU;  
}

sub ReadSubmitSM {  
my $byte;  
my $x = 0;  
my $seq;  
my $cst;  
my $cln;  
my $cid;  
my $curs = 16;  
my $msg\_id;

while ($x \< 4) {  
sysread($sock, $byte, 4);  
if ($x == 0) {  
$cln = unpack(‘L’,$byte);

# print 'PDU length: ',$cln," x:$x","\n";

```
  }
elsif ($x == 1) {
  $cid = unpack('H8',$byte);

```

# print 'Command ID: ',$cid," x:$x","\n";

```
  }
elsif ($x == 2) {
  $cst = unpack('H8',$byte);

```

# print 'Status of ReadSubmitSM: ',$cst," x:$x","\n";

```
  }
elsif ($x == 3) {
  $seq = unpack('L',$byte);

```

# print 'Sequence number: ',$seq," x:$x","\n";

```
  }
else {
  print 'Something wrong with subroutine ReadSubmitSM!, x=',"$x\n";
  }
$x++;
}

```

if ($curs \< $cln) {  
$msg\_id = GetCstring($sock);  
}  
return $cst, $msg\_id;  
}

sub ReadBindTransmit {  
my $byte;  
my $x = 0;  
my $seq;  
my $cst;  
my $cln;  
my $cid;  
my $curs = 16;  
my $sys\_id;  
my $ifver = “NA”;

while ($x \< 4) {  
sysread($sock, $byte, 4);  
if ($x == 0) {  
$cln = unpack(‘L’,$byte);

# print 'PDU length: ',$cln," x:$x","\n";

```
  }
elsif ($x == 1) {
  $cid = unpack('H8',$byte);

```

# print 'Command ID: ',$cid," x:$x","\n";

```
  }
elsif ($x == 2) {
  $cst = unpack('H8',$byte);

```

# print 'Status of ReadBindTransmit: ',$cst," x:$x","\n";

```
  }
elsif ($x == 3) {
  $seq = unpack('L',$byte);

```

# print 'Sequence number: ',$seq," x:$x","\n";

```
  }
else {
  print 'Something wrong with subroutine ReadBindTransmit!,

```

x=’,"$x\n";  
}  
$x++;  
}  
if ($curs \< $cln) {  
$sys\_id = GetCstring($sock);  
$curs = $curs + length($sys\_id);  
}  
if ($curs \< $cln) {  
$ifver = GetCstring($sock);  
}  
return $cst;  
}

sub GetCstring {  
my $chr = “”;  
my $SCK = $\_[0];  
my $cstr = “”;

while ($chr ne “\0”) {  
$chr = getc($SCK);  
$cstr = $cstr . $chr;  
}  
return $cstr;  
}

sub SendUnbind {  
my $seq = 1;  
my $cst = 0;  
my $cln = 16;  
my $cid = “00000006”;

print $sock pack(“NNNN”, $cln, $cid, $cst, $seq);  
}

sub ReadUnbind {  
my $byte;  
my $x = 0;  
my $y = 0;  
my $cln;  
my $cid;  
my $cst;  
my $seq;

while ($x \< 4) {  
sysread($sock, $byte, 4);  
if ($x == 0) {  
$cln = unpack(‘L’,$byte);

# print 'PDU length: ',$cln," x:$x","\n";

```
  }
elsif ($x == 1) {
  $cid = unpack('H8',$byte);

```

# print 'Command ID: ',$cid," x:$x","\n";

```
  }
elsif ($x == 2) {
  $cst = unpack('H8',$byte);

```

# print 'Status of ReadBindTransmit: ',$cst," x:$x","\n";

```
  }
elsif ($x == 3) {
  $seq = unpack('L',$byte);

```

# print 'Sequence number: ',$seq," x:$x","\n";

```
  }
else {
  print 'Something wrong with subroutine ReadUnbind!, x=',"$x\n";
  }
$x++;
}
return $cst;

```

}
