Freifunk-App (SSID-Manager)

Hi. Ich habe die letzten Tage mal wieder an der App gebastelt.

Zum einen habe ich das UI etwas überarbeitet und neue Ladebalken hinzugefügt:

Die größere Neuheit ist jedoch die Möglichkeit, sich die nächstgelegenen Freifunk-Router anzeigen zu lassen:

Mit einem Klick auf einen Router wird Android angewiesen, eine Liste von auf dem Gerät befindlichen Apps zur Auswahl anzubieten, die in der Lage sind, Geokoordinaten zu verarbeiten.

Es gibt jedoch ein Problem: Das Sammeln der Postitionsdaten und Onlinestatus-Angaben. Momentan befinden sich etwas mehr als 200 Links zu API Files im API Directory. Diese alle in der App herunterzuladen, nach Links zu Karten und Positionsdaten zu durchsuchen, um dann wiederum die gefundenen Dateien mit den Routerdaten herunterzuladen, dauert zu lange, um sich mal eben schnell anzeigen zu lassen, welche Router in der Nähe sind. Daher nimmt die App momentan Routerdaten, die lokal in einer Datei auf dem Smartphone gespeichert sind.

Diese lokale Datei wurde mit einem selbstgeschriebenen Python-Script erstellt. Dieses lädt sich das API Directory herunter, um dann mit den darin enthaltenen Links die API Files der einzelnen Communities zu parsen. Dabei wird dann nach Links zu ffmaps und nodelist Einträgen gesucht und versucht, an die Positionsdaten der Router zu gelangen. Dies ist vor allem bei ffmaps nicht ganz einfach, da die API Files in der Regel den Link zu der Karte enthalten, die im Brower angezeigt werden soll, aber nicht den Link zur nodes.json Datei, die die Positionsdaten enhält. Diese lässt sich aber meistens im selben Verzeichnis unter nodes.json finden. So konnte ich schon mal Daten zu etwa 15.000 Router finden. Das Script gibts hier: GitHub - WIStudent/FreifunkNodeLocationCrawler: A script that crawls Freifunk node locations from different community maps.

Damit in der App nun immer halbwegs aktuelle Daten vorliegen, habe ich mir folgendes gedacht. Das Crawler-Script müsste auf einem Server alle paar Stunden ausgeführt und die daraus resultierende json Datei über eine feste URL zugänglich gemacht werden. Das Script schreibt bei jedem Erzeugen der json Datei auch einen Timestamp des Erstellungszeitpunktes hinein. Die App soll nun, wenn sie die nächstgelegenen Router bestimmt, prüfen, ob online eine neuere Datei verfügbar ist. Um den Traffic zu reduzieren, soll die App die letzte geladene Datei speichern. Bevor sie beim nächsten mal prüft, ob online eine neue Datei verfügbar ist, soll sie zunächst schauen, wie alt die lokale Datei ist. Wenn die Datei auf dem Server z. B. alle 3 Stunden neu erstellt wird, die lokale Datei in der App aber erst vor 2 Std. erstellt wurde, dann braucht die App den Server erst gar nicht zu belästigen.

Problem ist nur, dass ich keinen Webspace/Server habe. Ich könne nun das Script bei mir automatisch alle paar Stunden auf einem Raspberry Pi ausführen lassen und die Datei dann per FTP zu irgendeinem Anbieter von Gratis-Webspace hochladen, aber vielleicht weiß hier jemand auch eine elegantere Lösung.

Version 0.6 ist nun verfügbar. Release v0.6 · WIStudent/FreifunkAutoConnectApp · GitHub

Die größte Neuerung ist, dass die App nun in der Lage ist, basierend auf der aktuellen Position die nächstgelegenen Freifunk-Router anzuzeigen. Die Postitionsdaten der Router werden dafür nun auf einem Raspberry Pi bei mir zu Hause zusammengesammelt und zu einem Webserver hochgeladen, von dem die App die Daten dann herunterlädt. Die App behält immer die zuletzt geladene Json Datei, sodass es auch ohne Internetzugang möglich ist, die nächsten Router anzeigen zu lassen (basierend auf den zuletzt geladenen Daten). Das Raspberry Pi lädt jede Stunde eine aktualisierte Json Datei hoch.

