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.