TCP-Client als FRITZ!Box Call Monitor: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „Bei der verbreiteten FRITZ!Box lässt sich ein TCP-Server einschalten, der bei eingehenden oder ausgehenden Anrufen Messages mit einigen Daten zur Telefonverbindu…“) |
K (Seite in Category:Control6 Examples eingefügt) |
||
| (4 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) | ||
| + | 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. | 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.