Momentan werden nur Router von Communities erfasst, die die Positionsdaten der Router per nodelist bereitstellen oder eine ffmap Karte betreiben. Bei ffmap kommt es zudem darauf an, ob das Script auch in der Lage war, aus der URL der Karte die korrekte URL für die nodes.json Datei zu erzeugen. Um Communities zu erfassen, die Netmon für die Karten verwenden, bäuchte ich noch ein paar Hinweise, wie ich da an die Positionsdaten gelange.

An sonsten habe ich noch die Funktion, eigene SSIDs hinzuzufügen, entfernt, da die Lösung, sie über eine Datei auf der SD Karte hinzuzufügen, nicht gerade nutzerfreundlich war und in einigen Fällen auch nicht hundertprozentig funktioniert hat.

4 „Gefällt mir“

Läuft super wie in den Videos gezeigt. Vielen Dank für deine Arbeit!

Wie es scheint, hat F-Droid was gegen die Google Play Services Api, die ich für die Bestimmung der Position verwendet habe, weshalb dort die Version 0.6 nicht auftaucht. Ich werde mich mal nach Alternativen für die Positionsbestimmung umsehen.

Huhu,

also die App ist echt super, bei mir werden aber die Knoten alle doppelt angezeigt.
Any ideas?

Die doppelten/fehlenden Ruhrgebiets-Knoten sind aber ein „Sonderlocken-Problem“.
Da kann diese App kaum etwas dran ändern.
Bitte dort diskutieren.

Stürzt bei mir in der v0.6 auf beiden Geräten leider ab (S3 + CyanogenMod sowie Galaxy Tab + Stock)

Das liegt an meinem Quick and Dirty Crawler Script und dem Chaos, das in der Freifunk-API herrscht. Es ist kein direkter Fehler, die Knoten stehen einfach doppelt in der generierten Json Datei. @adorfer hat ja schon auf den passenden Thread verwiesen, die Knoten sind in 2 verschiedenen Community Maps eingetragen worden, jedoch mit unterschiedlichen IDs, weshalb mein Python Script diese nicht als doppelt erkennt.

Ahh ok, verstehe.

Bochum kommt direkt aus der Domäne Bochum und zusätzlich noch von Ruhrgebiet. Daher ist es doppelt.

Ist selbst die MAC anders, so dass man danach filtern könnte.

Aber wie auch immer - besser so als gar nichts zu haben. Ich finde die App brauchbar. Weiter so!

Ich hab gerade nochmal ein wenig auf meinem Testgerät getestet. Zum einen konnte ich die App zum Absturz bringen, wenn GPS nicht aktiviert ist. Probier mal folgendes. Stell sicher, dass GPS aktiviert ist. Öffne Google Maps oder irgendeine andere App, die deinen Standort abfragt, damit dein Gerät einmal seinen Standort bestimmt hat. Versuche dann nochmal, die Freifunk App zu öffnen.

Unter CyanogenMod könnte aber auch fehlende Google Play Dienste/Services den Crash verursachen. Die App verwendet diese momentan zur Positionsbestimmung. Da die Play Dienste/Services nicht open source sind, sind sie standardmäßig nicht in CyanogenMod enthalten. Das scheint auch der Grund zu sein, weshalb F-Droid die Version 0.6 nicht anbieten will.

Das war es. Jetzt funktioniert es (auch mit CyanogenMod inkl. Google Play). :smiley:

Aktualisierte Version: Release v0.6.1 · WIStudent/FreifunkAutoConnectApp · GitHub

Statt abzustürzen sollte die App nun eine Warnung anzeigen, falls die Position des Geräts nicht bestimmt werden kann.

3 „Gefällt mir“

Vielen herzlich Dank Tobias : Ich freue mir gerade einen Keks über deine APP

Ich habe selbst mehrere Geräte und wollte die alle über Freifunk laufen lassen ,weil es entspannter ist.
Arbeitshandy + Privathandy + Mein Tablet + Tablet meiner Freundin + Ihr Privathandy und demnächst auch ihr Diensttelefon
Wäre mir einfach zu viel zu adden - ich hätte zwangsläufig wieder mein Hot-Spot zum mitnehmen genommen und dort alles manuell geadded

deswegen noch mal ausdrücklich VIELEN DANK !

