Freifunk Location - Update via GPS

Kurze Info: Für einen Navilock NL-602U muss man folgendes Modul noch installieren:

opkg install kmod-usb-acm

Der Empfänger ist dann unter /dev/ttyACM0 zu finden.

Anderer Ansatz:

1.) Stell Dir vor, irgendwo im Internet (z.B. auf Dropbox oder in einem eigenen Webspace, halt irgendwas, wo man schnell 'ne Datei editieren/ablegen kann) liegt eine Datei Dueren-Event.txt mit folgendem Inhalt:

DN-Event-Alpha: 50.771, 6.081
DN-Event-Beta: 50.772, 6.082
DN-Event-Delta: 50.773, 6.083
DN-Event-Gamma: 50.774, 6.084

2.) Auf allen Event.Routern läuft ein Scriptchen, dass sich alle 10 Minuten diese Datei per Wget holt, sich die dort eingetragene Koordinate rausfrimmelt, und im Router hinterlegt.

3.) Nachdem eure Router bei einem Event aufgestellt sind, muss nur diese Datei einmal editiert und den Gegebenheiten angepasst werden, die Router ziehen sich dann die Info selbständig aus dem Internet. Das ist meiner Meinung nach sogar noch weniger Arbeit als mit dem GPS-Dongle rumzulaufen, und nach und nach (inkl. Wartepause auf den GPS-Fix) in die Router zu stecken.

Gruß
Frank

1 „Gefällt mir“

Der netmon/netmon2 (wird von Freifunk-Nordwest verwendet) ermöglicht das:

Es gibt auf der Community-Seite die Möglichkeit, User-Accounts anzulegen.
Und in diese Useraccounts kann man dann die „eigenen Router“ zuordnen (anhand der Mac-Adresse)

Sobald das passiert ist, kann man für „seine“ Router auf der Webseite zumindest den Namen und die Koordinaten einstellen.
Die Router selbst schauen rund alle Stunde nach, ob es Änderungen für sie gibt und ziehen sich diese dann in die lokale Config, so dass dann auch der Alfred „auf normalem Weg“ mit richtigen Daten versorgt wird.

Die Idee ist echt gut - ich ärgere mich gerade, warum ich nicht selber da drauf gekommen bin :smiley:
Für das Event dieses WE ist es zu spät (haben gerade die Router angeschlossen), aber bis zum nächsten werde ich auf jeden Fall mal ein kleines Skript schreiben und das hier oder auf Github posten! :slight_smile:

2 „Gefällt mir“

Dropbox könnte schwierig werden, da auch die statischen URLs immer auf 302er auf temporäre Dateien umgebogen werden, die dann aber https sind. Ich weiss nicht, ob es per http auch geht.

Hey, ich sehe aber noch wesentliches Ausbaupotential Deiner mobilen Technik.

Die Parkscheibe ist ja noch von Hand verstellbar und nicht mit dieser hier ersetzt:

:wink:

Ich habe es jetzt zum laufen bekommen :smile:
Kleine Ergänzung jeweils:
Als erstes im script (Falls kein GPS angeschloßen)
und im else-Teil (für den Fall ungültiger Koordinaten)
uci set gluon-node-info.@location[0].share_location=0;

Dann verschwindet der Knoten.

@M7880

Dann poste doch mal dein Script hier, ist bestimmt auch für andere interessant…

Hier ist es:
Das Device ist bei mir ttyACM0.
Muss man auf das jeweilige Gerät anpassen.

# Configure GPS
stty -F /dev/ttyACM0 raw 4800 cs8 clocal -parenb crtscts -cstopb;
uci set gluon-node-info.@location[0].share_location=0;

# Use GPS  as Stream
exec 4</dev/ttyACM0;
while true
do
    read this_line;
    nc=`echo $this_line | cut -d',' -f 1`;
    if [ "$nc" = '$GPRMC' ];
    then                           
        valid=`echo $this_line | cut -d',' -f 3`;
        if [ "$valid" = "A" ];
        then
            #First: Retrieve coordinate
            lat=`echo $this_line | cut -d',' -f 4`;
            lon=`echo $this_line | cut -d',' -f 6`;

            # Second: Determine if coordinate is oriented North/South or East/West
            latdir=`echo $this_line | cut -d',' -f 5`;
            londir=`echo $this_line | cut -d',' -f 7`;

            # Split DEGREES from coordinate
            latdeg="$(echo ${lat:0:2} | sed 's/^0*//')";
            londeg="$(echo ${lon:0:3} | sed 's/^0*//')";

            # Split MINUTES.SECONDS from coordinate
            latmin=`echo ${lat:2}`;
            lonmin=`echo ${lon:3}`;

            #Convert from Degree-Minutes to Decimal-Minutes
            latdec=$(awk -v l="$latmin" 'BEGIN {printf "%f", l/60}' | sed 's/^0*//')
            londec=$(awk -v l="$lonmin" 'BEGIN {printf "%f", l/60}' | sed 's/^0*//')

            #Use negative notation instead of North/South or East/West
            if [ $latdir = 'S' ];
            then
                latdeg="-"$latdeg;
            fi
            if [ $londir = 'W' ];
            then
                londeg="-"$londeg;
            fi
            echo "Position is valid Lat/Lon: "$latdeg$latdec   $londeg$londec;
            
            # Write to config
            uci set gluon-node-info.@location[0].share_location=1;
            uci set gluon-node-info.@location[0].latitude=$latdeg$latdec;
            uci set gluon-node-info.@location[0].longitude=$londeg$londec;
            # uci commit gluon-node-info; See Phip's comment below why this should not be done here.
            break;
        else
            echo "Position is Invalid..." $valid;
            uci set gluon-node-info.@location[0].share_location=0;
           break;
        fi
    fi
