Toistinaseman mainostaminen APRS-asemille

Radioamatööriwikistä
Versio hetkellä 13. joulukuuta 2010 kello 12.10 – tehnyt >OH6KTT
Siirry navigaatioon Siirry hakuun


Scripti joka OH6RUC:llä tutkii aprs-rf.logia. Jos asema radiolla kuultu asema on lähempänä kuin 30km niin sille mainostetaan ripiitteriä puheella. Puhe tehdään festival puhesyntetisaattorilla. Tämä sivu on tynkä. Tämä sivu on täällä vain kertoakseen miten tuo on tehty koska joku kysyi sitä ircnetissä #RNET kanavalla.

#!/usr/bin/php -q
<?php
/*
    aprs-repeater-advertiser.php v1.01 - repeater advertiser to APRS users
    Copyright (C) 2010  Kari Karvonen <oh6ktt@toimii.net>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

*/
$aprxrflogfile 	= "/tmp/aprx-rf.log";
$stationdbfile	= "/tmp/oh6ruc-aprs-db.txt";
$repeater_call  = "OH6RUC"; /* need to match aprs-rf.log */
$repeater_lat	= "63.53666";
$repeater_lon	= "23.69180";
$floodprotect	= 60*60*24; /* after this time old station will be notified again. Seconds. */
$maxdistance	= 30; /* km */
$denytxfile	= "/tmp/ptt-on"; /* if this file exist, no announcement will be send */
$debug		= false;
$prefixwave	= "/opt/thelinkbox/wav/aprs-repeater-advertiser-1.wav"; /* wave before callsigns */
$suffixwave	= "/opt/thelinkbox/wav/aprs-repeater-advertiser-2.wav"; /* wave after callsigns */
$tempwavetxt 	= "/tmp/aprs-repeater-advertiser.txt";
$tempwave 	= "/tmp/aprs-repeater-advertiser.wav";

/* code begins */
$parserdb	= array();
$victims	= array();
$stationdb	= unserialize(@file_get_contents($stationdbfile));
if (empty($stationdb)) $stationdb = array();
$aprxrflog 	= @file($aprxrflogfile);
if ($aprxrflog == false) die("Cannot open $aprxrflogfile\n");

function decimal_distance($lat1 = "", $lon1 = "", $lat2 = "", $lon2 = "") {
        //$radius is determined using the following formula
        //(360 degrees)*(60 minutes per degree)*(1.852) km per minute
        //give a circumference of 40003.2 km
        //radius is circumference/(2*pi) which gives us 6637km or 3956miles
        $radius = 3956;
        $lat1 = deg2rad ($lat1);
        $lat2 = deg2rad ($lat2);
        $lon1 = deg2rad ($lon1);
        $lon2 = deg2rad ($lon2);
        //Haversine Formula (from R.W. Sinnott, "Virtues of the Haversine",
        //Sky and Telescope, vol. 68, no. 2, 1984, p. 159):
        $dlon = $lon2-$lon1;
        $dlat = $lat2-$lat1;
        $sinlat = sin($dlat/2);
        $sinlon = sin($dlon/2);
        $a = ($sinlat * $sinlat) + cos($lat1) * cos($lat2) * ($sinlon*$sinlon);
        $c = 2 * asin(min(1,sqrt($a)));
        $d = $radius * $c;
        return round($d,2);
}

for ($tmp = 0; $tmp < count($aprxrflog); $tmp++) {
        $line = $aprxrflog[$tmp];
        if (preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3}) '.$repeater_call.'    R (.+)>APOTC1,'.$repeater_call.'(.+):\!(.+)/', $line, $matches)) {
                $callsign = strtolower(trim($matches[8]));
                if (preg_match('/([0-9.]{7})N\/([0-9.]{8})E/',$matches[10],$plaincoords)) {
                        /* koordinaatteja ei ole pakattu */
                        $lat = floatval($plaincoords[1])/100;
                        $long = floatval($plaincoords[2])/100;
                } else {
                        /* koordinaatit on pakattu */            
                        $y1 = ord(substr($matches[10],1,1));
                        $y2 = ord(substr($matches[10],2,1));
                        $y3 = ord(substr($matches[10],3,1));
                        $y4 = ord(substr($matches[10],4,1));
                        $x1 = ord(substr($matches[10],5,1));
                        $x2 = ord(substr($matches[10],6,1));
                        $x3 = ord(substr($matches[10],7,1));
                        $x4 = ord(substr($matches[10],8,1));
                        $lat = 90 - (($y1-33) * 91*91*91 + ($y2-33) * 91*91 + ($y3-33) * 91 + $y4-33) / 380926;
                        $long = -180 + (($x1-33) * 91*91*91 + ($x2-33) * 91*91 + ($x3-33) * 91 + $x4-33) / 190463;
                }
                $distance = decimal_distance($repeater_lat, $repeater_lon, $lat, $long);
                $lastheard  =  mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
                $parserdb[$callsign] = array("lastheard" => $lastheard, "distance" => $distance);
        }
}

