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.