Freifunk Location - Update via GPS

Aloa,

Ich habe heute mal ein GPS an meinen TL-MR3020 Mobilrouter gehängt.

@MrMM hatte mal nach sowas gefragt.

Somit ist es möglich die Location dynamisch und automatisiert auf einen neuen Stand zu bringen.

##Was wird benötigt?

  • USB-GPS (Hier Navilock NL-302U)
  • Freifunk Router

##Konfiguration
Als erstes muss man dem Freifunkrouter beibringen, was USB-Geräte sind. Dafür habe ich mich an die Anleitung im openWRT-Wiki gehalten:
Nachinstalliert wurden die folgenden Module:

opkg install kmod-usb-core
opkg install kmod-usb-ohci
opkg install kmod-usb2
opkg install kmod-usb-serial-pl2303

Außerdem gibts noch das tool stty dazu:

opkg install coreutils-stty

Das angeschlossene GPS ist nun unter /dev/ttyUSB0 zu finden

mit stty stellt man die Baudrate passend ein, dass muss nach jedem Neustart erneut geschehen:

stty -F /dev/ttyUSB0 raw 4800 cs8 clocal -parenb crtscts -cstopb

nun lässt sich das GPS auslesen:

cat /dev/ttyUSB0

Das GPS spuckt nun NMEA Sätze aus. Das folgende Skript liest diese aus und schreibt diese in die config, es validiert anhand der GPS-Daten ob die Position korrekt ist, und schreibt auch nur in diesem Fall.

# Configure GPS
stty -F /dev/ttyUSB0 raw 4800 cs8 clocal -parenb crtscts -cstopb;
# Use GPS  as Stream
exec 4</dev/ttyUSB0;
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;
            break;
        fi
    fi
done <&4;
exit 0;

Das Skript kommt ohne Garantie auf Richtigkeit, für Fehler oder Schäden die durch dieses Entstehen übernehme ich keine Haftung. Es gelten die Lizenzbedingungen der MIT-License.

##Weiteres vorgehen
Nun ließe sich natürlich das Skript per Cronjob alle X Minuten ausführen. Das habe ich nicht weiter getestet.

##Edit 2015-01-07:
Wer die Serielle Schnitstelle die im Router verbaut ist nutzen möchte verwendet folgende Config für das Skript:

# Configure GPS
stty -F /dev/ttyATH0 raw 9600 cs8 clocal -parenb crtscts -cstopb;
# Use GPS  as Stream
exec 4</dev/ttyATH0;

VG
xelo

14 Likes

Danke für diese Anleitung.

was ganz wichtig ist: entferne alle uci commit aus deinem Skript. Du schreibst damit ins ROM und es wird nach einer Weile ausleiern. Außerdem commitet man in einem bestimmten Bereich, den man verändert hat (hier uci commit gluon-node-info) und nicht im gesamten UCI-Baum. Wenn man nicht commitet, bleibt es bis zum nächsten Neustart im RAM, das system arbeitet aber trotzdem mit den veränderten Daten.

EDIT: Ich habe überlesen, dass das Skript oben nur für einmalige Aktualisierung gilt. In diesem Fall muss auch einmalig commitet werden, allerdings mit uci commit gluon-node-info

Alfred bietet auch Spielereien mit GPS:
http://www.open-mesh.org/projects/open-mesh/wiki/Alfred#alfred-gpsd
diese Funktion ist in Gluon jedoch nicht einkompiliert und wird nicht ausgewertet. Je nach Domäne werden die Alfred-Daten auch nur alle 5-10 min aktualisiert.

mit alfred-gpsd-Unterstützung könnte man einen Mobilen Batman-Knoten in Echtzeit auf der Karte beobachten.

2 Likes

Danke für die Info.

Ich habe das Skript dementsprechend angepasst.
Das Commit ist nun nur noch für den gluon-node-info zweig, und standardmäßig auskommentiert.

