In unserem Projekt wird ein Raspberry zur Steuerung einer Tür verwendet. Das Konfigurieren der Netzwerkverbindung ist meine Aufgabe im Projekt. Der Raspberry soll vom Kunden über eine App bzw. über einen Browser konfiguriert werden. Es stehen keine anderen Konfigurationsmöglichkeiten (wie z. B. Bildschirm und Tastatur) zur Verfügung. Da der Raspberry nahe der Gegensprechanlage installiert werden muss, soll sich dieser per WLAN mit dem Heimnetzwerk/Internet verbinden. Diese Verbindung (WLAN, Passwort und eventuell statische IP) muss jedoch zunächst konfiguriert werden. Um den Raspberry konfigurieren zu können, soll dieser sein eigenes WLAN (Access Point) starten. Mit diesem kann sich der Kunde verbinden und die Konfiguration vornehmen. Die Umsetzung dieser Anforderungen wird nachfolgend beschrieben.

Es werden drei Services verwendet: hostapd, dnsmasq und wpa_supplicant.

  • hostapd erstellt einen Access Point (AP).
  • dnsmasq ist ein DNS- und DHCP-Server. Dieser ist notwendig, um eine IP an ein mit dem AP verbundenes Gerät zu vergeben.
  • wpa_supplicant ist ein WLAN „Bittsteller“ der u. a. WPA und WPA2 unterstützt.

Diese Services müssen über Scripte automatisch konfiguriert und gestartet werden. Ich habe mich aus Gründen der Einfachheit gegen eine direkte Umsetzung in Buildroot entschieden und stattdessen in Raspbian gescriptet und getestet. Auch bei dieser „einfacheren“ Umsetzung entstanden viele Probleme, die in den Scripts berücksichtigt werden mussten. Hauptsächlich entstehen diese durch die gemeinsame Nutzung von Ressourcen durch hostapd , dnsmasq und wpa_supplicant.

Zunächst müssen hostapd und dnsmasq installiert werden. (wpa_supplicant ist bereits installiert)

apt-get install hostapd dnsmasq -y

Damit hostapd als Service gestartet werden kann, muss in der Konfigurationsdatei /etc/default/hostapd die Zeile

DAEMON_CONF=“/etc/hostapd/hostapd.conf“

hinzugefügt werden. Um einen Start der Services beim Booten zur verhindern, müssen diese deaktiviert werden:

systemctl disable hostapd.service
systemctl disable dnsmasq.service
systemctl disable wpa_supplicant.service

Anschließend sollte das System neu gestartet werden.

Die Services werden über 5 Dateien Konfiguriert:

  • /etc/dnsmasq.conf enthält die Konfiguration zur Vergabe von IP-Adressen im AP-Modus.
  • /etc/hostapd/hostapd.conf enthält die Konfiguration des APs.
  • /etc/network/interfaces enthält die Konfiguration der Netzwerkinterfaces.
  • /etc/dhcpcd.conf enthält die Konfiguration des DHCP Clients.
  • /etc/wpa_supplicant/wpa_supplicant.conf enthält die Konfiguration des WLAN.

Das Starten der Services und das Konfigurieren der Dateien wird durch 4 Scripte erledigt.

  • startup.sh startet nach dem Booten das WLAN (ruft hierfür wlan-setup.sh auf) und ruft anschließend switch.sh auf.
  • switch.sh überprüft, ob eine WLAN-Verbindung erfolgreich aufgebaut werden konnte. Ist dies der Fall, wird nichts unternommen. Konnte keine WLAN-Verbindung aufgebaut werden, wird nach verfügbaren WLANs gesucht. Diese werden in einer Datei gespeichert, die später dem Kunden in der WLAN-Konfiguration angezeigt werden soll. Anschließend wird ap-setup.sh aufgerufen.
  • wlan-setup.sh versucht eine Verbindung mit dem hinterlegten WLAN aufzubauen.
  • ap-setup.sh erstellt einen „offenen“ AP.

Beispielhaft sind unten die Scripte switch.sh und ap-setup.sh angehängt.

 

–> Aktueller Status: Raspberry konfiguriert sein Netzwerk selbständigt und ohne Reboot

  • Raspberry verbindet sich (wenn möglich) mit dem konfigurierten WLAN.
  • Ist dies nicht möglich, scannt dieser die verfügbaren WLANs und startet in den AP-Modus.
  • Verbindet sich ein Gerät im AP-Modus, bekommt dieses eine IP-Adresse zugewiesen.

–> TO DO

  • Umsetzung in Buildroot
  • Bug: Manchmal werden WLAN-Prozesse nicht richtig beendet
  • Bug: Der AP-Modus funktioniert nur, wenn ein bestimmter WLAN-Kanal gewählt wird. Das automatische wählen des Kanals funktioniert nicht.
  • Die Ausnahmebehandlung in den Scripts muss verbessert werden. So können auch auf viele Sleep-Funktionen verzichtet und der Prozess beschleunigt werden.
  • Noch sind die WLAN-Informationen fest im Script hinterlegt. Diese sollen in eine Konfigurationsdatei ausgelagert werden.
  • Die IP im WLAN-Modus wird momentan über DHCP bezogen -> Möglichkeit der Konfiguration einer statischen IP soll gegeben sein.
  • Nice to have:
    • Bei einem Rest des Raspberry (Hardwareschalter?) soll die WLAN-Konfiguration gelöscht werden.
    • Bei einem Verbindungsabbruch des WLANs, soll automatisch die Verbindung wiederhergestellt werden.
    • LEDs am Raspberry zeigen an, ob er im WLAN-Modus oder AP-Modus ist.

