Listing of socket_udp_srv_parser.pl


#!/usr/bin/perl -w
#
# This program receives UDP datagrams from Aspicore GSM Tracker,
# parses and prints them to the console
#
# Tested with perl, version 5.005_03 built for MSWin32-x86-object
# Binary build 518 provided by ActiveState Tool Corp. http://www.ActiveState.com
# Built 13:14:00 Jun 24 1999

require 5.003;
use strict;
BEGIN { $ENV{PATH} = '/usr/ucb:/bin' }
use Socket;
                                   
sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" } 

sub parsedgram {
  my $datagram = shift;

  $datagram  =~ s/\r//g;  # remove  characters 

  # extract IMEI
  my $phone_id;
  if ($datagram =~ /IMEI (\d+)\n/) {
    $phone_id = $1;
  }
  if (defined $phone_id) {
    print "phone_id: <$phone_id>\n";
  }

  # extract Label
  my $label;
  if ($datagram =~ /\nLabel ([\S ]*)\n/) {
    $label = $1;
  }
  if (defined $label) {
    print "label: <$label>\n";
  }

  # extract the entire NMEA sentence
  my $nmea;
  my ( $utc_time, $status, $lat_deg_part, $lat_min_part, $lat_n_or_s, 
       $long_deg_part, $long_min_part, $long_e_or_w, $speed_knots,
       $course_deg, $utc_date );
  my ( $latitude, $longitude );

  if ($datagram =~ /\n(\$GPRMC,[\S ]*)\n/) {
    $nmea = $1;
  }
  if (defined $nmea) {
    print "NMEA: <$nmea>\n";

    # extract individual NMEA fields
    if ($datagram =~ /\n\$GPRMC,([\d\.]*),([AV]),(\d\d)([\d\.]*),([NS]),(\d\d\d)([\d\.]*),([EW]),([\d\.]*),([\d\.]*),(\d\d\d\d\d\d),[\S ]*\n/) {
        $utc_time = $1;
        $status = $2;
        $lat_deg_part = $3;
        $lat_min_part = $4;
        $lat_n_or_s = $5;
        $long_deg_part = $6;
        $long_min_part = $7;
        $long_e_or_w = $8;
        $speed_knots = $9;
        $course_deg = $10;
        $utc_date = $11;

        # convert latitude into decimal degrees
        if ($lat_n_or_s =~ /S/) {
            $latitude = "-";
        }
        else {
            $latitude = "";
        }
        $latitude = $latitude . ($lat_deg_part + ($lat_min_part / 60));
        print "latitude: <$latitude>\n";

        # convert longitude into decimal degrees
        if ($long_e_or_w =~ /W/) {
            $longitude = "-";
        }
        else {
            $longitude = "";
        }
        $longitude = $longitude . ($long_deg_part + ($long_min_part / 60));
        print "longitude: <$longitude>\n";
    }

  } # if (defined $nmea)

} 


my $port = shift || 1002;
my $proto = getprotobyname('udp');
socket(SOCKET, PF_INET, SOCK_DGRAM, $proto) || die "socket: $!";
bind(SOCKET, sockaddr_in($port, INADDR_ANY)) or die "bind: $!";

logmsg "server started on port $port";

my ( $hisiaddr, $hispaddr, $host, $rdatagram);

# loop forever
while (1) {
    $rdatagram = '';
    ($hispaddr = recv(SOCKET, $rdatagram, 260, 0))        || die "recv: $!";
    ($port, $hisiaddr) = sockaddr_in($hispaddr);
    $host = gethostbyaddr($hisiaddr, AF_INET);
    print "\n";
    logmsg "connection from $host [", 
            inet_ntoa($hisiaddr), "] at port $port";
    # print $rdatagram;
    parsedgram $rdatagram;
}

This file was generated by Gabriel Knoy's perl2html script.