The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Net::Bluetooth;
$| = 1;

#### This program connects to a specific GPS device
#### and continuously prints out data received.

#### List all remote devices in the area.
my $device_ref = get_remote_devices();
die "No devices found!\n" unless(defined($device_ref));

my $g_addr = undef;
#### Search for my GPS device and set the address.
#### My GPS device is named "BT GPS" so I just match
#### against that. You could match against your devices 
#### name just hardcode the address.
foreach $addr (keys %$device_ref) {
	$g_addr = $addr if($device_ref->{$addr} =~ /BT GPS/i);
	#### Print out all the devices for fun
        print "Address: $addr Name: $device_ref->{$addr}\n";
}
die "GPS not found\n" unless(defined($g_addr));

my $port = 0;
#### Search for the serial port service.
#### This is what my GPS device uses to transfer data.
#### The serial port UUID is 0x1101.
my @sdp_array = sdp_search($g_addr, "1101", "");
foreach $rec_ref (@sdp_array) {
        foreach $key (keys %$rec_ref) {
		#### Set the RFCOMM port
		$port = $rec_ref->{$key} if($key =~ /RFCOMM/);
		#### Print out all attributes for fun
                print "Key: $key Value: $rec_ref->{$key}\n";
        }
}

die "Service not found!\n" if($port == 0);

#### Create a socket and connect to the device.
my $obj = Net::Bluetooth->newsocket("RFCOMM");
die "socket error: $!\n" unless(defined($obj));
die "connect error: $!\n" if($obj->connect($g_addr, $port) != 0);

#### Create a Perl filehandle for reading and writing.
*SERVER = $obj->perlfh();
my $amount = 1;
#### Loop until user exits program. 
while($amount > 0) {
	$amount = read(SERVER, $buf, 512);
	#### Parse the GPGGA string and print values we want.
	if($buf =~ /\$GPGGA,(.+?)\n/) {
		my $gps_string = $1;
		my ($lat, $lng, $alt) = (split(/\,/, $gps_string))[1, 3, 8];
		print "Latitude:   $lat\n";
		print "Longitude:  $lng\n";
		print "Altitude:   $alt\n";
		print "\n\n";
	}
}
close(SERVER);