Scripte:

switch.sh

#!/bin/bash
#
#überprüfe ob Rootrechte vorhanden sind
if [ „$EUID“ -ne 0 ]
then echo „Must be root“
exit
fi

#überprüfen ob mit WLAN verbunden
status=$(wpa_cli status | grep wpa_state | tr -d wpa_state=)
if [ „$status“ == „COMPLETED“ ]
then
#wenn Raspberry mit WLAN verbunden ist, wird nichts unternommen
echo „—> WLAN Status: Verbunden“
echo „Debug: Es wurden keine Änderungen durchgeführt“

else
#wenn Raspberry nicht mit WLAN verbunden ist, soll Access Point (AP) gestartet werden
echo „—> WLAN Status: Nicht verbunden“
echo „—> Prüfe ob AP-Modus bereits gestartet ist“
#überprüfe den AP Status
apstatus=$(sudo service hostapd status | grep ‚Active:‘)
if [[ $apstatus == *“running“* ]]
then
#wenn der AP läuft
echo „—> AP läuft bereits: Es werden keine Änderungen durchgeführt“
else
#wenn der AP nicht läuft
echo „—> AP läuft nicht“
echo „—> Suche Nach WLANs“
#führe wlan konfiguration durch
source /bin/wlan-setup.sh
#warten bis wlanadapter verfügbar ist
sleep 15
#suche nach verfügbaren WLANs und schreibe diese in eine Datei
iwlist wlan0 scan | grep ‚ESSID\|Encryption key‘ > /bin/wifis
#der erste Scanversuch schlägt meistens fehl
iwlist wlan0 scan | grep ‚ESSID\|Encryption key‘ > /bin/wifis
#Leerzeichen am Anfang jeder Zeile in der WLAN Datei löschen
sed -i ’s/^ *//‘ /bin/wifis
echo „—> Folgende WLANs wurden gefunden“
#gefundene WLANs anzeigen
cat /bin/wifis
#AP Modus starten
echo „—> Starte AP-Modus“
sleep 5
source /bin/ap-setup.sh
fi
fi

 

ap-setup.sh

#!/bin/bash
#
#überprüfe ob Rootrechte vorhanden sind
if [ „$EUID“ -ne 0 ]
then echo „Must be root“
exit
fi

#eventuell gestartete Services und Prozesse müssen beendet werden, die die selben Ressourcen nutzen
echo „Debug: Services stoppen“
wpa_cli -i wlan0 terminate
#Services stoppen
systemctl stop hostapd.service
systemctl stop dnsmasq.service
systemctl stop wpa_supplicant.service
#warte bis Services gestoppt sind
sleep 5
#es kann vorkommen, dass nicht alle Prozesse beendet wurden
killall -v wpa_supplicant

#prüfen ob wpa_supplicant wirklich beendet wurde
prozessstatus=$(ps -e | grep wpa_supplicant)
if [[ $prozessstatus == *“wpa_supplicant“* ]]
then
echo „—> ERROR: Prozess wpa_supplicant läuft noch“
fi

echo „Debug: DHCP konfigurieren“
#dnsmasq.conf wird konfiguriert
cat > /etc/dnsmasq.conf <<EOF
interface=wlan0
dhcp-range=10.0.0.2,10.0.0.5,255.255.255.0,12h
EOF

#hostapd wird konfiguriert
cat > /etc/hostapd/hostapd.conf <<EOF
#AP Konfiguration
interface=wlan0
hw_mode=g
channel=6
ssid=DingDong
EOF

#Netzwerkinterfaces werden konfiguriert
cat > /etc/network/interfaces <<EOF
#AP Konfiguration
iface eth0 inet manual

wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan0
iface wlan0 inet static
address 10.0.0.1
netmask 255.255.255.0
network 10.0.0.0
broadcast 10.0.0.255
EOF

#dhcp client wird konfiguriert
echo „denyinterfaces wlan0“ >> /etc/dhcpcd.conf

#starte Services
echo „Debug: Starte hostapd“
systemctl start hostapd.service
echo „Debug: Starte dhcp“
systemctl start dnsmasq.service
echo „Überprüfe ob hostapd gestartet ist“
#warte bis Services gestartet sind
sleep 5
#überprüfe ob hostapd gestartet wurde
apstatus=$(service hostapd status | grep ‚Active:‘)
if [[ $apstatus == *“running“* ]]
then
echo „—> AP erfolgreich gestartet“
else
echo „—> ERROR: AP nicht gestartet“
fi

 

DingDong 2. Blogeintrag: Automatische Netzwerkverbindung

Ein Kommentar zu „DingDong 2. Blogeintrag: Automatische Netzwerkverbindung

  • 7. Juni 2017 um 21:42 Uhr
    Permalink

    Vielen Dank für das Bereitstellen der Skripte. Die Umsetzung in Buildroot sollte sich von Raspbian nicht groß unterscheiden. Lediglich die die systemd-Einstellungen, die mit dem systemctl-Kommando gemacht werden, fallen weg. Stattdessen starten Sie die Dienste, sobald das Netzwerk verfügbar ist, in der Datei /etc/network/interfaces.

Kommentare sind geschlossen.