[font="Arial Black"]WLAN-Automat mit dem Raspberry PI[/font]
[Blocked Image: https://c4.staticflickr.com/9/…8149605643_f04d066574.jpg]
Vorwort
Auf dieses Projekt, bin ich durch die c't gestoßen. Da man dort alle "benötigten" Dateien herunterladen kann, OHNE den Artikel kaufen zu müssen, dachte ich mir mach ich doch nen Tutorial daraus.
Leider hat der c't Artikel auch einige Fehler, weswegen das Projekt sowie im Artikel beschrieben nicht läuft. Deswegen habe ich Änderungen in dieses Tutorial einfließen lassen und somit tut es genau das was es soll.
Desweiteren Verzichte ich darauf code-zeilen zur Kivy Programmierung zu erklären. Da es den Umfang eines Tutorials sprengen würde.
Wer es trotzdem möchte darf sich gerne hier einlesen https://kivy.org/docs/
Da ich schier daran verzweifelt, ein IOS Gerät per QR-Code mit dem WLAN zu Verbinden, habe ich den Teil in den Code-Zeilen Auskommentiert. Desweiteren halte ich das Freischalten eines Ports, für den Webserver, für eine Sicherheitslücke. Bin also kein Fan von so etwas. Da es mit IOS nicht anders möglich ist, da Safari eine Datei herunterladen MUSS ... verzichte ich auf die Einbindung.
Gerne nehme ich aber Verbesserungsvorschläge oder Kritik entgegen.
Man verzeihe mir meine Rechtschreibfehler!
Benötigt:
Hardware:
Raspberry PI 3
Netzteil
SD-Card 8GB
Raspberry PI Touchscreen 7“
Raspberry PI Touchscreen Gehäuse
Software:
Putty oder ähnliches Terminal
Respbian Jessie (04.08.2016)
http://ct.de/yd7n
ggf https://github.com/markthom87/wlanautomate
Display anschließen
Die mitgelieferten Kabel wie folgt an das Raspberry PI anschließen
[Blocked Image: https://c5.staticflickr.com/9/…8733218756_452112ed1f.jpg]
Das Raspberry PI an der Rückseite festschrauben
[Blocked Image: https://c5.staticflickr.com/9/…8733215436_7b1d4ff472.jpg]
Display einrichten
Wir Booten das erste mal mit Display und erkennen, es steht kopf.
Info:Alle schritte werden mit sudo ausgeführt.
Damit wir uns das eingeben sparen können, wechseln wir mit
zum Root benutzer.
Um den Kopfstand der Anzeige zu ändern, editieren wir die /boot/config.txt dort tragen wir, am ende, folgenden parameter hinzu
Erneut Rebooten und siehe da, alles so wie es sein soll
Pakete installieren
apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
apt-get install dnsmasq hostapd imagemagick nginx qrencode python-kivy
[WARTEN und eventuell nen Kaffee trinken] dauert ca. 1 – 10 Minuten
Accesspoint einrichten
vim /etc/network/interfaces
Dort fügen wir oder ändern folgende Paramter ab.
#Loopback Interface
auto lo
iface lo inet loopback
#ETH0 Interface
iface eth0 inet dhcp
#WLAN0 Interface
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.66.1
netmask 255.255.255.0
Display More
Nun müssen wir die Automatische zuweisung, an der wlan0 Schnittstelle Konfigurieren.
Dafür editieren wir folgende Datei /etc/dnsmasq.conf und fügen den Code am Ende hinzu.
interface=wlan0
dhcp-range=interface:wlan0,192.168.4.2,192.168.4.30,infinite
no-dhcp-interface=eth0
Jetzt noch das IP-Forward aktivieren. Das aktivieren wir durch folgende Einträge in der Datei /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
Nun fehlt noch die Adressumsetung per NAT, damit die Antwortpakete den richtigen Weg finden müssen wir die Firewall anpassen.
Wir erstellen eine Datei
vi /etc/network/if-up.d/accesspoint
mit dem Inhalt
#!/bin/sh
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Der nächste Schritt ist die hostapd.conf anzupassen. Diese müssen wir erstellen
Vim /etc/hostapd/hostapd.conf
Dort fügen wir folgenden Inhalt hinzu
# First we configure the interface we'll be listening on
interface=wlan0
#bridge=br0
# The interface to listen on
driver=nl80211
#driver=rtl871xdrv
# The driver that is being used by the WiFi adapter, this could be different for everyone
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
# These 2 are just parameters so that the hostap daemon runs.
# Now onto the important WiFi configuration
ssid=anaxima
# First up, the SSID or Network name. This is what other devices will see when they try to connect.
hw_mode=g
# I'm setting this to Wireless G mode. A, B, and G are available here.
channel=8
# This is setting the channel that the WiFi is on, valid channels are from 1-11, or 1-14 depending on location.
# Wifi Security Settings
wpa=1 # This sets the security settings to WPA
# The line above sets the wpa passphrase to "raspiwlan", this is obtained via the wpa_passphrase command.
# However, you can also set a passphrase like the line below.
wpa_passphrase=eugyrdhgbg
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
# I've set these to WPA-PSK to indicate that we are using a Pre-Shared Key with CCMP encryption.
# Otherwise, hostapd also has a built in RADIUS server that we can use for authentication
# But I'll leave that to another post.
# Other settings
beacon_int=100 # This sets how often the WiFi will send a beacon out.
auth_algs=3
wmm_enabled=1
Display More
Jetzt fehlt noch das bekannt machen, dieser Config Datei. Damit auch nach einem Reboot die hostapd.conf automatisch geladen wird.
Dafür editieren wir folgende Datei
Und ersetzen folgenden Parameter
Durch
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Danach noch ein
service hostapd restart
update-rc.d hostapd enable
Damit nach einem Neustart der Accesspoint "Gaeste-WLAN" automatisch anläuft.
Automatischer Schlüsselwechsel
Zuerst erstellen wir den Ordner, den wir später benötigen. Dort werden die QR-Codes abgelegt und auch aufgerufen
mkdir -p /var/guestwlan/images
Damit der RaspberryPi automatisch einen schlüssel mit QR-Codes Generiert, müssen wir ein kleines Script schreiben.
vim /usr/local/bin/wlankeygen
Dort fügen wir folgenden Inhalt ein
#!/bin/bash
#Generate a WLAN-Key with urandom
WLANPSK=$(dd if=/dev/urandom count=1 status=none|tr -d -c 'a-z'|cut -b1-10)
#DEBUG
#echo "$WLANPSK"
#Edit WLANPSK in hostapd
sed -ie "s/wpa_passphrase=.*/wpa_passphrase=${WLANPSK}/" /etc/hostapd/hostapd.conf
#Reload Service hostapd
service hostapd reload
#Remove old *.jpg Files
rm /var/guestwlan/*.jpg
# Only to use QR-Codes for slideshow
#rm /var/guestwlan/images/*.jpg
#Generate QR-Codes
#Android
qrencode -t PNG -o /var/guestwlan/android.png -s 4 "WIFI:T:WPA;S:Guest-WLAN;P:${WLANPSK};H:false;"
#Windows
qrencode -t PNG -o /var/guestwlan/windows.png -s 4 "WIFI;T:WPA;S:Guest-WLAN;P:${WLANPSK};H:false;"
#IOS
#sed -e "s/<string>wlanpsk/<string>${WLANPSK}/" /var/www/html/gaestewlan.mobileconfig.in > /var/www/html/${WLANPSK}.mobileconfig
#qrencode -t PNG -o /var/guestwlan/ios.png -s 4 "http://my.example.com/${WLANPSK}.mobileconfig"
#Convert PNG to JPG
cd /var/guestwlan/
mogrify -format jpg *.png
# Only for use QR-Codes for slideshow
#cp *.jpg /var/guestwlan/images/
#Remove unused PNG Files
rm /var/guestwlan/*.png
#Create wlan.cfg
cat > /var/guestwlan/wlan.cfg <<EOF
[WLAN]
wlanssid=Guest-WLAN
wlanpsk=${WLANPSK}
EOF
Display More
Info:Kivy kann wohl leider keine PNG-Files, in der aktuellen Version, darstellen. Deswegen werden die PNG Files zu JPG convertiert und könne danach ohne Probleme dargestellt werden.
Als nächstes brauchen wir die Kivy und Python Dateien, diese werden ebenfalls in /usr/local/bin erstellt.
vim /usr/local/bin/guestwlan.py
#!/usr/bin/env python
import ConfigParser
from glob import glob
from os.path import join, dirname
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.image import Image
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.widget import Widget
from kivy.clock import Clock
# from kivy.logger import Logger
class FilenameList:
filename = []
i = 0
def addDirectory(self, name):
self.filename.extend(glob(join(name, '*')))
def current(self):
if self.i >= len(self.filename):
return ''
else:
return self.filename[self.i]
def next(self):
if self.i+1 >= len(self.filename):
self.i = 0
else:
self.i += 1
return self.current()
class SlideShow(Screen):
slide = ObjectProperty(None)
list = FilenameList()
def on_touch_down(self, touch):
global SM
SM.get_screen('wlan').updatesettings()
SM.transition.direction = 'left'
SM.current = 'wlan'
def addDirectory(self, name):
self.list.addDirectory(name)
def update(self):
self.slide.source = self.list.current()
def next(self, dt):
self.slide.source = self.list.next()
class WLAN(Screen):
wlanssid = StringProperty(None)
wlanpsk = StringProperty(None)
android_qrcode = ObjectProperty(None)
## ios_qrcode = ObjectProperty(None)
windows_qrcode = ObjectProperty(None)
def updatesettings(self):
wlancfg = ConfigParser.RawConfigParser()
wlancfg.read('/var/guestwlan/wlan.cfg')
self.wlanssid = wlancfg.get('WLAN', 'wlanssid')
self.wlanpsk = wlancfg.get('WLAN', 'wlanpsk')
self.android_qrcode.reload()
## self.ios_qrcode.reload()
self.windows_qrcode.reload()
class ScreenManagement(ScreenManager):
pass
class GuestWLAN(BoxLayout):
pass
class GuestWLANApp(App):
def build(self):
global SM
# the root is created in the KV file
SM = self.root
SlideShow = SM.get_screen('slideshow')
SlideShow.addDirectory('/var/guestwlan/images')
# Diashow starten
SlideShow.update()
Clock.schedule_interval(SlideShow.next, 3)
return SM
if __name__ == "__main__":
GuestWLANApp().run()
Display More
Sowie die dazu gehörige kivy Datei, die dann die Darstellung regelt.
vim /usr/local/bin/guestwlan.kv
ScreenManagement:
SlideShow:
WLAN:
<SlideShow>:
name: 'slideshow'
slide: slide
Image:
id: slide
keep_data: True
allow_stretch: True
nocache: True
<WLAN>:
name: 'wlan'
wlanssid: ''
wlanpsk: ''
android_qrcode: android
## ios_qrcode: ios
windows_qrcode: windows
BoxLayout:
orientation: 'vertical'
pos_hint: {'center_x': 0.5}
size_hint: 0.8, 1
padding: 20
spacing: 10
BoxLayout:
orientation: 'vertical'
size_hint: 1, 0.1
Label:
size_hint: 1, 0.5
text: 'WLAN-SSID: %s' % root.wlanssid
Label:
size_hint: 1, 0.5
text: 'WLAN-Passphrase: %s' % root.wlanpsk
BoxLayout:
size_hint: 1, 0.4
padding: 20
spacing: 10
BoxLayout:
orientation: 'vertical'
Label:
text: 'Android'
Image:
id: android
nocache: True
source: '/var/guestwlan/android.jpg'
## BoxLayout:
## orientation: 'vertical'
## Label:
## text: 'iOS'
## Image:
## id: ios
## nocache: True
## source: '/var/guestwlan/ios.jpg'
BoxLayout:
orientation: 'vertical'
Label:
text: 'Windows'
Image:
id: windows
nocache: True
source: '/var/guestwlan/windows.jpg'
Button:
size_hint: 1, 0.1
text: 'Zurück'
on_release:
root.manager.transition.direction = 'right'
root.manager.current = 'slideshow'
Display More
Wir haben nun alle Datein erstellt, können nun also das erste mal Testen mit folgendem Befehl
python /usr/local/bin/guestwlan.py
Es sollte sich ein großer QR-Code öffnen
[Blocked Image: https://c8.staticflickr.com/9/…8764673135_25723e821b.jpg]
Mit dem Berühren des Touchscreens sollte, das Bild dann zu der Übersicht wechseln.
[Blocked Image: https://c1.staticflickr.com/9/…8147013504_3248a94379.jpg]
Mit Strg+C beenden wir die Ausführung.
Wir möchten das der wlankeygen morgens um 8 uhr (z.B. Arbeitsbeginn) wechselt, die QR-Codes erzeugt werden und das Script, zur darstellung, automatisch startet.
und schreiben folgendes hinein
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
0 8 * * * /usr/local/bin/wlankeygen
# Generate New Keygen after reboot
@reboot /usr/local/bin/wlankeygen
Anschließend öffnen wir die /etc/rc.local und fügen die Paramter für den Start des Scriptes guestwlan.py ein
/bin/sleep 15 && sudo python /usr/local/bin/guestwlan.py &
exit 0
Als letztes müssen wir noch unterbinden, das Raspbian den Display Automatisch ausschaltet (führt zu Fehlern, der Touchfunktioniert nicht mehr) und die Grafische Oberfläche bei einem start ausgeführt wird.
Dazu editieren wir die Datei /boot/cmdline.txt und fügen folgenden Parameter hinzu
Als nächstes deaktivieren wir den Autostart der Grafischen Oberfläche
Und dort wählen wir bei Boot-Optionen aus
B1 Console
(ohne Autologin)
Und über finish fordert Raspbian zum Reboot, das tun wir! Nach dem Neustart wird der WLAN-Automate automatisch dargestellt werden.
Vielen Dank an heise, für dieses tolle Projekt und die Bereitstellung des Codes.
Quelle:
http://heise.de/-3185167
http://fukuchi.org/works/qrencode/manual/index.html
Erweiterung:
WPA2 WIFI
http://www.forum-raspberrypi.d…ehig?pid=234161#pid234161