1 „Gefällt mir“

Kurzer Hinweis: Da mir das Raspberry Pi abgeschmiert ist (booten schlägt seit einem reboot fehl, vermutlich ist die SD Karte korrupt), das die Positionen der Freifunk-Router crawlt, werden diese fürs erste nicht mehr aktuallisiert. D.h. in der App bleibt die Liste auf dem Stand vom 10.05.2016 19:14 bis ich das Raspberry Pi neu aufgesetzt habe, wozu ich aber wohl erst am Wochenende kommen werde.

1 „Gefällt mir“

Update: Raspberry Pi läuft wieder.

1 „Gefällt mir“

Neue Version: Release v0.7 · WIStudent/FreifunkAutoConnectApp · GitHub

Die Liste der Freifunk-Knoten wird nun als komprimierte Datei heruntergeladen, was den Download auf etwa 1/3 der unkomprimierten Größe reduziert.

Seit Android 6 ist es einer App nur noch gestattet, SSIDs aus der Netzwerkkonfiguration des Geräts zu entfernen, wenn diese auch durch diese App hinzugefügt wurden. Dies kann dazu führen, dass die App SSIDs nicht entfernen kann. In dem Fall wird dem Nutzer eine Nachricht angezeigt.

Bei den SSIDs wird nun zwischen aktuellen und veralteten SSIDs unterschieden. Dies betrifft momentan nur die „muenster.freifunk.net“ SSID, da diese von der Münster Community nicht länger verwendet wird.

Wenn ein Nutzer eine veraltete SSID in seiner Netzwerkkonfiguration hat, wird diese in der Liste orange hinterlegt.

Der Nutzer kann in den Einstellungen entscheiden, ob veraltete SSIDs, die sich nicht in der Netzwerkkonfiguration befinden, angezeigt werden sollen. Standardmäßig werden sie nicht angezeigt, wenn der Nutzer sie aber anzeigen lässt, werden sie gelb hinterlegt.

2 „Gefällt mir“

muenster.freifunk.net kann komplett raus. Letzten Dienstag wurde der letzte Server abgeschaltet. Es gibt keinen Knoten mehr, wo mit der SSID das Internet funktioniert.

Grüße
Matthias

Der Grund, weshalb die SSID als veraltet in der Liste behalten wird, ist, damit die Nutzer, die diese SSID noch in ihrer Netzwerkkonfiguration haben, auch erkennen können, dass diese veraltet ist. Die SSID komplett herauszunehmen würde dazu führen, dass sie von der App aus der Konfiguration auch nicht mehr entfernt werden kann. Der Nutzer müsste dies dann manuell in den Android Einstellungen tun, wobei er dazu aber auch wissen müsste, welche SSIDs entfernt wurden. Daher halte ich das Als-Veraltet-Markieren als die beste Lösung.

3 „Gefällt mir“

Nach langer Zeit gibt es mal wieder ein Update: Release v0.8 · WIStudent/FreifunkAutoConnectApp · GitHub

Die größte Änderung ist, dass nun die Positionsdaten der Freifunk-Karte anstelle meiner eigenen Quick-and-Dirty Crawler-Lösung verwendet werden. Dies verdoppelt die Anzahl der sichtbaren Knoten in etwa. Dazu prüft das Raspberry Pi alle 10 Min., ob unter https://api.freifunk.net/data/freifunk-karte-data.json eine neue Version vorhanden ist. Ist dies der Fall, wird die Datei heruntergeladen, in ein für die App geeignetes Format konvertiert, komprimiert und auf meinen Webserver hochgeladen. Die App selbst verwendet in der HTTP-Request nun das „If-Modified-Since“ Feld, um die Datei auch wirklich nur dann herunterzuladen, wenn sie seit dem letzten Download aktualisiert wurde.

Ich weiß nicht, wie lange es dauert, bis das Update auf F-Droid verfügbar wird. Ich habe gesehen, dass der Bot die Versionsänderung bereits registriert hat, bisher wurde die neue Version aber noch nicht gebaut.

2 „Gefällt mir“

Version 0.8 ist nun auch auf F-Droid verfügbar: https://f-droid.org/packages/com.example.tobiastrumm.freifunkautoconnect/

1 „Gefällt mir“