function callsign2finnish($callsign) {
	$chartospeech = array();
	$chartospeech["-"] = "viiva";
	$chartospeech["a"] = "aa";
	$chartospeech["b"] = "bee";
	$chartospeech["c"] = "see";
	$chartospeech["d"] = "dee";
	$chartospeech["e"] = "ee";
	$chartospeech["f"] = "äf";
	$chartospeech["g"] = "gee";
	$chartospeech["h"] = "hoo";
	$chartospeech["i"] = "hee";
	$chartospeech["j"] = "jii";
	$chartospeech["k"] = "koo";
	$chartospeech["l"] = "äl";
	$chartospeech["m"] = "äm";
	$chartospeech["n"] = "äm";
	$chartospeech["o"] = "oo";
	$chartospeech["p"] = "pee";
	$chartospeech["q"] = "kuu";
	$chartospeech["r"] = "är";
	$chartospeech["s"] = "äs";
	$chartospeech["t"] = "tee";
	$chartospeech["u"] = "uu";
	$chartospeech["v"] = "vee";
	$chartospeech["w"] = "tuplavee";
	$chartospeech["x"] = "äks";
	$chartospeech["y"] = "yy";
	$chartospeech["z"] = "tseta";
	$chartospeech["å"] = "oo";
	$chartospeech["ä"] = "ää";
	$chartospeech["ö"] = "öö";
	$chartospeech["1"] = "yks";
	$chartospeech["2"] = "kaks";
	$chartospeech["3"] = "kol";
	$chartospeech["4"] = "nel";
	$chartospeech["5"] = "viis";
	$chartospeech["6"] = "kuus";
	$chartospeech["7"] = "seiska";
	$chartospeech["8"] = "kasi";
	$chartospeech["9"] = "ysi";
	$chartospeech["0"] = "nolla";
	$msg = "";
	for ($tmp = 0; $tmp<strlen($callsign); $tmp++) {
		$character = substr($callsign,$tmp,1);
                /* don't say -9 */
		if ($character == "-") {
		        return $msg;
                }
		$aanne = $chartospeech[$character];
		$msg.= $aanne;		
	}
	return ($msg);
}

ksort($parserdb);
foreach ($parserdb as $callsign => $tiedot) {
	$distance = $tiedot["distance"];
	$lastheard = $tiedot["lastheard"];
	if ($debug) echo "Call $callsign. ";
	if (array_key_exists($callsign, $stationdb)) {
		if ($debug) echo "Found from stationdb. ";
		if ($stationdb[$callsign]["lastheard"]<(time()-$floodprotect && $lastheard>$stationdb[$callsign]["lastheard"])) {
		        if ($debug) echo "Floodprotect active. ";
		        if ($distance < $maxdistance) {
				/* Found in stationdb, too old ja inside circle */
				if ($debug) echo "Inside circle ($distance/$maxdistance). Update stationdb. Add to victims.";
				$victims[] = $callsign;
				$stationdb[$callsign]["lastheard"] = $lastheard;
				$stationdb[$callsign]["distance"] = $distance;
			} else {
				/* liian kaukana */
				if ($debug) echo "Outside circle ($distance/$maxdistance). Update stationdb.";
				$stationdb[$callsign]["lastheard"] = $lastheard;
				$stationdb[$callsign]["distance"] = $distance;
			}
		} else {
		        if ($debug) echo "Floodprotect active. Update stationdb. ";
                        $stationdb[$callsign]["lastheard"] = $lastheard;
                        $stationdb[$callsign]["distance"] = $distance;
		}
	} else {
		if ($debug) echo "Not found from stationdb. ";
		if ($distance < $maxdistance) {
			if ($debug) echo "Inside circle ($distance/$maxdistance). Update stationdb. Add to victims.";
			$victims[] = $callsign;
			$stationdb[$callsign]["lastheard"] = $lastheard;
			$stationdb[$callsign]["distance"] = $distance;
		} else {
			if ($debug) echo "Outside circle ($distance/$maxdistance). Ignore.";
		}
	}
	if ($debug) echo "\n";
}

file_put_contents($stationdbfile, serialize($stationdb));

$msg = "";
if (count($victims) == 0) {
        /* do nothing */
} else {
        if (!file_exists($denytxfile)) {
                @unlink($tempwavetxt);
                @unlink($tempwave);
                foreach ($victims as $victim) {
                        $msg .= callsign2finnish($victim).", ";
                }
                $msg=substr($msg,0,-2);
                file_put_contents($tempwavetxt, utf8_decode($msg));
                system("/usr/bin/text2wave -F 8000 < ".$tempwavetxt." -o ".$tempwave);
                system("/usr/sbin/tlbcmd \"port OH6RUC-Kaustinen; say -c ".$prefixwave."; say -c ".$tempwave."; say -c ".$suffixwave."\"");                
        } else {
                if ($debug) echo "Cannot advertise. Advertises denied by $denytxfile lock file.\n";
        }
}
?>