Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Workaround to keep Fritzbox Callmonitor alive for a longer time #3

Closed
bufemc opened this issue Jun 13, 2020 · 2 comments
Closed

Workaround to keep Fritzbox Callmonitor alive for a longer time #3

bufemc opened this issue Jun 13, 2020 · 2 comments

Comments

@bufemc
Copy link

bufemc commented Jun 13, 2020

UPDATE: Dies war eine fruehe Loesung, die m.E. "Bessere" findet sich erst im naechsten Kommentar.

Beim bisherigen Ansatz den $fbSocket vorher einmalig aufzusetzen, und dann in der Loop nur noch mittels fgets($fbSocket); davon zu lesen gibt es - wie schon per email berichtet - das Problem, dass nach einiger Zeit (zB nach 2 Stunden), scheinbar selbst dann wenn Anrufe eingehen, "irgendwie" nicht mehr gesendet wird, was zu parsen waere, statt dessen geraet er immer in den else-Zweig.

Nach Lesen einiger Kommentare im Netz, die ebenso das Problem hatten dass sie nach einiger Zeit nichts mehr vom CallMonitor lesen konnten, und daher einfach die Verbindung neu aufsetzten, habe ich auf Verdacht das Gleiche adaptiert, grob:

    $fbSocket = false; // will be initialised below
    $counter = 0;
    while (true) {

        if ($counter % 80 == 0) {
            $fbSocket = $callrouter->getSocket();
            stream_set_timeout ($fbSocket, 1);        
        }     
        $counter += 1;

       [hier der bisherige Code der Loop]
    }

Und das scheint dem abzuhelfen. Natuerlich kann man sich streiten wie oft man sich neu verbindet, hier ist es irgendwas ueber jede 80 Sekunden, wenn man das sleep oder timeout bedenkt. Ich stelle das einfach mal als proof of concept ein, ohne PR - koennte aber gerne auch einen solchen erstellen ;-) Man muesste halt wissen/eruieren nach welcher ungefaehren Zeit dieses Problem auftritt. BTW, hatte ich auch Deinen bisherigen Ansatz (Socket nur einmal aufsetzen) versucht mit dem extra Flag STREAM_CLIENT_PERSISTENT, aber das half leider nicht.

PS: die andere Issue dass neue Eintraege nicht ins Telefonbuch eingefuegt werden koennen ("manchmal"), habe ich eine extra Issue erstellt.

Quellen:
https://forum.fhem.de/index.php?topic=41195.0
https://forum.fhem.de/index.php?topic=86590.0
https://community.home-assistant.io/t/fritzbox-callmonitor-loosing-connection/57789/3

@bufemc
Copy link
Author

bufemc commented Jun 17, 2020

Fuer die Nachwelt dokumentiert, IN KURZ: ein (TCP) Socket kann als TCP-keep-alive konfiguriert werden, von Haus aus ist er das aber NIE und laeuft nach ca. 2 Stunden ins Leere (Default-Wert fuer einige Systeme sind 7200 Sekunden +x). Ich habe versucht eine kleine Abhandlung (in engl.) hier zu schreiben, mit Loesungen fuer Java, PHP und Python: https://github.com/bufemc/a1-fritzbox#fritzboxs-call-monitor-socket-at-port-1012-and-tcp-keep-alive

Die Loesung fuer PHP muesste also sein:
socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1);

Zusaetzlich koennte man natuerlich noch schauen ob der Socket nicht doch geclosed wurde, und falls, dann neu aufbauen.

blacksenator referenced this issue Jun 23, 2020
…now refreshed regularly, extended logging, integrative testing with option -t, edited README.md
@blacksenator
Copy link
Owner

fixed with v2.2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants