TCP-Client als FRITZ!Box Call Monitor
Bei der verbreiteten FRITZ!Box lässt sich ein TCP-Server einschalten, der bei eingehenden oder ausgehenden Anrufen Messages mit einigen Daten zur Telefonverbindung sendet. Der Call Monitor wird bei der FRITZ!Box einmalig durch Anruf von #96*5* an einem Analogtelefon eingeschaltet und sendet dann auf Port 1012. Nähere Angaben zum Message-Format stehen z.B. im AVM Wiki [1].
Das folgende Programm verbindet sich mit der FRITZ!Box und zeigt die Rufnummer des Anrufers und die angerufene Nummer sowie nach Gesprächsende die Verbindungszeit an:
CONTROL_START TCP_HANDLER_PERSIST(callmonitor) for (;;) { if (uip_newdata ()) { uint8_t j; uint8_t part=0; uint8_t call_type=0; uint16_t call_len=0; char caller[15]=""; char called[15]=""; char *ptr = (char *) uip_appdata; ptr[uip_len] = 0; dnl parse the message string in ptr for (uint8_t i=0; i<uip_len; i++) { if (ptr[i]==';') { part++; j=0; } else { if (part==1 && ptr[i]=='R') call_type=1; dnl RING if (part==1 && ptr[i]=='D') call_type=2; dnl DISCONNECT if (part==3 && call_type==1) { caller[j]=ptr[i]; dnl copy to string j++; caller[j]='\0'; dnl prepare end of string } if (part==4 && call_type==1) { called[j]=ptr[i]; dnl copy to string j++; called[j]='\0'; dnl prepare end of string } if (part==3 && call_type==2) { call_len = call_len*10 + ptr[i] - '0'; dnl convert to int } } } dnl print what we know to lcd hd44780_goto(2, 0); dnl prepare lcd print location if (call_type==1) { fputs(caller, lcd); fputs(" calling ", lcd); fputs(called, lcd); } if (call_type==2) { char buffer[27]; sprintf(buffer, "Connection time: %d sec.", call_len); fputs(buffer, lcd); } call_type=0; dnl only needed if you defined calltype globally } PT_YIELD(pt); } TCP_HANDLER_END(); ON STARTUP DO TCP_CONNECT(xxx.xxx.xxx.xxx, 1012, callmonitor); END CONTROL_END
Statt xxx.xxx.xxx.xxx ist natürlich die IP-Adresse der FRITZ!Box anzugeben. Die Daten lassen sich außer zur reinen Anzeige auch dazu nutzen, durch Telefonanrufe Steurvorgänge auszulösen.