Ich fände es hypergenial wenn das Ding zusätzlich noch könnte:

  1. Wlan-scanning für Wiggle.net (ggf. mit einem zweiten USB-Wifistick,
    um den onboard nicht zu beeinträchtigen)
  2. Tracklogging für Openstreetmap

(Und die Ergebnisse dann bei vorhandener Internernet-Verbindung per scp/ftps irgendwo hochkübeln würde, wo meine Scripte dann greifen)

Das würde dann nämlich bei mir „über geschaltetes 12V geladen“ an der Autobatterie landen, permanent fix installiert.
Würde mir VIEL manuelle Arbeit ersparen.

3 Likes

Ist das dein Auto?

(20 Zeichen muss voll werden)

1 Like

Na klar, der @adorfer lastet einzeln eine ganze Funkzelle aus. :smile:

1 Like

Gebraucht bar bezahlt. Warum?

Nein, die Gopro ist dort nicht ständig. Und der Garmin hängt da auch nur, wenn er nicht am Hosenbund baumelt. Und den ac-USB-NIC im zweiten GPS-Antennengehäuse auf dem Dach sieht man auf dem Bild natürlich nicht.

(you may call me ‚nerd‘ now)

Um es nochmal zu sagen: ich fände einen Mobilnode wirklich spannend und würde den sofort ins Auto einbauen, wenn der denn einigemaßen Sinn ergeben würde, also z.B. mehrere(!) RS232-GPS-Datenquellen unterstützen (könnte bis zu 3-4 Stück im Wagen anzapfen, die permantent(!) laufen. Wobei die letztere die spannenste wäre, weil das die vom Onboard-Navi ist, die bei GPS-Empfangsausfall eine Positionsbestimmung an Hand von Radimpulssensoren und Lenkwinkel vornimmt. (klappt erstaunlich gut. Mit der Karte im Hintergrund kann ich so zumindest innersorts mit abgeklemmten GPS kilometerweit fahren ohne die korrekte Position auf der Karte zu verlieren. Ich darf nur keine komplexen „Abkürzungen“ über Supermarkt-Parkplätze etc nehmen.

Bei soetwas würden gleich mehrere Opensource-Projekte profitieren ( www.wiggle.net / www.openstreetmap.org und natürlich www.freifunk.net)

1 Like

Wer die serielle Schnitstelle die im Router verbaut ist nutzen möchte verwendet folgende Config für das Skript:

# Configure GPS
stty -F /dev/ttyATH0 raw 9600 cs8 clocal -parenb crtscts -cstopb;
# Use GPS  as Stream
exec 4</dev/ttyATH0;

Mein GPS ist hier eins was 9600 Baud ausspuckt, das muss ggfs. angepasst werden.

1 Like

super! vielen Dank für die Anleitung - funktioniert (fast) perfekt… dazu mehr weiter unten…

Meine Anmerkung noch dazu:
In einer „vanilla“ 2014.4 gluon Installation, bei der noch nichts per okpg nachinstalliert wurde, fehlen bei der Installation der kmod-* noch Kernel-Symbole, die die Module bei Installation nicht laden lassen (verfolgbar mit laufendem logread -f)- insofern fehlt danach wohl noch ein Neustart des Routers (<- Windows-Methode :wink: ) oder einfach die Module nochmal nach-modproben … :wink:

Und nun zu meinem Problem:
Ich habe meinen Navilock NL-302U dafür auch mal wieder aus der Versenkung geholt… Bei mir scheint nie $GPRMC
mit A… nur mit V - also z.B:

> $GPRMC,203306.886,V,,,,,,,080115,,*20

Jetzt kenn’ ich natürlich die NMEA-Spec nicht … :wink: aber mach ich was falsch?

EDIT: Aaaahhh… ich glaube, ich hatte nur sehr lange keinen GPS-Lock - jetzt scheint’s zu gehen, als ich den Dongle aus dem Fenster gehangen habe :wink: komisch, das Handy daneben hatte kein Problem genug Satelliten auf der Position zu finden…

Dein Handy lädt den GPS-Almanach auch regelmäßig aus dem Internet, während der Dongle erst einen/mehrere Satelliten finden muss, um ihn zu empfangen. Der GPS Almanach enthält immer die (erwarteten) Positionsdaten der Satelliten der nächsten paar Tage. Wenn dieser noch aktuell ist, kriegt man schnell einen Fix, ansonsten dauert es etwas. Ich erinnere mich, wie wir als Stunden immer mit den Garmin 12XL rumgelaufen sind, und man gut und gerne draussen auch mal 10 Minuten warten musste, bis man einen Fix hatte…

1 Like

Freut mich, dass das das klappt. :slight_smile:

Das zweite Feld (A oder V) steht dafür ob das Signal Active oder Void
(nicht valide) ist.
Eine brauchbare Spec gibt es hier: GPS - NMEA sentence information

Wie Tino bereits sagte, wird dein Receiver etwas brauchen um den
Almanach herunterzuladen. Der Navilock ist da auch nicht gerade der
schnellste. :slight_smile:

(sorry fürs doppelposten, aber Antwort per e-Mail scheint Zeilen zu fressen)

VG
xelo

Wenn Ihr daraus ein Gluon-Modul backen könntet, dann wäre das sehr hilfreich.
evtl. Konfigurierbar, ob die onboard-RS232 (die Console) genutzt werden soll oder einer USB-RS232 (prolific-clone idR).

So, ich habe letzte Woche mal diese Idee wieder ausgegraben. Das ist echt cool.

Jedenfalls funktioniert das auch ganz hervorragend mit einem billigen USB-GPS-Stick aus der Bucht (auf ublox7-Basis).
Hier: http://r.ebay.com/UJBx1m

Das einzige, was man bei diesem 15 EUR - Teil beachten muss ist, dass man das Kernel-Modul kmod-usb-acm noch mit installiert.

Das Teil meldet sich dann unter /dev/ttyACM0

Have fun!

Ich habe 5 Beiträge in ein neues Thema verschoben: Standardformat für die Höhenangabe in Gluon (ab 2015.x)

Ich habe das heute mal versucht, auch mit dem TL3020.
Es scheitert aber schon bei
opkg install kmod-usb-core
Das kmod-usb-core gibt es nicht (mehr)

Vorher mal ein opkg update gemacht?

Ich hab 11 Beiträge in ein vorhandenes Thema verschoben: Pakete per opkg nachinstallieren

Bin gerade zufällig auf das Thema gestoßen und blicke nicht so ganz durch, daher entschuldigt bitte, wenn die Antwort auf die Frage sich aus euren Posts eigentlich schon ergibt…

Wir haben in Düren ein paar Event-Router (ca. 10 Stück), die wir halt regelmäßig auf Veranstaltungen aufbauen. Die heißen alle „DN-Event-xxx“ und sind ohne Koordinaten konfiguriert, weil uns das zu aufwendig ist, bei einer eintägigen Veranstaltung alle Router umzukonfigurieren. Jetzt kam mir gerade die Idee, dass wir uns ja einfach so einen günstigen USB-GPS-Stick zulegen könnten. Wäre es dann theoretisch möglich, einfach bei einem Event einmal rumzugehen, bei allen kurz den Stick dranstecken, damit die automatisch ihre Koordinaten beziehen und an die Map senden und dann den Stick einfach wieder abzuziehen und das dann bei allen Routern auf dem Event?

1 Like

Ja, da spricht eigentlich nichts gegen. Müssten auf allen Router dann natürlich die entsprechenden Pakete und das Script installiert sein. Zudem muss man natürlich auch die Zeit beachten, die das DIng für den GPS-Fix braucht… das geht leider nicht immer in sekundenschnelle. Wenn man an jedem Router erst 5min warten muss, bis der Fix da ist… dann hab ich die Koordinaten zumindest bei nem Event schneller über z.B. Flopps Karte ermittelt. 10 Router jeweils mit GPS auszustatten ist ja dann auch keine Option.

2 Likes