{"id":719,"date":"2016-10-09T12:34:24","date_gmt":"2016-10-09T11:34:24","guid":{"rendered":"http:\/\/www.open4me.de\/?p=719"},"modified":"2016-10-19T14:22:57","modified_gmt":"2016-10-19T13:22:57","slug":"fritzbox-esp8266-laesst-telefon-klingeln","status":"publish","type":"post","link":"https:\/\/www.open4me.de\/index.php\/2016\/10\/fritzbox-esp8266-laesst-telefon-klingeln\/","title":{"rendered":"Fritzbox: ESP8266 l\u00e4sst Telefon klingeln"},"content":{"rendered":"<p>Hin und wieder m\u00f6chte man daf\u00fcr sorgen, dass sich ein ESP8266 deutlich bemerkbar machen kann, wenn irgendwas wichtiges passiert ist.<\/p>\n<p>Meine Idee war, dass man \u00fcber die Fritzbox das Telefon klingeln lassen k\u00f6nnte.<\/p>\n<p><!--more--><\/p>\n<p>Leichter gesagt als getan. Viele Ideen musste ich verwerfen:<\/p>\n<ul>\n<li>Der ESP f\u00fchrt auf der FritzBox einen Rundruf (**9) durch. Leider habe ich keine L\u00f6sung gefunden, dies \u00fcber den ESP auszul\u00f6sen.<\/li>\n<li>ESP f\u00fchrt einen get-Request durch, dieser startet auf einem Linux-Server einen Voip Anruf und hierbei wird eine Audio-Datei abgespielt. Leider habe ich keine einfache L\u00f6sung f\u00fcr eine Umsetzung\u00a0 unter Linux gefunden. (Ich bin immer noch offen f\u00fcr Vorschl\u00e4ge)<\/li>\n<\/ul>\n<p>Durch einen Zufall bin ich auf den folgenden Dialog gesto\u00dfen:<\/p>\n<p><a href=\"http:\/\/www.open4me.de\/wp-content\/uploads\/fritzboxDialToneTest.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-720 size-large\" src=\"https:\/\/www.open4me.de\/wp-content\/uploads\/fritzboxDialToneTest-1024x670.png\" alt=\"fritzboxdialtonetest\" width=\"660\" height=\"432\" srcset=\"https:\/\/www.open4me.de\/wp-content\/uploads\/fritzboxDialToneTest-1024x670.png 1024w, https:\/\/www.open4me.de\/wp-content\/uploads\/fritzboxDialToneTest-300x196.png 300w, https:\/\/www.open4me.de\/wp-content\/uploads\/fritzboxDialToneTest-768x502.png 768w, https:\/\/www.open4me.de\/wp-content\/uploads\/fritzboxDialToneTest.png 1067w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><\/p>\n<p>Mit dieser Funktion kann man ein DECT-Telefon klingeln lassen.<\/p>\n<p>Perfekt &#8230; Nur wie kann ich darauf zugreifen?<\/p>\n<p>Nach einigen Suchen im Internet, ein paar Stunden programmieren und testen, war die Funktion endlich fertig.<\/p>\n<p>Wenn ich die Funktion aufruft, meldet sich der ESP8266 mit dem Passwort an der FritzBox an, startet den Klingelton-Test und beendet ihn nach 10 Sekunden wieder.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:c++ decode:true \" title=\"Fritzbox Ring Tone Test\">bool send() {\r\n\tHTTPClient http;\r\n\t  Serial.println(\"Notify FritzBox\");\r\n\r\n\t\/\/ Get Challenge\r\n\thttp.begin(\"http:\/\/fritz.box\/login_sid.lua\");\r\n\tint retCode = http.GET();\r\n\tif (retCode != 200) {\r\n\t\tSerial.println(\"Get Challengd failed! \" + String(retCode));\r\n\t\treturn false;\r\n\t}\r\n\tString result = http.getString();\r\n\tString challenge = result.substring(result.indexOf(\"&lt;Challenge&gt;\") + 11,\tresult.indexOf(\"&lt;Challenge&gt;\") + 19);\r\n\r\n\t\/\/ Calculate Response\r\n\tString reponseASCII = challenge + \"-\" + \"INSERT YOUR PWD HERE\";\r\n\tString responseHEX = \"\";\r\n\tfor (unsigned int i = 0; i  &lt; reponseASCII.length(); i++) {\r\n\t\tresponseHEX = responseHEX + String(reponseASCII.charAt(i), HEX) + \"00\";\r\n\t}\r\n\r\n\tMD5Builder md5;\r\n\tmd5.begin();\r\n\tmd5.addHexString(responseHEX);\r\n\tmd5.calculate();\r\n\r\n\tString response = challenge + \"-\" + md5.toString();\r\n\r\n\t\/\/ Login and get SID\r\n\thttp.begin(\"http:\/\/fritz.box\/login_sid.lua?user=&amp;response=\" + response);\r\n\tretCode = http.GET();\r\n\tif (retCode != 200) {\r\n\t\tSerial.println(\"Get Sid failed! \" + String(retCode));\r\n\t\treturn false;\r\n\t}\r\n\tresult = http.getString();\r\n\tString sid = result.substring(result.indexOf(\"&lt;SID&gt;\") + 5,\tresult.indexOf(\"&lt;SID&gt;\") + 21);\r\n\r\n\t\/\/ Execute Ring Tone Test\r\n\thttp.begin(\"http:\/\/fritz.box\/fon_devices\/edit_dect_ring_tone.lua?idx=1&amp;sid=\" + sid + \"&amp;ring_tone_radio_test=0&amp;start_ringtest=2\");\r\n\tretCode = http.GET();\r\n\tif (retCode != 200) {\r\n\t\tSerial.println(\"Enable Ring Tone Test failed! \" + String(retCode));\r\n\t\treturn false;\r\n\t}\r\n\tresult = http.getString();\r\n\r\n\t\r\n\t\/\/ Wait 10 sec\r\n\tdelay(10 * 1000);\r\n\r\n\t\/\/ Stop Ring Tone Test\r\n\thttp.begin(\"http:\/\/fritz.box\/fon_devices\/edit_dect_ring_tone.lua?idx=1&amp;sid=\" + sid + \"&amp;stop_ringtest=1&amp;ringtone&amp;start_ringtest=0\");\r\n\tretCode = http.GET();\r\n\tif (retCode != 200) {\r\n\t\tSerial.println(\"Stopping Ring Tone Test failed! \" + String(retCode));\r\n\t\treturn false;\r\n\t}\r\n\tresult = http.getString();\r\n\r\n\t\/\/ Logout\r\n\thttp.begin(\"http:\/\/fritz.box\/login_sid.lua?logout=1&amp;sid=\" + sid);\r\n\thttp.GET();\r\n\tresult = http.getString();\r\n\thttp.end();\r\n\r\n\treturn true;\r\n}<\/pre>\n<p>Einschr\u00e4nkungen \/ Anmerkungen:<\/p>\n<ul>\n<ul>\n<li>Im Sourcecode muss in Zeile 16 das Passwort ge\u00e4ndert werden. (keine Umlaute oder exotische Sonderzeichen. #%$,. und \u00e4hnliche sind wahrscheinlich ok)<\/li>\n<li>Das Passwort muss f\u00fcr die FritzBox, bevor es gehasht wird, einmal in <a href=\"https:\/\/de.wikipedia.org\/wiki\/UTF-16\">UTF-16 <\/a>umgewandelt werden. Da dies auf der ESP8266 nicht so ganz trivial ist, ber\u00fccksichtige ich nur Zeichen mit ASCII-Werten zwischen 1 und 255. Aus diesem Grund muss ein Passwort genutzt werden, welches keine Umlaute enth\u00e4lt.<\/li>\n<li>Der Sourcecode geht davon aus, dass die FritzBox unter http:\/\/fritz.box erreichbar ist. (ggf. http:\/\/fritz.box\/ passend \u00e4ndern)<\/li>\n<li>Es werden nur DECT Telefone unterst\u00fctzt und nur das erste klingelt. (ggf. idx=1 \u00e4ndern, damit ein anderes Telefon klingelt.)<\/li>\n<li>Mehr zu der genutzten Zugriffsmethode findet sich in diesem <a href=\"http:\/\/blog.soldierer.com\/wp-content\/AVM_Technical_Note_-_Session_ID.pdf\">Dokument<\/a>.<\/li>\n<\/ul>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hin und wieder m\u00f6chte man daf\u00fcr sorgen, dass sich ein ESP8266 deutlich bemerkbar machen kann, wenn irgendwas wichtiges passiert ist. Meine Idee war, dass man \u00fcber die Fritzbox das Telefon klingeln lassen k\u00f6nnte.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37,39,36],"tags":[],"class_list":["post-719","post","type-post","status-publish","format-standard","hentry","category-esp8266","category-fritzbox","category-mikroprozessor"],"_links":{"self":[{"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/posts\/719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/comments?post=719"}],"version-history":[{"count":12,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/posts\/719\/revisions"}],"predecessor-version":[{"id":738,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/posts\/719\/revisions\/738"}],"wp:attachment":[{"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/media?parent=719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/categories?post=719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.open4me.de\/index.php\/wp-json\/wp\/v2\/tags?post=719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}