Raspberry Pi von außen erreichen
lima-city → Forum → Heim-PC → Netzwerke
anfrage
anleitung
befehl
code
dank
datei
datenbank
frage
http
idee
installieren
konto
not
problem
programm
sekunde
server
url
verbindung
verwenden
-
Hallo,
ich würde gerne die GPIO-Pins meines Raspberry Pis über das Internet steuern können. Da ich von Netzwerken allgemein nicht so viel Ahnung habe, weiß ich nicht so recht, wie ich das anstellen soll.
So wie ich das verstanden habe, wäre eine Portfreigabe eine Möglichkeit. Da der Raspberry aber nicht bei mir zu Hause stehen soll, sind änderungen am Router ausgeschlossen.
Die Idee, die mir jetzt gekommen ist, ist eine MySQL Datenbank auf Lima-City zwischenzuschalten. Ich meine damit, dass ich von Irgendwo aus über eine Internetseite in die MySQL Datenbank einen Befehl wie beispielsweise
schreibe, und der Raspberry Pi dann in regelmäßigen Abständen den Lima-City-MySQL-Server fragt, ob es einen neuen Befehl gibt.Pin 22 an
Wie oft dürfte ich eine Anfrage vom Pi aus an die MySQL Datenbank senden? Wenn ich einen Abstand von 1 Sekunde wählen würde, wäre die Zeitverzögerung zwar gering, aber ich glaube nicht, dass ich Stunden lang Tausende von Anfragen senden darf, oder?
In den Regeln habe ich dazu das hier gefunden:
MySQL
[...]
max_questions: 350.000 (Anzahl der Abfragen, die ein Konto pro Stunde absetzen kann)
Quelle: https://www.lima-city.de/2008/mysql (Stand: 31.03.2014)
Heißt das, dass ich ohne Probleme und ohne den Lima-City-Server zu stark zu belasten 350.000 Anfragen pro Stunde schicken dürfte? Das wären fast 100 pro Sekunde.
Das wäre eine sehr unelegante Lösung, das ist mir bewusst. Welche Alternativen gibt es bzw. ist eine MySQL-Anfrag pro Sekunde doch nicht zu viel?
MFG THWBM
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wo hängt der Raspi dran? Wird der alle heiligen Zeiten mal umgesteckt?
Hast du einen anderen Server, zu dem dein Raspi eine VPN-Verbindung o.ä. aufbauen könnte?
Und zur Datenbank-Idee: wie schnell muss das System denn reagieren können? -
Danke für die schnelle Antwort.
hackyourlife schrieb:
Wo hängt der Raspi dran?
Meinst du damit die Netzwerksanbindung? Wenn ja, dann soll der Raspberry an ein einfaches Lankabel über einen standart Router laufen.
hackyourlife schrieb:
Wird der alle heiligen Zeiten mal umgesteckt?
In wie fern umgesteckt? In erster Linie ist die Verbndung über das Internet nur kurzzeitig für ein Paar Stunden nötig.
hackyourlife schrieb:
Hast du einen anderen Server, zu dem dein Raspi eine VPN-Verbindung o.ä. aufbauen könnte?
Ich habe leider nur einen Raspberry Pi und keine weiteren Server. Ich könnte allerhöchstens meinen Windows-PC, von dem aus ich den Raspberry steuern will, verwenden, sofern das geht.
hackyourlife schrieb:
Und zur Datenbank-Idee: wie schnell muss das System denn reagieren können?
Das von mir genannte Beispiel mit einem Aufruf pro Sekunde sollte (grob geschätzt) reichen. -
thwbm schrieb:
Das zahlt sich wohl nicht aus, die DB-Variante wird dich einfacher und schneller ans Ziel bringen.
hackyourlife schrieb:
Hast du einen anderen Server, zu dem dein Raspi eine VPN-Verbindung o.ä. aufbauen könnte?
Ich habe leider nur einen Raspberry Pi und keine weiteren Server. Ich könnte allerhöchstens meinen Windows-PC, von dem aus ich den Raspberry steuern will, verwenden, sofern das geht.
thwbm schrieb:
Die Frage dabei ist: Wie oft muss sein? Vergiss nicht, dass jede Anfrage von sich aus Zeit beansprucht, wenn du Pech hast schon mehr als eine Sekunde. Ich kenne deine Anwendung zwar nicht, aber allgemein: so selten wie möglich und so oft wie nötig solltest du abfragen. Denn was nützt es dir, wenn das zwar innerhalb einer Sekunde reagieren kann / könnte, es aber keinen Unterschied macht, ob das Ereignis sofort oder 10 Sekunden verspätet eintritt?
Das von mir genannte Beispiel mit einem Aufruf pro Sekunde sollte (grob geschätzt) reichen.
Außerdem könntest du noch Timestamps für Befehle vergeben, die in der Zukunft liegen, sodass das Raspi den Befehl holt und erst zum definierten Zeitpunkt irgendetwas tut; dadurch musst du ebenfalls nur sehr selten Daten aktualisieren.
Eventuell eine ganz andere Idee:
Kennst du XMPP? Dein Raspi könnte sich als XMPP-Client anmelden (z.B. bei Google, Facebook, lima-city o.ä.) und auf Nachrichten warten, die dann irgendetwas auslösen. Das hat den Vorteil, dass Nachrichten beinahe sofort ankommen und das Raspi nicht ständig nachfragen muss, ob es etwas tun soll. Falls du dir das mal ansehen magst könnte dir das weiterhelfen, wenn du Python als Programmiersprache nutzt… -
hackyourlife schrieb:
Das zahlt sich wohl nicht aus, die DB-Variante wird dich einfacher und schneller ans Ziel bringen.
Schade, aber die Frage ist, ob mich die Datenbank basierende Methode überhaupt an das Ziel bringt. Wenn die Abfragen als Angriff auf den Server gewertet werden, wäre das nicht so gut.
hackyourlife schrieb:
Die Frage dabei ist: Wie oft muss sein?
Das ganze ist geplant, um eine Webcam steuern zu können. Der Raspberry Pi soll die Webcam dabei drehen Können, damit man sich "umsehen" kann. Von daher sollte die Verzögerung nicht viel mehr als eine Sekunde betragen.
hackyourlife schrieb:
Außerdem könntest du noch Timestamps für Befehle vergeben
Gute Idee, aber leider hilft mir das in meiner Situation nicht.
hackyourlife schrieb:
Eventuell eine ganz andere Idee:
Kennst du XMPP?
Bisher habe ich XMPP nicht gekannt, aber es hört sich interessant an.
hackyourlife schrieb:
Falls du dir das mal ansehen magst könnte dir das weiterhelfen, wenn du Python als Programmiersprache nutzt?
Leider behersche ich kein Python. Ich habe die Befehle bisher über PHP verarbeitet.
Ist es möglich, über XMPP direkt eine Datei auf dem Server, der auf dem Raspberry Pi läuft, aufzurufen? Wenn ich also beispielsweise
in den Chat schreibe, dass dann die DateiPin 22 an
vom Raspberry Pi selber aufgerufen wird?<IP-des-Raspberrys>/index.php?Befehl=Pin_22_an
Um nochmal zu der Datenbank-Lösung zurück zu kommen:
Wäre ein Aufruf pro Sekunde zu viel? Wenn ja, wie viele Anfragen darf ich schicken, ohne als Angreifer zu gelten und ohne Lima-City zu sehr zu belasten?
Wie groß ist denn die durchschnittliche Zeitverzögerung bei einer MySQL-Datenbankabfrage?
Ich bin dankbar für jede Hilfe! -
Hallo
thwbm schrieb:
Wenn ich also beispielsweise
in den Chat schreibe, dass dann die DateiPin 22 an
vom Raspberry Pi selber aufgerufen wird?<IP-des-Raspberrys>/index.php?Befehl=Pin_22_an
Ich sehe laut hier, dass GPIO einfach per Kommandozeile geseuert werden kann (mit "wiringpi"?).
Für solche Fälle würde ich PHPSeclib verwenden, um mich über SSH einzuloggen und dann den Befehl auszuführen.
Vorteile:
- keine Datenbank nötig
- Implementierung SEHR einfach
- Verbindung zum Raspi verschlüsselt (auch wenn Skript auf anderem Server läuft und/oder mit SSL Zertifikat)
- Skript kann auf beliebigem Server mit PHP laufen (insofern dieser ausgehende Verbindungen erlaubt, lima tut das evtl. nicht)
- kein exec() für PHP benötigt, alles funktioniert mit standard Konfiguration
- Aufruf über .php?befehl=$command möglich, genau wie von dir gewünscht
mfg -
Danke für die Antwort!
voloya schrieb:
Ich sehe laut hier, dass GPIO einfach per Kommandozeile geseuert werden kann (mit "wiringpi"?).
Ja, genau diese Anleitung habe ich auch gefunden.
voloya schrieb:
Für solche Fälle würde ich PHPSeclib verwenden, um mich über SSH einzuloggen und dann den Befehl auszuführen.
PHPSeclib hört sich ganz gut an, aber ich verstehe noch nicht so ganz, wie das Funktioniert. Leider habe ich auch noch keine Anleitung zu PHPSeclib gefunden.
Muss PHPSeclib auf dem Raspberry Pi laufen oder auf einem Server im Internet, der dan den Raspberry anspricht? Müsste für SSH nicht ein bestimmter Port geöfnet werden, oder ist das in diesem Fall nicht nötig?
Kennt jemand eine gute Anleitung, in der Beschrieben wird, wie man mit PHPSeclib einen Befehl auf dem Raspberry ausführt?
Falls PHPSeclib doch nicht Funktionieren sollte, hat Irgendjemand noch Ideen zu meinen Fragen aus meiner letzten Antwort?
Ich freue mich auf all eure Antworten! -
Hallo
thwbm schrieb:
PHPSeclib hört sich ganz gut an, aber ich verstehe noch nicht so ganz, wie das Funktioniert. Leider habe ich auch noch keine Anleitung zu PHPSeclib gefunden.
PHPSeclib ist ein PHP Skript und muss auf einem Server mit PHP laufen. Ja, der SSH Port muss natürlich offen sein. Die Verwendung ist einfach, einbinden und die Funktionen verwenden...
https://www.google.de/search?q=phpseclib+howto
Es funktioniert auf jeden Fall. ;)
mfg -
Hallo,
voloya schrieb:
Ja, der SSH Port muss natürlich offen sein. Die Verwendung ist einfach, einbinden und die Funktionen verwenden...
thwbm schrieb:
[...] sind änderungen am Router ausgeschlossen.
Dann fällt PHPSeclib leider raus. Trotzdem Danke für den Vorschlag.
Ich denke, dass die MySQL-basierende Lösung am einfachsten in der Umsetzung wäre, aber ich habe Angst, Ärger mit Lima-City zu bekommen, da ich die Ressourcen zu stark belastebn würde. Kennt jemand offizielle Zahlen zu den Begrenzungen hier bei LC? Sind die in den Regeln unter https://www.lima-city.de/2008/mysql#nutzung genannten Werte nur die Werte, die theoretisch erreicht werden können, oder sind das auch die Werte, die man dauerhaft voll ausnutzen darf?
MFG THWBM -
Die angegebenen Werte sind Werte nach denen dein Zugriff technisch beschränkt wird, soll heißen weitere Zugriffe verhindert werden, diese Werte sind als absolutes Maximum zu sehen.
Rechne doch einfach mal nach wo du bei einem bestimmten Aktualisierungsintervall hinkommen würdest...
Ich würde die fertige Anwendung dann einem Knight zeigen und ihn bitten zu analysieren ob das in vertretbarem Rahmen ist, dann bist du auf der sicheren Seite.
Ich halte die Lösung mit Datenbank für extremst überdimensioniert.
Den Gedanken mit XMPP halte ich aber für wirklich interessant und wir (also hackyourlife und meine Wenigkeit, sowie einige andere User von Lima City) wissen das die verlinkte Bibliothek recht ordentlich funktioniert, zudem hat die Lösung den Vorteil des Function on Demand, das heißt ich kann durch absetzen eines Kommandos schalten, oder mir Signalzustände holen wie ich sie brauche (auch automatisiert) und zwar ohne das ich z.B. das ganze I/O Feld an eine DB übertragen muss was z.B. bei Analogwerten mitunter schon haarig wird sondern ich könnte genau den Status bekommen der mich interessiert und zwar fast ohne Zeitverlust.
Wernn man nur ein paar Pins klappern lassen will könnte man auch einen Arduino mit Ethernetshield nehmen...oder eine Variante mit Ethernet direkt, den nötigen Webserver kann man auf dem Arduino gleich selbst laufen lassen, für die Darstellung einiger Zustände und das absenden einiger Schaltbefehle sollte das reichen, viel mehr ist aber dann sicher nicht sinnvoll.
Am Schluss ist es immer eine Frage was genau man machen will, ehe man über eine PHP Lib den SSH anspricht kann man auch ne kline Clientsoftware schreiben die sich per SSH direkt einwählt, deutlich sicherer und sicherlich auch weit performanter...
Beitrag zuletzt geändert: 1.4.2014 17:46:11 von fatfox -
Hallo
thwbm schrieb:
Dann fällt PHPSeclib leider raus. Trotzdem Danke für den Vorschlag.
Oh verdammt, das habe ich überlesen. Du kannst aber trotzdem PHPSeclib lokal auf dem Raspi zum Ausführen der Befehle verwenden, um nicht exec() verwenden zu müssen.^^ (und es lässt sich leicht umziehen)
Du kannst übrigens auch php5-cli zum Ausführen der PHP Dateien verwenden.
thwbm schrieb:
Ich denke, dass die MySQL-basierende Lösung am einfachsten in der Umsetzung wäre, aber ich habe Angst, Ärger mit Lima-City zu bekommen, da ich die Ressourcen zu stark belastebn würde.
Wie viele mögliche Befehle gibt es denn? Nicht so viele, oder? Wäre da nicht eine textbasierte Lösung mit file_get_contents, bzw. einem bash Skript einfacher und perfomanter?
mfg -
Hallo,
fatfox schrieb:
Ich halte die Lösung mit Datenbank für extremst überdimensioniert.
Den Gedanken mit XMPP halte ich aber für wirklich interessant
Mit XMPP würde ich es auch gerne machen, die Lösung wäre viel schöner. Ich habe nur leider das Problem, dass ich kein Python behersche.
Ich habe mir ein XMPP/Jabber Benutzerkonto erstellt, das grundsätzliche Nachrichtenverschicken funktioniert auch. Was muss ich jetzt tun, damit ich Befehle an den Raspberry Pi schicken kann?
Was muss ich auf dem Raspberry Pi installieren?
Ich habe versucht, Sleekxmpp nach der Anleitung auf https://github.com/fritzy/SleekXMPP zu installieren. Wenn ich aber
abschicke, kommt die Fehlermeldungpip install sleekxmpp
zurück.-bash: pip: Kommando nicht gefunden.
Der Teil unter " Installing DNSPython" hat widerum funktioniert.
Muss ich irgendwelche weiteren Programme installeiren?
voloya schrieb:
Wie viele mögliche Befehle gibt es denn? Nicht so viele, oder? Wäre da nicht eine textbasierte Lösung mit file_get_contents, bzw. einem bash Skript einfacher und perfomanter?
Die Lösung, einen Server in einer Schleife mit Anfragen zu bombadieren ist fürs erste auf Eis gelegt. Ich versuche es erstmal mit XMPP.
MFG THWBM -
thwbm schrieb:
Dann ist es ein idealer Zeitpunkt es zu lernen.
Mit XMPP würde ich es auch gerne machen, die Lösung wäre viel schöner. Ich habe nur leider das Problem, dass ich kein Python behersche.
Ich habe mir ein XMPP/Jabber Benutzerkonto erstellt, das grundsätzliche Nachrichtenverschicken funktioniert auch. Was muss ich jetzt tun, damit ich Befehle an den Raspberry Pi schicken kann?
Du musst dir unter Zuhilfenahme der genannten Bibliothek (in Python auch Modul genannt) einen Client schreiben der sich zum Server verbindet und dann unter deiner Jabber ID auf von dir definierte Befehle lauscht. Du machst dir dann ein 2. Konto mit dem du die Befehle absendest (streng genommen geht es auch mit einem Account und unterschiedlichen Jabber Resourcen aber der Einfacheit halber schlag ich jetzt mal 2 Accounts vor)
Was muss ich auf dem Raspberry Pi installieren?
Phython3, pip3, sleekxmpp
Ich habe versucht, Sleekxmpp nach der Anleitung auf https://github.com/fritzy/SleekXMPP zu installieren. Wenn ich aber
pip ist ein modulmanager für Python, den muss man erst installieren, beachte das es ev. 2 unterschiedliche Varianten für Python 2 und und Python 3 gibt, wenn du jetzt erst mit python beginnst ist es denke ich besser du nimmst Python3 von Anfang an.
abschicke, kommt die Fehlermeldungpip install sleekxmpp
zurück.-bash: pip: Kommando nicht gefunden.
Muss ich irgendwelche weiteren Programme installeiren?
Überall wo du dann befehle absenden willst benötigst du einen Jabber Client, aber das kann man bspw. als portable Version auf einem USB Stick mitnehmen. -
fatfox schrieb:
Allein schon deshalb, da einige Bibliotheken für den Raspberry Pi Python-Bindings enthalten, so ist der Zugriff auf GPIO zum Beispiel direkt aus Python möglich, also genau das, was du brauchen wirst (*klick*, *klick*). Dadurch kannst du dir vermutlich dein derzeitiges PHP-Skript sparen … und viel lernen wirst du nicht müssen, vor allem da du bereits eine andere Sprache (offenbar) kannst
thwbm schrieb:
Dann ist es ein idealer Zeitpunkt es zu lernen.
Mit XMPP würde ich es auch gerne machen, die Lösung wäre viel schöner. Ich habe nur leider das Problem, dass ich kein Python behersche. -
Hallo,
fatfox schrieb:
thwbm schrieb:
[...] ich kein Python behersche.
Dann ist es ein idealer Zeitpunkt es zu lernen.
Das versuche ich jetzt auch.
hackyourlife schrieb:
[...] also genau das, was du brauchen wirst (*klick*, *klick*).
Danke für die Seiten, die haben mir sehr gut weitergeholfen.
Ich habe unter http://sleekxmpp.com/getting_started/echobot.html ein Programm gefunden, dass Grundsätlich schon meine Bedürfnisse Befriedigen sollte, wenn ich es mit den GPIO-Funktionen verknüpfe. Nur leider Funktioniert das Skript bei mir nicht. Wenn ich die Datei ausführe, bekomme ich eine Fehlermeldung:
pi@raspberrypi ~ $ sudo python Echobot.py
Username: <Benutzername eines Jabberkontos von mir>
Password: <Das Passwort für das Jabber-Konto>
WARNING DNS: dnspython not found. Can not use SRV lookup.
WARNING DNS: dnspython not found. Can not use SRV lookup.
Die Zeile "WARNING DNS: dnspython not found. Can not use SRV lookup." wird immer wieder in einer Schleife angezeigt. Es existiert ein Ordner mit dem Namen "dnspython" im gleichen Verzeichnis wie die Datei. Was mache ich falsch? Wo kann ich dnspython installieren?
Müsste ich nicht eigentlich auch irgendwo den Namen des Chatraums, auf dem ich mich mit meinen beiden Jabber-Konten "unterhalten" will, angeben?
Danke für alle bisherigen Antworten und für alle, die ncoh kommen!
MFG THWBM -
thwbm schrieb:
Wie die Meldung bereits sagt, es handelt sich nur um eine Warnung, die du vermutlich ignorieren kannst. Falls du dnspython nutzen magst, wirst du es mittels
Nur leider Funktioniert das Skript bei mir nicht. Wenn ich die Datei ausführe, bekomme ich eine Fehlermeldung:
pi@raspberrypi ~ $ sudo python Echobot.py
Username: <Benutzername eines Jabberkontos von mir>
Password: <Das Passwort für das Jabber-Konto>
WARNING DNS: dnspython not found. Can not use SRV lookup.
WARNING DNS: dnspython not found. Can not use SRV lookup.
Die Zeile "WARNING DNS: dnspython not found. Can not use SRV lookup." wird immer wieder in einer Schleife angezeigt.
o.ä. installieren müssen, genau so, wie du dies mit sleekxmpp getan hast.pip
thwbm schrieb:
Nein. Jabber kann über einen Chat-Raum laufen, es können allerdings auch direkt Konversationen zwischen zwei »Personen« geführt werden, du kannst also auch direkt mit deinem Raspi »sprechen«, ohne dem Umweg über eine »Konferenz« (= Chatraum).
Müsste ich nicht eigentlich auch irgendwo den Namen des Chatraums, auf dem ich mich mit meinen beiden Jabber-Konten "unterhalten" will, angeben? -
Hallo,
ich habe es jetzt geschafft, eine XMPP-Verbindung mit einem Python-Skript herzustellen.
Ich hatte ein paar Schwierigkeiten, die wahrscheinlich so Banal sind, dass sie in keiner Anleitung stehen. Trotzdem möchte ich hier jetzt meine Probleme mit Lösungen aufzählen, falls sich noch jemand dafür interessiert.
Das Programm ist dazu da, eine Nachricht, die von einem Benutzer per XMPP abgeschickt wurde zurückzugeben:
1) pip installieren
Leider weiß ich nichtmehr genau, wie ich pip installiert habe, aber ich denke, dass ich es mit dieser Anleitung gemacht habe. Unter dem Punkt "Using Package Managers" und dem Unterpunkt "On Debian and Ubuntu:" steht die Befehlszeile, mit der ich es so weit ich mich erinnern kann gemacht habe:
sudo apt-get install python-pip
2) SleekXMPP installieren
Auch hier bin ich mir nichtmehr 100%-ig sicher, aber ich denke, dass ich es mit diesem Befehl gemacht habe:
pip install sleekxmpp
3) Pythonskript kopieren
Das Skript kann man hier finden. Ich habe es in eine .py Datei kopiert und diese dann auf meinen Raspberry Pi kopiert.
4) Jabber-Konten erstellen
Ich habe mir hier zwei Benuterkonten angelegt. Ich nenne sie hier jetzt beispielsweise "Benutzer1@jwchat.org" mit dem Passwort "Passwort1" und "Benutzer2@jwchat.org" mit dem Passwort "Passwort2".
5) Skript anpassen
Von unten die 3. Zeile lautet "xmpp = EchoBot('somejid@example.com', 'use_getpass')". Sie muss angepasst werden:
xmpp = EchoBot('Benutzer1@jwchat.org', 'Passwort1')
6) Programm starten
Mit dem unten stehenden Befehl lässt sich das Programm starten:
sudo python echobot.py
7) Das Programm "ansprechen"
Jetzt braucht man das zweite Jabber-Konto, um sich unterhalten zu können. Ich habe mich hier mir "Benutzer2" angemeldet. In dem Fenster, dass sich geöffnet hat gibt es unten links ein "+"-Zeichen, auf das man draufklicken muss. In das Feld mit der Beschriftung "Send subscription to" füllt man dann "Benutzer1@jwchat.org" ein und drückt auf "Send".
8) Text abschicken
Wenn alles geklappt hat, solltet ihr jetzt euren Kontakt "Benutzer1" sehen können. Wenn ihr diesen anklickt geht ein Fenster auf, in das ihr die Nachrichten eintippen könnt, die vom Raspberry Pi zurückgegeben werden sollen.
Auf folgendes solltet ihr achten:
1) In dem Skript "Benutzer1@jwchat.org" angeben und nicht nur "Benutzer1".
2) Man sollte nicht mit "Benutzer1" irgendwo angemeldet sein währenddessen der Raspberry Pi dieses Konto verwendet. Das ist ein ziemlich blödes Problem, da ich lange nach gesucht habe und mich gewundert habe, warum das nicht funktioniert.
Ich hoffe, ich dass diese Anleitung einigermaßen verständlich ist und Jemandem weiterhilft. Wenn dieser Text fehler enthält, bitte ich um einen kurzen Hinweis.
MFG THWBM
Beitrag zuletzt geändert: 10.4.2014 16:54:14 von thwbm -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage