{"id":985,"date":"2013-12-07T15:39:54","date_gmt":"2013-12-07T14:39:54","guid":{"rendered":"http:\/\/c64-online.com\/?page_id=985"},"modified":"2021-11-12T14:31:47","modified_gmt":"2021-11-12T13:31:47","slug":"steuerung-per-sms","status":"publish","type":"page","link":"https:\/\/c64-online.com\/?page_id=985","title":{"rendered":"Steuerung per SMS"},"content":{"rendered":"<p>Der Raspberry Pi kann nat\u00fcrlich problemlos mit vielen, aktuellen 3G-USB-Sticks arbeiten und z.B. SMS versenden. Aber ich m\u00f6chte hier auch zeigen, dass man zus\u00e4tzlich SMS empfangen und auswerten kann um z.B. bestimmte Jobs remote zu starten, ohne dass der Pi \u00fcber das Internet erreichbar ist.<\/p>\n<p>Als erstes brauchen wir einen 3G-Stick. Ich habe hier z.B. den Vodafone K3565-Z Stick. F\u00fcr dieses Modell gibt es bereits Nachfolgemodelle, die aber ebenfalls funktionieren.<\/p>\n<p>Als erstes sind ein paar Softwarepakete zu installieren, damit der Stick \u00fcberhaupt erkannt wird und angesprochen werden kann. Dazu geben wir die folgenden zwei Befehle ein:<\/p>\n<pre>sudo apt-get update\nsudo apt-get install gammu libgammu-i18n libgammu7 libjim-dev usb-modeswitch usb-modeswitch-data<\/pre>\n<p><strong>Achtung &#8211; neue Version: <\/strong>Bei aktuelleren Raspberry OS Versionen (seit 2021) m\u00fcssen die folgenden Befehle genutzt werden:<\/p>\n<pre data-tadv-p=\"keep\">sudo apt-get update\nsudo apt-get install gammu libgammu-i18n libgammu8 libjim-dev usb-modeswitch usb-modeswitch-data<\/pre>\n<p>Nach dieser Installation k\u00f6nnte man den Stick z.B. direkt daf\u00fcr verwenden, eine Internetverbindung per UMTS aufzubauen. Hier wollen wir aber mit SMS arbeiten und brauchen daf\u00fcr das Sende- und Empfangstool <em><strong>gnokii<\/strong><\/em>. Es gibt weitere SMS-Tools, die aber entweder komplizierter in der Anwendung sind oder nicht alle Funktionen abdecken.<\/p>\n<p>Die Installation erfoltgt mittels:<\/p>\n<pre>sudo apt-get install gnokii<\/pre>\n<p>Nach der Installation ist es Zeit, den UMTS-Stick mit einer aktiven Mobilfunkkarte an den Raspberry Pi anzuschlie\u00dfen und diesen einmal zu rebooten.<\/p>\n<p>Nun muss der eingesetzte UMTS-Stick eingerichtet werden. Das dieses je nach Modell unterschiedlich ist, beschreibe ich hier das Vorgehen f\u00fcr den oben bereits erw\u00e4hnten Vodafone K3565-Z\u00a0 Stick. Dieser richtet sich eigenst\u00e4ndig mit vier USB-Devices ein (<em>\/dev\/ttyUSB0 &#8230; \/dev\/ttyUSB3<\/em>).<\/p>\n<p>Als erstes legen wir nun die Konfigurationsdatei f\u00fcr gnokii an. Diese liegt standardgem\u00e4\u00df im Home-Verzeichnis des ausf\u00fchrenden Users in einem Unterverzeichnis. Beispiel f\u00fcr den User zabbix:<\/p>\n<pre>\/home\/zabbix\/.config\/gnokii\/config<\/pre>\n<p>Also legen wir zuerst das Verzeichnis an.<\/p>\n<pre>mkdir -p \/home\/zabbix\/.config\/gnokii<\/pre>\n<p>Wir sollten dieses als der Bentzer tun, dessen Home-Verzeichnis wir verwenden. Ansonsten sind die Berechtigungen nicht richtig gesetzt und m\u00fcssen manuell ge\u00e4ndert werden.<\/p>\n<p>Die Datei &#8222;<em>config<\/em>&#8220; editieren wir mit<\/p>\n<pre>nano \/home\/zabbix\/.config\/gnokii\/config<\/pre>\n<p>und schreiben die folgenden Zeilen f\u00fcr das Ansprechen des Sticks hinein:<\/p>\n<pre>[global]\nport = \/dev\/ttyUSB3\nmodel = AT\nconnection = serial<\/pre>\n<p>Nun muss noch das Verzeichnis f\u00fcr die Log-Datei angelegt werden. Dieses erledigen wir mit<\/p>\n<pre>mkdir -p \/home\/zabbix\/.cache\/gnokii<\/pre>\n<p>Dort schreibe gnokii dann eine Datei names &#8222;gnokii-errors&#8220; hinein, die dann auftretende Fehler enth\u00e4lt.<\/p>\n<\/p>\n<h2>Versand und Empfang von SMS<\/h2>\n<p><strong>Info:<\/strong> Ich habe aus kostengr\u00fcnden derzeit einen relativ optimalen Tarif bei <a href=\"http:\/\/www.winsim.de\/tariffs\/winsim-6-cent-tarif\">http:\/\/www.winsim.de<\/a> gefunden. Hier handelt es sich um einen Postpaid-Vertrag aber ohne Grundgeb\u00fchr und je SMS 0,06 \u20ac Kosten auch preislich sehr interessant. Da es ein Vertrag ist und keine Prepraid-Karte muss man hier auch keine Angst haben, das die Karte pl\u00f6tzlich durch zu wenig Nutzung einfach deaktiviert wird!<\/p>\n<p>Als erstes m\u00fcssen wir nun den Stick mit der PIN einbuchen. Angenommen die PIN der SIM-Karte lautet 1234, so sieht der Befehl daf\u00fcr wie folgt aus:<\/p>\n<pre>echo \"1234\" | gnokii --entersecuritycode PIN<\/pre>\n<p>Jetzt sollte der Stick eingebucht sein, und wir k\u00f6nnen zum Test eine SMS versenden. Wenn die Empf\u00e4ngernummer z.B. 0172-123456 lautet, geben wir folgenden Befehl ein:<\/p>\n<pre>echo \"Dieses ist eine Test-SMS von meinem Pi!\" | gnokii --sendsms +49172123456<\/pre>\n<p>Diese SMS sollte nun problemlos auf dem entsprechendem Handy ankommen.<\/p>\n<p>Der SMS-Empfang ebenfalls einfach. Hierbei muss beachtet werden, dass der Stick zun\u00e4chst die SMS empf\u00e4ngt und diese auf einem der 10 vorhandenen Speicherpl\u00e4tze der SIM-Karte speichert. Dabei wird immer bei Speicherplatz eins angefangen, sofern dieser leer ist. Folgende SMS Nachrichten werden dann in den n\u00e4chst h\u00f6heren Speicherplatz gespeichert. Von dort aus kann <em><strong>gnokii<\/strong><\/em> die SMS abholen und ausgeben. Das funktioniert dann mit dem Befehl:<\/p>\n<pre>gnokii --getsms SM 1<\/pre>\n<p>Dieser Befehl liest den ersten Speicherplatz aus und gibt die Nachricht direkt wieder. Ist der Speicherplatz leer erh\u00e4lt man folgende Nachricht:<\/p>\n<pre>Getting SMS failed (location 1 from SM memory)! (Der gegebene Platz ist leer.)<\/pre>\n<p>Mit dem folgenden Skript frage ich alle f\u00fcnf Minuten den SMS-Eingang ab und reagiere, wenn ich von meinem Handy eine SMS mit einem bestimmten Befehl gesendet wurde. Dadurch kann man z.B. remote eine Fritzbox rebooten, wenn das Internet nicht mehr funktioniert:<\/p>\n<pre>#!\/bin\/bash\nlogfile=\"\/var\/log\/check_sms_in.log\"\n\nfor (( nr=0; nr&lt;10; nr++ ))\ndo\nsms=$(gnokii --getsms SM $nr 2&gt;&amp;1)\n#\n# Ist der Speicherplatz leer, kann das Skript beendet werden.\n#\nif [ \"`echo \\\"$sms\\\" | grep \\\"(Der gegebene Platz ist leer.)\\\"`\" ]; then\n\u00a0 exit 0\nelse\n#\n# Pr\u00fcfen, ob der Stick eingebucht ist. Ansonsten die PIN senden zum Einbuchen.\n# \n\u00a0 if [ \"`echo \\\"$sms\\\" | grep \\\"besser als garnichts\\\"`\" ]; then\n\u00a0\u00a0\u00a0 echo \"1234\" | gnokii --entersecuritycode PIN\n\u00a0\u00a0\u00a0 exit 0\n\u00a0 fi\nfi\n#\n# Absender-Nummer auslesen und den Befehl aus der SMS erkennen.\n# Syntax f\u00fcr die SMS ist dann \"Start.Befehl\". \n#\nabsender=$(echo \"$sms\" | grep Absender: | cut -d+ -f2 | cut -d\\\u00a0 -f1)\n#\n# Den Prefix \"Start.\" vom eigentlichen Befehl trennen\n#\ncmd=$(echo \"$sms\" | grep Start | cut -d. -f2)\n#\n# Pr\u00fcfen, ob die SMS von meinem Handy gekommen ist.\n# Handynummer ohne f\u00fchrendes Plus-Zeichen eintragen!\n# Ist die SMS von meinem Handy, dann je nach Befehl die Kommandos ausf\u00fchren.\nif [ \"$absender\" == \"49172123456\" ]; then\n\u00a0 case \"$cmd\" in\n\u00a0\u00a0 fritzreboot )\n\u00a0\u00a0\u00a0\u00a0 \/usr\/local\/bin\/fritz-reboot\n\u00a0\u00a0\u00a0\u00a0 echo \"Fritz!Box wird gerade rebootet! Dauer ca. 2 Minuten...\" | gnokii --sendsms +49172123456\n\u00a0\u00a0 ;;\n\n\u00a0\u00a0 getip )\n\u00a0\u00a0\u00a0\u00a0 GETEXTIP=$(curl -0 --silent http:\/\/checkip.dyndns.org | awk '{print $6}' | cut -f 1 -d \"&lt;\")\n\u00a0\u00a0\u00a0\u00a0 echo \"Die externe IP-Adresse ist $GETEXTIP\" | gnokii --sendsms +49172123456\n\u00a0\u00a0 ;;\n\n\u00a0\u00a0 help )\n\u00a0\u00a0\u00a0\u00a0 cat \/usr\/local\/bin\/check_sms_in.help | gnokii --sendsms +49172123456\n\u00a0\u00a0 ;;\n\n  esac\nfi\ngnokii --deletesms SM $nr\ndone<\/pre>\n<p>Sende ich per SMS also z.B. &#8222;Start.fritzreboot&#8220;, so wird das Skript <em><strong>\/usr\/local\/bin\/fritz-reboot <\/strong><\/em>gestartet. Bei &#8222;Start.getip&#8220; schickt mir das Skript meine externe IP-Adresse per SMS zur\u00fcck und &#8222;Start.help&#8220; sendet mir den Inhalt der Datei <em><strong>\/usr\/local\/bin\/check_sms_in.help <\/strong><\/em>zu. Das k\u00f6nnten z.B. alle verf\u00fcgbaren Befehle sein, wenn man die mal vergessen hat. \ud83d\ude09 Im Anschlu\u00df wird der Speicher dann wieder gel\u00f6scht und der n\u00e4chste Speicherplatz wird abgerufen.<\/p>\n<p>Dieses Skript lasse ich per Cronjob alle f\u00fcnf Minuten ausf\u00fchren. Man k\u00f6nnte dieses Skript auch als Daemon laufen lassen, allerdings verbraucht das ganze dann zu viel CPU-Leistung und in der Regel ist f\u00fcr diesen Zwek eine Reaktionszeit von maximal f\u00fcnf Minuten vollkommen ausreichend.<\/p>\n<p>Der Vollst\u00e4ndigkeit halber hier noch das Skript, um eine Fritzbox zu rebooten:<\/p>\n<pre>#!\/usr\/bin\/expect\n\nspawn telnet 192.168.0.1\nexpect \"password:\"\nsend \"MeinPasswort\\n\"\nexpect \"# \"\nsend \"\/sbin\/reboot\\n\"\nexpect \"# \"\nsend \"exit\\n\"<\/pre>\n<p>Hier muss nur die erste Zeile entsprechend der IP-Adresse der eigenen Fritzbox und die dritte Zeile mit dem entsprechenden Passwort ge\u00e4ndert werden. Hinter dem Passwort muss das <strong>\\n <\/strong>stehen bleiben, damit ein Return hinter dem Passwort gesendet wird.<\/p>\n<\/p>\n<h2>\u00c4ndern des ttyUSB-Devices nach einem Reboot (03.04.2016)<\/h2>\n<p>Leider kommt es vor, dass nach einem Reboot das ttyUSB-Device, welches in der gnokii Konfigurationsdatei angegeben werden muss, ein anderes ist als zuvor. Das passiert vor allem dann, wenn man mehrere USB-Ger\u00e4te am Raspberry angeschlossen hat. Hier hilft dann nur ein kleines Skript, welches gleich nach dem Booten das USB-Device sucht und die Konfigurationsdatei anpasst.<\/p>\n<p>Das untenstehende Skript muss zun\u00e4chst so ge\u00e4ndert werden, dass das Skript immer nach dem richtigen Device sucht. Dazu finden wir zun\u00e4chst das passende Device. Wenn wir den aktuellen ttyUSB-Port kennen, geben wir folgende beiden Befehle ein:<\/p>\n<pre>cd \/sys\/devices\/platform\nfind . -name ttyUSB4<\/pre>\n<p>In diesem Fall ist unser aktuell richtiger Port also ttyUSB4. Nun erhalten wir folgende Ausgabe:<\/p>\n<pre>root@raspberrypi:\/sys\/devices\/platform# find . -name ttyUSB4\n.\/soc\/3f980000.usb\/usb1\/1-1\/1-1.5\/1-1.5:1.3\/ttyUSB4\n.\/soc\/3f980000.usb\/usb1\/1-1\/1-1.5\/1-1.5:1.3\/ttyUSB4\/tty\/ttyUSB4<\/pre>\n<p>Der f\u00fcr uns wichtige Teil ist der Verzeichnisteil bis zum <em><strong>ttyUSB4.<\/strong><\/em> Diesen Teil passen wir im folgenden Skript im fett markierten Teil an:<\/p>\n<pre>#!\/bin\/sh\nport=$(ls -d \/sys\/devices\/platform\/<strong>soc\/3f980000.usb\/usb1\/1-1\/1-1.5\/1-1.5:1.3<\/strong>\/tty*\/ | cut -d \"\/\" -f11)\nport=$(echo \"port = \/dev\/\"$port)\n\nsed 's*port = \/dev\/tty[A-Z]\\*[0-9]*'\"$port\"' *' \/root\/.config\/gnokii\/config &gt;\/tmp\/config\nmv \/tmp\/config \/root\/.config\/gnokii\/.<\/pre>\n<p>Dieses Skript legen wir z.B. unter <em><strong>\/usr\/local\/bin\/set_sms_device.sh<\/strong><\/em> an. Nun gen\u00fcgt ein Eintrag in der crontab oder ein Aufruf aus der <em><strong>\/etc\/rc.local<\/strong><\/em>. Danach wird bei jedem Bootvorgang das korrekte Device eingetragen und der SMS-Dienst funktioniert wieder.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Raspberry Pi kann nat\u00fcrlich problemlos mit vielen, aktuellen 3G-USB-Sticks arbeiten und z.B. SMS versenden. Aber ich m\u00f6chte hier auch zeigen, dass man zus\u00e4tzlich SMS empfangen und auswerten kann um z.B. bestimmte Jobs remote zu starten, ohne dass der Pi \u00fcber das Internet erreichbar ist. Als erstes brauchen wir einen 3G-Stick. Ich habe hier z.B. &#8230;<\/p>\n<p><a href=\"https:\/\/c64-online.com\/?page_id=985\" class=\"more-link\">Continue reading &lsquo;Steuerung per SMS&rsquo; &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":115,"menu_order":2,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-985","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/c64-online.com\/index.php?rest_route=\/wp\/v2\/pages\/985","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/c64-online.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/c64-online.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/c64-online.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/c64-online.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=985"}],"version-history":[{"count":9,"href":"https:\/\/c64-online.com\/index.php?rest_route=\/wp\/v2\/pages\/985\/revisions"}],"predecessor-version":[{"id":4785,"href":"https:\/\/c64-online.com\/index.php?rest_route=\/wp\/v2\/pages\/985\/revisions\/4785"}],"up":[{"embeddable":true,"href":"https:\/\/c64-online.com\/index.php?rest_route=\/wp\/v2\/pages\/115"}],"wp:attachment":[{"href":"https:\/\/c64-online.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}