TCP-Client als FRITZ!Box Call Monitor: Unterschied zwischen den Versionen
K (Seite in Category:Control6 Examples eingefügt) |
|||
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | 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. | + | 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 [http://www.wehavemorefun.de/fritzbox/index.php/Callmonitor]. |
+ | 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) | TCP_HANDLER_PERSIST(callmonitor) | ||
for (;;) { | for (;;) { | ||
Zeile 10: | Zeile 13: | ||
char caller[15]=""; | char caller[15]=""; | ||
char called[15]=""; | char called[15]=""; | ||
− | + | ||
char *ptr = (char *) uip_appdata; | char *ptr = (char *) uip_appdata; | ||
ptr[uip_len] = 0; | ptr[uip_len] = 0; | ||
− | + | ||
− | + | dnl parse the message string in ptr | |
− | |||
− | dnl parse the message | ||
for (uint8_t i=0; i<uip_len; i++) { | for (uint8_t i=0; i<uip_len; i++) { | ||
if (ptr[i]==';') { | if (ptr[i]==';') { | ||
Zeile 39: | Zeile 40: | ||
} | } | ||
} | } | ||
− | + | ||
dnl print what we know to lcd | dnl print what we know to lcd | ||
hd44780_goto(2, 0); dnl prepare lcd print location | hd44780_goto(2, 0); dnl prepare lcd print location | ||
Zeile 49: | Zeile 50: | ||
if (call_type==2) { | if (call_type==2) { | ||
char buffer[27]; | char buffer[27]; | ||
− | sprintf(buffer, "Connection time: %d sec.",call_len); | + | sprintf(buffer, "Connection time: %d sec.", call_len); |
fputs(buffer, lcd); | fputs(buffer, lcd); | ||
} | } | ||
Zeile 57: | Zeile 58: | ||
} | } | ||
TCP_HANDLER_END(); | TCP_HANDLER_END(); | ||
− | + | ||
ON STARTUP DO | ON STARTUP DO | ||
− | TCP_CONNECT( | + | TCP_CONNECT(xxx.xxx.xxx.xxx, 1012, callmonitor); |
END | 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. | ||
− | + | [[Category:Control6 Examples]] | |
− |
Aktuelle Version vom 2. September 2011, 22:36 Uhr
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.