Einer meiner IoT Raspis (headless) hängt über eine ca. 30 Meter weite WiFi Freiluft Verbindung am Router bzw. Access Point. Mit Wavemon gemessen sieht dann die Empfangsqualität auch unter optimalen Umständen eher mau aus und schwankt stark:
Wenn sich nun noch Hindernisse wie Gartenstühle, Personen etc. zwischen Antenne und Repeater befinden, wird die Qualität noch schlechter und die Verbindung reißt ab.
Ob der Pi sich anschließend wieder mit dem WLAN verbindet hängt vom Zufall ab – im schlimmsten Fall muss ich den Pi neu booten. Das habe ich einer kleinen Python Routine übertragen, welche checkt, ob eine Verbindung ins Internet oder den Router aufgebaut werden kann. Wenn nicht, wird nach ein paar fehlgeschlagenen Wiederholungen automatischn neu gebootet.
Vorsicht Falle!
Weil es so schön sinnvoll und professionell klingt, habe ich in raspi-config bei "3 Boot Options" die Einstellung "B2 Wait for Network at Boot" gewählt.
Das ist unter den oben beschriebenen Umständen kontraproduktiv. Wenn der Pi neu startet und nich innerhalb einer gewissen Zeitspanne mit dem WLAN connected, dann wartet der Pi ewig und drei Tage auf höhere Eingebungen bzw. das Netzwerk. Da hilft dann nur Stecker ziehen.
Setzt man obige Einstellung auf "No", läuft alles wie geschmiert.
Die Einstellung "B2 Wait for Network at Boot" macht in vielen, wenn nicht den meisten anderen Fällen durchaus Sinn! Zum Beispiel, wenn ein NAS Laufwerk (z.B. Synology) beim Starten über einen FSTAB Eintrag eingebunden (gemounted) werden soll. Oft ist der Pi nach dem Start so schnell beim Abarbeiten der mount Aufträge angekommen, dass das Netzwerk noch nicht steht. Setzt man "B2 Wait for Network at Boot" auf "Yes" klappt es auch mit dem Verbinden des NAS.
WiFi Self Check Routine
Hier noch die kleine Routine zum Überprüfen der Netzwerkverbindung und ggf. Neustart:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/usr/bin/python #coding=UTF-8 #----------------- # German documentation can be found at https://rustimation.eu # This program tries to establish a connection to a given Internet site. # In case, a connection cannot established after several retries it will # reboot the computer. # This program should be called at regular intervals (ca. 15 minutes) # by use of a crontab statement. #----------------- import urllib2 import time import logging import os def internet_on(): try: response=urllib2.urlopen('http://google.com',timeout=urltimeout) return True except urllib2.URLError as err: pass return False # Logging - logfile must be present logging.basicConfig(filename='/var/log/checkinet.log',level=logging.WARNING,format='%(asctime)s %(message)s') #### setting constants # set timeout for URL check [s] urltimeout=15 # set wait inbetween retries [s] retrywait=20 # set wait after shutdown [s] shutdownwait=1 # set number of retries retries=5 inetstatus=internet_on() # Check whether Internet is available attempt=0 while not inetstatus: attempt=attempt + 1 errmsg="Attempt number " + str(attempt) + ": connect failed, retrying" logging.warning(errmsg) if attempt >= retries: logging.warning("I seem to be offline, rebooting!") os.system("sudo reboot") # reboot #wait for some seconds before next try and return to top of while loop time.sleep(retrywait) inetstatus=internet_on() if inetstatus: logging.debug("I am online!") #End of Connectivity check |