Problem:
Für z.B. die internetgestützten Meisenkästen wird der Raspberry Pi headless betrieben, das heißt: Man kommt lediglich über ssh auf den Raspberry. Dazu ist die Kenntnis der IP-Adresse erforderlich.
Lösungsansatz:
Mit einem einfachen Script ermittelt der Raspberry beim Systemstart selber seine IP-Adresse, übergibt sie an einen Webservice im Internet, der Webservice speichert die IP-Adresse ab.
Notwendige Voraussetzungen:
- Sie haben einen Raspberry Pi mit Internetzugang.
- Sie haben Zugriff auf einen Webserver, auf dem Sie PHP-Scripte speichern können.
Benötigte Scripte:
Auf dem Raspberry:
Auf dem Rasberry genügt ein einfaches Shell-Script:
#!/bin/bash # holt IP Adresse # ruft Webservice auf, # der IP-Adresse speichert # in cron bei Neustart aufrufen ipadr=$(hostname -I) echo IP Adresse $ipadr # Web Aufruf curl "http:///service/getipWS.php?ip=$ipadr&name=Schiefbahn+Garten" echo
Das Shell-Script rufen Sie durch einen Eintrag in CRON automatisch beim Neustart des Raspberrys auf. Die Besonderheit: Geben Sie dem Rapberry Zeit, die Verbindung zum lokalen Netzwerk aufzubauen. Das ist in dem Beispiel durch „sleep 30“ realisiert. die interessierende Zeile ist:
@reboot sleep 30; /home/pi/getip.sh >/mnt/ramdisk/getip.log
So könnte zum Beispiel Ihre Crontab aussehen:
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command */30 * * * * /home/pi/wifirefresh.sh >/dev/null 2>&1 #*/10 * * * * /home/pi/naturwatchcam.py >/dev/null 2>&1 0 * * * * /home/pi/cam.py >/dev/null 2>&1 @reboot sleep 30; /home/pi/getip.sh >/mnt/ramdisk/getip.log
Auf dem Webserver:
Auf dem Webserver schreiben Sie einen Webservice (hier getipWS.php), der durch den curl-Aufruf des Raspberrys genutzt wird.
// getipWS.php // Claus Brell, 20.05.2018 // nimmt IP entgegen, z.B. eines Raspberry Pi // speichert IP-Adresse in getip.log // Aufruf: getipWS?ip=192.168.1.104 // alternativ: getipWS?ip=192.168.1.104&name=mein+kleiner+Raspberry // Rückgabe: // ok wenn vermutlich richtiger Parameter // fehler wenn Parameter zu lang // ? wenn kein Parameter übergeben if(isset($_GET['ip'])){ if(strlen($_GET['ip'])<16){ // übergebene IP in lokale Variable speichern: $ip=$_GET['ip']; // übergebenen Namen in lokale Variable speichern: if (isset($_GET['name'])) $name=$_GET['name']; else $name='unbekannt'; // Internetadresse, woher der Aufruf kommt: $ipremote=getenv("REMOTE_ADDR"); $domain=gethostbyaddr($ipremote); // CSV-String zusammenstellen: $ausgabe=date("ymd-His").';'.$ip.';'.$name.';'.$ipremote.';'.$domain."\r\n"; // CSV-String an Datei anhängen: file_put_contents("getip.log",$ausgabe,FILE_APPEND); echo 'ok'; } else echo 'fehler'; } else echo '?';
Auf Ihrem Webserver finden Sie dann die Textdatei getip.log im CSV-Format, in der die lokale IP-Adresse steht. So könnte ein Beispieleintrag in getip.log aussehen:
180520-082623;192.168.0.103 ;Schiefbahn Garten;80.140.39.66;p508C2742.dip0.t-ipconnect.de