Ero sivun ”Toistinaseman mainostaminen APRS-asemille” versioiden välillä
Siirry navigaatioon
Siirry hakuun
>OH6KTT Ei muokkausyhteenvetoa |
>OH6KTT Ei muokkausyhteenvetoa |
||
Rivi 1: | Rivi 1: | ||
[[Category: R.NET]] | [[Category: R.NET]] | ||
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. | 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. | |||
<pre> | <pre> | ||
Rivi 11: | Rivi 9: | ||
<?php | <?php | ||
/* | /* | ||
aprs-repeater-advertiser.php v1. | aprs-repeater-advertiser.php v1.01 - repeater advertiser to APRS users | ||
Copyright (C) 2010 Kari Karvonen <oh6ktt@toimii.net> | Copyright (C) 2010 Kari Karvonen <oh6ktt@toimii.net> | ||
Rivi 161: | Rivi 159: | ||
if (array_key_exists($callsign, $stationdb)) { | if (array_key_exists($callsign, $stationdb)) { | ||
if ($debug) echo "Found from stationdb. "; | if ($debug) echo "Found from stationdb. "; | ||
if ($stationdb[$callsign]["lastheard"]<(time()-$floodprotect)) { | if ($stationdb[$callsign]["lastheard"]<(time()-$floodprotect && $lastheard>$stationdb[$callsign]["lastheard"])) { | ||
if ($debug) echo "Floodprotect active. "; | if ($debug) echo "Floodprotect active. "; | ||
if ($distance < $maxdistance) { | if ($distance < $maxdistance) { |
Versio 13. joulukuuta 2010 kello 12.10
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"; } } ?>