{{Broken
|Reason=Nicht mehr aktuell.
}}

== Fonera GPIO ==

=== Aktuelles ===
Moleflap ist derzeit nicht verfügbar, der momentane Enwticklungsstand ist [[HQ/Schalter]] zu entnehmen.

=== Hardware ===

Da es in unserem [[HQ]] ein kleines Schlüsselproblem gab, haben wir uns überlegt die Tür elektronisch aufzuschließen. Ein Magnetschloss war schon vorhanden jetzt fehlte nur noch die Ansteuerung des Schlosses.

Wir entschieden uns erstmal einen WLAN-Router zu nehmen, da jeder eigentlich immer ein Gerät mit WLAN dabei hat.

Als WLAN-Router nahmen wir den Fonera (v.1). Glücklicherweise wurden bei dem Fonera die GPIO-Pins schon freigelegt, d.h. sie waren auf der Platine frei zugänglich.

Wir fanden die [http://mobileaccess.de/fonera/gpio/pinout.txt Belegung der Pins]. GND nahmen wir vom seriellen Port (siehe Bilder) es ist der 2.&nbsp;Pin rechts oben, wenn der WLAN-Chip in eure Richtung zeigt.
<gallery>
File:Fonera-gpio-2.jpg
File:Fonera-gpio-1.jpg
</gallery>

Diese ganzen Pins wurden jetzt an einen 9-poligen Sub-D-Stecker gelötet und in das Gehäuse gebaut. Um später auch die anderen Pins nutzen zu können.
<gallery>
File:Fonera-gpio-3.jpg
File:Fonera-gpio-4.jpg
File:fonera_stecker.jpg
</gallery>

Jetzt galt es das Schloss anzusteuern. Die Spannung der GPIO Pins konnten wir nicht nutzen, weil die Spannung und der Strom einfach zu schwach für den Schaltmoment des Schlossen waren. Deshalb musste eine Transistor her. Die Transistorschaltung, die wir haben wollten, sollte quasi als Schalter dienen. Wir bauten eine einfache kleine Emitterschaltung mit einem BC137. Der Kollektor wurde durch eine Diode und einen Elko gegen Selbstinduktion des Schlosses geschützt (Im Schloss befinden sich Magnete, die bei Stromdurchfluss in sich einen Strom in entgegengesetzte Richtung induzieren.).

Ein paar Werte: 
* Ausgangsspannung des GPIO-Pins -> 3,3V
* Versorgungsspannung Transistor -> ca. 12V / ca. 2A

Weil das Schloss soviel Spannung/Strom braucht, haben wir somit 2 Netzteile, 1x Router, 1x Transistor.
<gallery>
File:connector.jpg
File:Tranistor_fonera.jpg
</gallery>

Ok. Als nächstes mussten wir den Fonera sagen, er solle den Pin an dem wir das Schloss angeschlossen haben, schalten.

Auf dem Fonera ist OpenWRT installiert, was uns einiges erleichterte. Die erste Hürde war herauszufinden, wie die GPIO-Pins geschaltet werden. Wir stießen da auf dieses kleine Tool [http://www.daemon-systems.org/man/gpioctl.8.html gpioctl], welches auch schon installiert war.

Die zweite Hürde war herauszufinden, welcher Hardware-Pin zu welchen Software-Pin gehört. Nach einigen Versuchen gelang es uns das Schloss schalten zu lassen, und wir schrieben sofort ein kleines Skript was 3 sek. lang das Schloss öffnet und wieder schließt.

So jetzt hat der Fonera auch ein neues Gehäuse mit Lüfter.
<gallery>
File:New_fonera.jpg
File:New_fonera2.jpg
File:New_fonera3.jpg
</gallery>

Hier das Script das auf dem Fonera rattert:
<pre>
#!/bin/sh

gpioctl clear 3
gpioctl dirout 3
gpioctl set 3
sleep 1
gpioctl clear 3
gpioctl set 3
sleep 1
gpioctl clear 3
gpioctl set 3
sleep 1
gpioctl clear 3


exit 0
</pre>

=== Software ===

Eine Einmal-Token basierte Lösung mit Webinterface in Lua.
{{Project Info|
Name=MoleFlap|
About=Türzuganssystemsoftware|
Home=https://moleflap.hq.c3d2.de/|
Lang=Lua|
Platforms=Unix|
Source=http://gitorious.hq.c3d2.de/moleflap|
Documentation=https://wiki.c3d2.de/Fonera_GPIO#Software|
Mailing_List=http://mail.skyhub.de|
Muc_Room=c3d2|
Muc_Service=muc.hq.c3d2.de|
Repository_type=GIT|
Repository=http://gitorious.hq.c3d2.de/moleflap/software|
}}

==== Umsetzung ====
* Hauptsächlich in Lua
* Datenhaltung in PostgreSQL
* Webinterface auf [http://moleflap.hq.c3d2.de moleflap]
* moleflap öffnet die Tür über ssh auf das Fonera
* Zufallszahl aus <code>/dev/urandom</code>
* 4 Zeichen Präfix
* Übergabe des Token als Query String
* Admin-Skripte liegen auf moleflap
* User-Skripte liegen gleichfalls auf moleflap, und sind über [http://moleflap.hq.c3d2.de/opendoor das Web-Interface direkt] zu erreichen.
* Code liegt auf [http://gitorious.hq.c3d2.de/moleflap gitorious.hq.c3d2.de]

==== Design ====
* Der Token besteht jeweils aus einer Base64 kodierten Zufallszahl mit insgesamt 164 Zeichen. Die ersten 4 davon sind als Präfix definiert der bei den folgenden Token wieder dabei ist.
* Beim öffnen der Tür mit diesem Token wird er ungültig und ein neuer gültiger Token wird ausgegeben (Plaintext über HTTP).
* Es wird bei jeder syntaktisch korrekten Anfrage ein Token zurückgegeben (Nur physische Anwesenheit an der Tür ermöglicht validen Token zu erkennen.).
* Token haben eine begrenzte Lebensdauer (TTL, ~2 Monate als Diskussionsgrundlage), nach der sie gelöscht werden.
* Abgelaufene Token werden noch eine Weile aufgehoben (Admins können verifizieren, dass der Token abgelaufen ist, wenn Neuer beantragt wird, unterscheidbar zu verloren und weitergegeben.)
* Der Präfix dient als Hilfe für die Admins, damit diese nur durch die Angabe dessen einen Token sperren können.
* Die Token sollen nicht eindeutig Personen zugeordnet werden.
* Anzahl der an Personen neu vergebenen Token wird gespeichert (nur Nick und Anzahl).
* Startzeit der TTL wird obsfuscated (~1 Woche Abweichung maximal), um genaue Verfolgbarkeit zu verhindern.
* Anzahl der Requests in bestimmter Zeit pro Client-Adresse ist begrenzt (Bruteforce Schutz).
* Der Admin kann einen PGP Schlüssel einem Präfix zuordnen, mit dem den Nutzer seinen Schlüssel wiederherstellen kann, falls er ihn kaputt gespielt hat oder mehrere Geräte zum Aufschließen benutzen möchte. Die Anonymität des Präfixes geht dabei jedoch verloren. 
* Vorschlag: Eventuell Logging der Aufschließvorgänge (ohne Zuordnung zu Token)?

==== Administration ====
Besteht aus insgesamt 9 Skripten:
; <code>createdb</code>: erstellt die Datenbank-Tabellen (sollte nicht mehr nötig sein ;P)
; <code>deletedb</code>: löscht alle Daten aus der Datenbank inklusive der Tabellen (wer das macht ist *very-evil*)
; <code>addtoken</code>: erstellt einen neuen Token. Es können Angaben über Username und Präfix gemacht werden
; <code>revoke</code>: löscht den Token mit dem angegeben Präfix um den Zugang zu sperren (nötig um evtl. verlorene Token ungültig zu machen)
; <code>isvalid</code>: gibt an ob ein Token mit dem angebenen Präfix noch gültig ist
; <code>isdead</code>: gibt an ob ein Token mit dem angebenen Präfix bereits abgelaufen ist
; <code>listusers</code>: gibt eine Liste aller User zurück die jemals einen Token erhalten haben und die Anzahl, wieoft sie schon einen neuen Token erhalten haben (fängt bei eins an :3)
; <code>statistic</code>: gibt an wieviele User, gültige und abgelaufene Token das System kennt
; <code>setpgp</code>: setzt den PGP-Schlüssel für ein Präfix

Admins:
* [[Benutzer:Astro|Astro]]
* [[Benutzer:Dodo|Dodo]]
* [[Benutzer:Poelzi|Poelzi]]
* [[Benutzer:Thammi|Thammi]]

== Weblinks ==
* http://mobileaccess.de/fonera/gpio/pinout.txt - Pinout
* http://www.daemon-systems.org/man/gpioctl.8.html - gipoctl

[[Kategorie:HQ]]
[[Kategorie:Projekt]]
