[aprssig] RE: aprs_packet_mon.pl
Andrew Rich vk4tec at tech-software.netThu Apr 7 04:26:28 UTC 2005
- Previous message: [aprssig] RE: aprs_packet_mon.pl
- Next message: [aprssig] RE: aprs_packet_mon.pl
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
connect to an aprs stream and decode the APRS payload -----Original Message----- From: Tyson S. [mailto:timbercutter at yahoo.com] Sent: Thursday, 7 April 2005 14:19 To: vk4tec at tech-software.net; TAPR APRS Mailing List Subject: Re: [aprssig] RE: aprs_packet_mon.pl What is this? and what can we do with it? --- Andrew Rich <vk4tec at tech-software.net> wrote: > Chris has added MIC code ....thanks Chris ! > > > > Here you go. I'm pretty much done with it - it pulls apart MIC-E and > also gets the position and course out of pretty much everything it > can. > > Cheers, > chris > > #!/usr/bin/perl > ############################################################# > # > # APRS Packet disassembly - Andrew Rich VK4TEC - Nov 2004 > # augmented by Chris Kantarjiev KG6VYD > # $Id: aprs_packet_mon.pl,v 1.4 2005/04/04 23:49:44 cak Exp $ > # > ############################################################# > my $trace = 1; > use Net::Telnet; > my $host = "concord.aprs.net"; > my $user = ""; > my $password = ""; > my $prompt = ""; > my (@data, $line); > my $t = new Net::Telnet(Timeout => '5',port => '10152'); > $t->errmode('return'); > $t->Net::Telnet::open($host) or die "Connection problem\n"; > print $t "user kg6vyd pass -1 vers aprsMon 1.1.2+ \n"; > print $t "# filter a/39/-123/37/-121 \n"; > while (<$t>) > { > $date=(`date +%d/%m/%Y" "%H:%M:%S`); > chop $date; > #system('clear'); > chomp; > @packet=(); > @digi=(); > @callsign=(); > @packet=split(/:/,$_,2); > @digi=split(/>/,$packet[0]); > @callsign=split(/>/,$_); > $email =''; > $webpage=''; > $program=''; > if (m/.*\s+([a-zA-Z0-9\+_.-]+)\@([a-zA-Z0-9.-]+)\s+/) > { > $email= $1."@".$2; > } > if (m/http:\/\/([a-zA-Z0-9.-]+)\s+/) > { > $webpage = $1; > } > > if (m/{UIV32/) > { > $program="UI-View 32 Bit"; > } > elsif (m/UI-View32/) > { > $program="UI-View 32 Bit"; > } > elsif (m/aprsd/) > { > $program="Linux aprsd server" > } > elsif (m/>APU/) > { > $program="UI-View" > } > elsif (m/>APW/) > { > $program="WinAPRS" > } > elsif (m/>APD/) > { > $program="Linux aprsd server" > } > elsif (m/>APX/) > { > $program="XASTIR" > } > elsif (m/>APZ/) > { > $program="Experimental" > } > elsif (m/DIGI_NED/) > { > $program="Digi - DIGI_NED"; > } > # ----------------------------------------------------- > if (m/^#/) > { > print "Routine : 000 - APRS server message\n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^\// || $packet[1]=~ m/^@/) > { > print "Routine : 001 - position report with timestamp"; > if ($packet[1] =~ m/^@/) { print " with messaging"; } print "\n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: ".substr($packet[1],1,7)."\n"; > print "Latitude : ".substr($packet[1],8,8)."\n"; > print "Symboltb : ".substr($packet[1],16,1)."\n"; > print "Lontitude: ".substr($packet[1],17,9)."\n"; > print "Symbol : ".substr($packet[1],25,1)."\n"; > if ( substr($packet[1],26,1) eq '_') > { > print "Comment : \n"; > print "Email : ".$email."\n"; > print "WX data : ".substr($packet[1],27,160)."\n"; > print "WindDIR : ".substr($packet[1],27,3)."\n"; > print "WindSPD : ".substr($packet[1],31,3)."\n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > else > { > print "Comment : ".substr($packet[1],26,160)."\n"; > print "Email : ".$email."\n"; > print "Course : ".substr($packet[1],27,3)."\n"; > print "Speed : ".substr($packet[1],31,3)."\n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^!/) > { > print "Routine : 002 - position report without timestamp\n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : ".substr($packet[1],1,8)."\n"; > print "Symboltb : ".substr($packet[1],9,1)."\n"; > print "Lontitude: ".substr($packet[1],10,9)."\n"; > print "Symbol : ".substr($packet[1],19,1)."\n"; > if ( substr($packet[1],19,1) eq '_') > { > print "Comment : ".substr($packet[1],20,160)."\n"; > print "Email : ".$email."\n"; > print "WX data : ".substr($packet[1],20,160)."\n"; > print "WindDIR : ".substr($packet[1],20,3)."\n"; > print "WindSPD : ".substr($packet[1],24,3)."\n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > else > { > print "Comment : ".substr($packet[1],20,160)."\n"; > print "Email : ".$email."\n"; > if (substr($packet[1],20,1) =~ /[0-9]/) { > print "Course : ".substr($packet[1],20,3)."\n"; > print "Speed : ".substr($packet[1],24,3)."\n"; > } else { > print "Course : \n"; > print "Speed : \n"; > } > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^=/) > { > print "Routine : 003 - position report without timestamp with > messaging\n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : ".substr($packet[1],1,8)."\n"; > print "Symboltb : ".substr($packet[1],9,1)."\n"; > print "Lontitude: ".substr($packet[1],10,9)."\n"; > print "Symbol : ".substr($packet[1],19,1)."\n"; > if ( substr($packet[1],19,1) eq '_') > { > print "Comment : ".substr($packet[1],20,160)."\n"; > print "Email : ".$email."\n"; > print "WX data : ".substr($packet[1],20,160)."\n"; > print "WindDIR : ".substr($packet[1],20,3)."\n"; > print "WindSPD : ".substr($packet[1],24,3)."\n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > else > { > print "Comment : ".substr($packet[1],20,160)."\n"; > print "Email : ".$email."\n"; > if (substr($packet[1],20,1) =~ /[0-9]/) { > print "Course : ".substr($packet[1],20,3)."\n"; > print "Speed : ".substr($packet[1],24,3)."\n"; > } else { > print "Course : \n"; > print "Speed : \n"; > } > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^:/) > { > print "Routine : 005 - aprs message\n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi1[0]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : \n"; > print "Symboltb : \n"; > print "Lontitude: \n"; > print "Symbol : \n"; > print "Comment : \n"; > print "Email : ".$email."\n"; > print "WX data : \n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^`/ || $packet[1]=~ m/^'/) > { > print "Routine : 006 - position report compressed\n"; > > # see http://www.tapr.org/tapr/html/Fmic-e.html for MIC-E format > details > # but see http://www.aprs-is.net/javAPRS/mice_parser.htm for reality > > my ($lat, $long) = ("<compressed>", "<compressed>"); > my ($latdeg, $longdeg) = (0,0); > my ($latmin, $longmin) = (0,0); > my ($lathun, $longhun) = (0,0); > my $longhund = 0; > my ($north, $west) = (0,0); > my ($symboltb, $symbol); > my ($speed, $heading) = ("", ""); > my $j = 0; > > > sub cnvtDest(@) { > my $inchar = @_[0]; > my $c = ($inchar - 0x30); # adjust to be 0 based > if ($c == 0x1c) { $c = 0x0a; } # change L to be space > if ($c > 0x10 && $c <= 0x1b) { $c--; } # A-K get decremented > # we don't support ambiguity > if (($c & 0x0f) == 0x0a) { $c &= 0xf0; }# convert space to 0 > return $c; > } > > # ignore the SSID, if any > my @nibs = unpack("c6", $digi[1]); > > my $isCustom = 0; > if (($nibs[0] >= ord('A') && $nibs[0] <= ord('K')) || > ($nibs[1] >= ord('A') && $nibs[1] <= ord('K')) || > ($nibs[2] >= ord('A') && $nibs[2] <= ord('K'))) { > $isCustom = 1; > } > > for ($j = 0; $j < 3; $j++) { > if ($isCustom) { > if ($nibs[$j] < ord('0') || > $nibs[$j] > ord('L') || > ($nibs[$j] > ord('9') && $nibs[$j] < ord('A'))) { > goto MICE; > } > } else { > if ($nibs[$j] < ord('0') || > $nibs[$j] > ord('Z') || > ($nibs[$j] > ord('9') && $nibs[$j] < ord('L')) || > ($nibs[$j] > ord('L') && $nibs[$j] < ord('P'))) { > goto MICE; > } > } > } > > for (;$j < 6; $j++) { > if ($nibs[$j] < ord('0') || > $nibs[$j] > ord('Z') || > ($nibs[$j] > ord('9') && $nibs[$j] < ord('L')) || > ($nibs[$j] > ord('L') && $nibs[$j] < ord('P'))) { > goto MICE; > } > } > > # parse the TO field > my $c = cnvtDest(@nibs[0]); > my $mes = 0; > if (($c & 0x10) != 0) { $mes = 0x08; } # set custom flag > if ($c > 0x10) { $mes += 0x04; } > $latdeg = ($c & 0x0f) * 10; > > $c = cnvtDest($nibs[1]); > if ($c > 0x10) { $mes += 0x02; } > $latdeg += ($c & 0x0f); > > $c = cnvtDest($nibs[2]); > if ($c > 0x10) { $mes ++; } > $mes = ~$mes & 0x7; # is sent in one's comp? > $latmin = ($c & 0x0f) * 10; > > $c = cnvtDest($nibs[3]); > if ($c >= 0x20) { $north = 1; } > $latmin += ($c & 0x0f); > > $c = cnvtDest($nibs[4]); > if ($c > 0x20) { $longhund = 1; } > $lathun = ($c & 0x0f) * 10; > > $c = cnvtDest($nibs[5]); > if ($c >= 0x20) { $west = 1; } > $lathun += ($c & 0x0f); > > $lat = sprintf("%d%02d.%02d", $latdeg, $latmin, $lathun); > if ($north) { $lat .= "N"; } else { $lat .= "S"; } > > my @nibs = unpack("c9", $packet[1]); > > # parse the icon > $symbol = $nibs[7]; > $symboltb = $nibs[8]; > > # parse the longitude > $longdeg = $nibs[1] - 28; > $longmin = $nibs[2] - 28; > $longsec = $nibs[3] - 28; > > if ($longdeg < 0 || $longdeg > 99 || > $longmin < 0 || $longmin > 99 || > $longsec < 0 || $longsec > 99) { > goto MICE; > } > > # adjust the degrees > if ($longhund) { $longdeg += 100; } > if ($longdeg > 190) { > $longdeg -= 190; > } elsif ($longdeg >= 180) { $longdeg -= 80; } > > # adjust the minutes > if ($longmin >= 60) { $longmin -= 60; } > > $long = sprintf("%d%02d.%02d", $longdeg, $longmin, $longhun); > if ($west) { $long .= "W"; } else { $long .= "E"; } > > # parse the speed/course > > my ($m, $s); > > $m = $nibs[5] - 28; > if ($m < 0 || $m > 97) { goto MICE; } > $s = $nibs[4] - 28; > if ($s < 0 || $s > 99) { goto MICE; } > $s = ($s*10) + ($m/10); > if ($s >= 800) { $s -= 800; } > > $d = $nibs[6] - 28; > if ($d < 0 || $d > 99) { goto MICE; } > $d = (($m%10) * 100) + $d; > if ($d >= 400) { $d -= 400; } > > if ($d > 0) { > $speed = sprintf("%d", $s); # speed (knots) > $heading = sprintf("%d", $d); > } > > MICE: > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : $lat \n"; > print "Symboltb : "; printf "%c\n", $symboltb; > print "Lontitude: $long \n"; > print "Symbol : "; printf "%c\n", $symbol; > print "Speed : $speed \n"; > print "Heading : $heading \n"; > print "Comment : Mic-E message "; > if ($isCustom) { print "<custom>"; } printf "%d\n", $mes; > print "Email : ".$email."\n"; > print "WX data : \n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > if (m/TMD700/) > { > print "Program : Tracker - TMD700\n"; > } > else > { > print "Program : Tracker\n"; > } > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^>/) > { > print "Routine : 007 - status report\n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : \n"; > print "Symboltb : \n"; > print "Lontitude: \n"; > print "Symbol : \n"; > print "Comment : ".substr($packet[1],1,160)."\n"; > print "Email : ".$email."\n"; > print "WX data : \n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^\?/) > { > print "Routine : 008 - aprs query\n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : \n"; > print "Symboltb : \n"; > print "Lontitude: \n"; > print "Symbol : \n"; > print "Comment : \n"; > print "Email : ".$email."\n"; > print "WX data : \n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^_/) > { > print "Routine : 009 - positionless weather report \n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : \n"; > print "Symboltb : \n"; > print "Lontitude: \n"; > print "Symbol : \n"; > print "Comment : \n"; > print "Email : ".$email."\n"; > print "WX data : ".substr($packet[1],1,160)."\n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^;/) > { > print "Routine : 010 - object \n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : \n"; > print "Symboltb : \n"; > print "Lontitude: \n"; > print "Symbol : \n"; > print "Comment : \n"; > print "Email : ".$email."\n"; > print "WX data : ".substr($packet[1],1,160)."\n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^\$GPRMC/) > { > my @nibs = split(/,/, $packet[1]); > print "Routine : 011 - gps RMC posit \n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: $nibs[1]\n"; > print "Latitude : $nibs[3] $nibs[4]\n"; > print "Symboltb : \n"; > print "Lontitude: $nibs[5] $nibs[6]\n"; > print "Symbol : \n"; > print "Comment : "; > if ($nibs[2] =~ /V/) { print "no fix!"; } ; print "\n"; > print "Speed : $nibs[7]\n"; > print "Heading : $nibs[8]\n"; > print "Email : ".$email."\n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^\$GPGGA/) > { > my @nibs = split(/,/, $packet[1]); > print "Routine : 011 - gps GGA posit \n"; > print "@nibs \n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: $nibs[1]\n"; > print "Latitude : $nibs[2] $nibs[3]\n"; > print "Symboltb : \n"; > print "Lontitude: $nibs[4] $nibs[5]\n"; > print "Symbol : \n"; > print "Comment : "; > if ($nibs[2] =~ /0/) { print "no fix!"; } ; print "\n"; > print "Email : ".$email."\n"; > print "WX data : \n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^\$GP/) > { > print "Routine : 011 - raw gps posit \n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : \n"; > print "Symboltb : \n"; > print "Lontitude: \n"; > print "Symbol : \n"; > print "Comment : ".substr($packet[1],0,160)."\n"; > print "Email : ".$email."\n"; > print "WX data : \n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^T/) > { > print "Routine : 012 - telemetry \n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : \n"; > print "Symboltb : \n"; > print "Lontitude: \n"; > print "Symbol : \n"; > print "Comment : ".substr($packet[1],0,160)."\n"; > print "Email : ".$email."\n"; > print "WX data : \n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > elsif ($packet[1]=~ m/^<IGATE/) > { > print "Routine : 013 - IGATE Status \n"; > print "DTG : $date \n"; > print "Packet : $_\n"; > print "From : $callsign[0]\n"; > print "Path : $digi[1]\n"; > print "Data : $packet[1]\n"; > print "Timestamp: \n"; > print "Latitude : \n"; > print "Symboltb : \n"; > print "Lontitude: \n"; > print "Symbol : \n"; > print "Comment : ".substr($packet[1],0,160)."\n"; > print "Email : ".$email."\n"; > print "WX data : \n"; > print "WindDIR : \n"; > print "WindSPD : \n"; > print "Webpage : ".$webpage."\n"; > print "Program : ".$program."\n"; > } > # ----------------------------------------------------- > else > { > print "Routine : 099 - Unknown packet\n"; > print "DTG : $date \n"; > print "Packet : $_ \n"; > #sleep 15; > } > # ----------------------------------------------------- > print "\n"; > } > $t->close(); > > > > > > _______________________________________________ > aprssig mailing list > aprssig at lists.tapr.org > https://lists.tapr.org/cgi-bin/mailman/listinfo/aprssig > Check out my APRS digipeater: http://map.findu.com/FIELDR __________________________________ Yahoo! Messenger Show us what our next emoticon should look like. Join the fun. http://www.advision.webevents.yahoo.com/emoticontest
- Previous message: [aprssig] RE: aprs_packet_mon.pl
- Next message: [aprssig] RE: aprs_packet_mon.pl
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the aprssig mailing list
