#!/usr/bin/perl -w # craptastic motorola v60 phonebook dumper # i'll be updating this to make it better... use strict; use Device::SerialPort; my %types = ( 0 => "Work", 1 => "Home", 2 => "Main", 3 => "Mobile", 4 => "Fax", 5 => "Pager", 6 => "Email" ); sub create_conf { my ($ob, $port); $port = shift; $ob = Device::SerialPort->new($port); die "Can't open serial port on $port: $^E\n" unless ($ob); $ob->baudrate(19200); $ob->alias("v60"); $ob->write_settings; $ob->save("v60.cfg"); undef $ob; print "config successfully written as v60.cfg.\n"; } print "\nmotorola v60 phonebook backup\n\n"; if ( $#ARGV != 1 ) { die "usage: $0 serialport dumpfile\n\n"; } my @str; my $yar; create_conf shift; my $po = tie (*FH, 'Device::SerialPort',"v60.cfg") or die "can't tie: $!\n"; print "setting phone to allow extended AT commands...\n"; print FH "AT+mode=2\r"; sleep 3; print "phone info:\n"; print FH "at+cgsn\r"; sleep 1; read FH, $yar, 100, 0; if ( $yar =~ /(ESN)(\d*)/ ) { print " esn: " . $2 . "\n"; } print FH "at+cgmr\r"; sleep 1; read FH, $yar, 100, 0; if ( $yar =~ /\+CGMR: "([^"]*)"/ ) { print " rev: $1\n"; } print FH "at+mpbr=?\r"; sleep 1; read FH, $yar, 100, 0; my $maxent; if ( $yar =~ /\+MPBR: 1-(\d*),(\d*),(\d*),\d*,\d*-\d*,(\d*)/ ) { $maxent = $1; print " max entries $maxent, maxlen phone $2, maxlen name $3, maxlen email $4\n"; } print "selecting main phonebook...\n"; print FH "at+cpbs=\"AD\"\r"; sleep 3; my $fh = shift; open OUT, ">$fh" or die "unable to open dump file: $!\n"; print "dumping phonebook to file \"$fh\"...\n"; my $i = 1; while( $i <= $maxent ) { #print "sending at+mpbr=$i\r\n"; print FH "at+mpbr=$i\r"; sleep 1; undef $yar; read FH, $yar, 100, 0; if ($yar =~ /\+MPBR: ([0-9]*),"([^"]*)",([0-9]*),"([^"]*)",([0-9]),([0-9])/ ) { my $num = $2; my $name = $4; my $typ = $types{$5}; if ($num =~ /([0-9]{3})([0-9]{3})([0-9]{4})/) { $num = "($1)$2-$3"; } print OUT "$name, $num, $typ\n"; } else { last; } $i++; } print "\n"; close OUT; print "resetting phone to normal at command set...\n"; print FH "at+mode=0\r"; sleep 1; undef $po; close FH or warn "close failed\n"; untie *FH;