done <&4;
exit 0;

Cronjob einrichten (Überschreibt sämtliche vorhandene Cronjob-Einträge! Besser mit vi gucken/machen.):

echo '3 * * * * sh /usr/script/gps.sh > /dev/null' > /etc/crontabs/root

Mal als Anregung, falls man in der Nähe eines Freifunk-Knoten ist:

Um die ungefähre Position ohne GPS ermitteln, oder den GPS-Lock beschleunigen zu können, kann man auch direkt die Informationen der Nachbar-Knoten (auch deren Koordinaten) abfragen:

gluon-neighbour-info -d ff02::2:1001 -p 1001 -r nodeinfo -t 3 -i wlan0

Bei mehreren Nachbarn könnte man sogar überlegen, ob sich die Position mittels Triangulation ungefähr berechnen lässt. Aber da fehlt mir das notwendige Know-How :slight_smile:

2 „Gefällt mir“

Hm, ein einfacher erster Ansatz wäre:

eigener Breitengrad = Mittelwert(array(Breitengrade der Nachbar-Knoten))
eigener Längengrad = Mittelwert(array(Längengrade der Nachbar-Knoten))

Könnte man ja machen, wenn ein ungültiger Fix oder ein ganz schlechter DOP-Wert (Dilution of Precision – Wikipedia) vorliegt.

1 „Gefällt mir“

Die Array-Einträge könnte man noch mit der Empfangs-Stärke der einzelnen Nachbarn gewichten.

iw dev wlan0 station dump|grep -E "Station|signal:"

1 „Gefällt mir“

Joa, besser als nichts. Unsere Signalstärke ist natürlich von wahnsinnig vielen Parametern abhängig: Gerätetyp, Antennenausrichtung, Aufstellung, etc.

Aber ich könnte das ja mal testen …

2 „Gefällt mir“

Jau, kann man machen, ist aber in der Praxis untauglich: Je nachdem, ob jetzt 'ne dicke Frau links oder rechts vom Router steht, ändert sich die berechnete Location.

Ja, das tut’s. Ist zwar mathematisch nicht korrekt, weil wir über Punkte auf einer gekrümmten Fläche sprechen, aber für Distanzen unter 11 km ist der Fehler kleiner als das, was Single Float darstellen kann, also sch**ssendreck egal.

Wer’s Hardcore haben will: Wigle ist ne prima Datenbank für SSIDs und deren Location, auch die Modzilla Location Services sind ganz brauchbar, um die aktuelle Position anhand der WLANs in der Umgebung festuzulegen.

Aloa,

Danke für deine Anpassungen.

Ich habe das location of a routScript nun im folgenden Repo versioniert, deine Änderungen sind mit drinne.

Edit 1:
Ich wollte den original-Beitrag von mir diesbezüglich editieren. Leider geht das wohl nicht mehr…

Edit 2:
@M7880 Ich setze einfach mal voraus, dass du ebenfalls mit der Lizenzierung unter MIT einverstanden bist. Falls nicht, ziehe ich deine Änderungen zurück.

VG

1 „Gefällt mir“

Hi,

Sieht prima aus!

der Code enthält folgende Zeile:

# uci commit gluon-node-info; See Phip's comment below why this should not be done here.

Prima wäre es, wenn dieser „comment“ auch dort wirklich mit verewigt wäre.

Aloha,
danke für den Review, ich habe die betreffende Stelle ergänzt, indem ich auf den Post verlinke und kurz erkläre warum das nicht so ganz schlau ist.

Vielleicht wäre es sinnvoller die Zeile ganz zu löschen.

Sollte schon drin bleiben…
Sonst baut da irgendwer den commit ein.

Es gab hier (Münsterland ein Beta-Update)
v2015.1.2+160

Feststellungen:

  1. opkg update ist vor der Installation nötig.

  2. die Installation an sich ist nach jedem Update nötig.
    Dabei rebootet der Router gerne mal, Vorher klappte das.

  3. Am Ende ist dann zwar wohl alles installiert, funktioniert aber trotzdem nicht. Das GPS-Device taucht nicht auf…

@M7880

Ich hatte die Tage bei meinem MR3020 das problem, dass OPKG abhängigkeiten nicht auflösen wollte. Ich vermute dass lag daran, dass die Versionsnummern der kernel minimal abweichen. Mit dem --force-depends parameter (wie er genau hieß weiß ich jetzt nicht) ließen sich die kernel module jedoch installieren und das lief.