J
Hallo an ALLE!
Ich hab folgendes Problem bei der Programmierung meines Modems: Es piept zu nicht vorhersehbaren Zeitpunkten!
Etwas genauer, mein Vorhaben ist das Abhoeren unserer innerhalb des Haushaltes befindlichen Telefone mittels Modem. D.h. es soll neben dem eigentlichen Abhoeren
auch moeglich sein, die entsprechenden Telefonate aufzuzeichnen (was das geringste Problem sein duerfte und zudem auch noch nicht implementiert wurde). Weiterhin sollen auch alle outgoing und alle incoming calls erkannt und mir bei Bedarf mitgeteilt werden.
Mein bis jetzt gecodeder -und unten aufgefuehrter- source wurde NUR fuer mein Laptop/Modem (Sony Vaio VGN-FE31B/Intel Corporation 82801G (ICH7 Family) HDA Controller (rev 02)) getestet.
Bei der Umsetzung haben sich schon am Anfang einige Probleme herauskristallisiert. U.a. waere hier zu nennen dass das Modem kein voice mode unterstuetzt und somit eben auch keinen Hayes-Befehl wie ATY0 um dem Modem dass
automatische Auflegen zu untersagen.
Meine Modemfunktionalitaet wird durch Linuxant/Conexant realisiert.
Dieser Treiber bildet die AT-Befehle (nicht alle) ab [http://www.linuxant.com/drivers/hsf/free/archive/100498D_RM_HxF_Released.pdf] so dass bsp.weise aus einen ATY0 ein +VNH=1 || +VNH=2 wird.
Da diese Befehle nur im voice mode funktionieren und mein Modem nicht immer nachdem es auflegt von Hand neu gestartet werden sollte wurde das im source durch eine
Erkennung der "NO DIALTONE"-Antwort des Modems implementiert.
Aber mein eigentliches Problem bleibt der fortdauernde beep-Ton. Der uebrigens in der Umgebung von Radios, Handys etc. am Wahrscheinlichsten ist.
Der beep-Ton beginnt sobald ich beginne die Leitung abzuhoeren manchmal nach einer Minute manchmal <1min. manchmal >1min. oder eben auch garnicht.
Auch nach einigem herumexperiementieren mit den mir zur Verfuegung stehenden data mode commands leider kein Erfolg . Auch die Soundcard-I/O's sind von mir nicht verschont wurden (boost, Lautstaerke usw.) aber auch hier nur
utopisches gehandwerk! Die mir eventl. erfolgsversprechenden voice mode commands
ala +VTD (Beep Tone Duration Timer), +VDT (Control Tone Cadence Reporting) oder aber auch einige S-Register stehen ja wie bereits erwaehnt nicht zur Verfuegung.
----------------------------
Hier der Code:
/*
* A telephone sniffer.
*
* Copyright (C) Manuel Gebele <forensixs[at]gmx[dot]de>
*
* Description:
* This tool allows you to receive telephone data from the analog line.
* The modem only understand data mode (+FCLASS=0).
*
* Notice:
* Only tested under Sony Vaio VGN-FE31B with a Intel Corporation 82801G
* (ICH7 Family) HDA Controller (rev 02).
*
* License:
* This file is licensed under the GPL v2.
*
* Compile:
* gcc -Wall -o phonesniff phonesniff.c
*
* 18052K07
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
static int open_modem(char *);
static int init_modem(int);
static void close_modem(int);
static int recall_modem(int);
//////////////////////////////
// MAIN
//////////////////////////////
int main(int argc, char *argv[])
{
unsigned recall = 0;
int modem, length;
char buff[255];
char *ptr;
char *pattern = "NO DIALTONE";
if(argc != 2) {
fprintf(stderr, "%s <port/line>\n", *argv);
exit(1);
}
/* Open serial port */
switch(modem = open_modem(*(argv+1))) {
case(3): /* MODIFY */
printf("-> %s is opened successful\n", *(argv+1));
break; /* All OK */
case(ENOENT):
perror("phonesniff");
exit(1);
case(EACCES):
perror("phonesniff");
exit(1);
default:
perror("phonesniff");
exit(1);
}
/* Set modem options */
if(init_modem(modem) != 0) {
perror("phonesniff");
close_modem(modem);
exit(1);
} else {
printf("-> Setting modem options successful\n");
printf("-> Launching for phone data.....\n");
}
/* Modem responses and RE-CALL */
for(;;) {
if(recall) {
if(recall_modem(modem) != 0) {
perror("phonesniff: Failure while RE-CALL modem");
exit(1);
}
recall = 0;
printf("-> RE-CALL modem successful\n\n");
}
ptr = buff;
length = read(modem, buff, 255);
ptr += length;
if(ptr[-1] == '\n' || ptr[-1] == '\r') {
*ptr = '\0';
printf("%s\n", buff);
/* Enable RE-CALL when NO DIALTONE is received */
if(strstr(buff, pattern) != NULL) recall = 1;
}
}
/* Terminate modem */
close_modem(modem);
return(0);
}
//////////////////////////////
// Open serial port
//////////////////////////////
static int open_modem(char *port)
{
int modem;
errno = 0;
if((modem = open(port, O_RDWR | O_NOCTTY | O_NDELAY)) == -1)
return(errno);
return(modem);
}
//////////////////////////////
// Close serial port
//////////////////////////////
static void close_modem(int modem)
{
if(modem != -1) {
close(modem);
modem = -1;
}
return;
}
//////////////////////////////
// Initializing modem
//////////////////////////////
static int init_modem(int modem)
{
struct termios term_attr;
if(tcgetattr(modem, &term_attr) != 0) {
perror("phonesniff");
close_modem(modem);
exit(1);
}
/* Set RS232 options */
term_attr.c_cflag |= (CLOCAL | CREAD);
term_attr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
term_attr.c_oflag &= ~OPOST;
if(tcsetattr(modem, TCSANOW, &term_attr) != 0) {
perror("phonesniff");
close_modem(modem);
exit(1);
}
/* Sending AT/Hayes commands to launch line */
errno = 0;
if(write(modem, "\r\n", 2) != 2)
return(errno);
if(write(modem, "ATZ\r\n", 5) != 5)
return(errno);
if(write(modem, "ATX3\r\n", 6) != 6)
return(errno);
if(write(modem, "ATDW\r\n", 6) != 6)
return(errno);
return(0);
}
//////////////////////////////
// Recall the modem
//////////////////////////////
static int recall_modem(int modem)
{
errno = 0;
if(write(modem, "ATZ\r\n", 5) != 5)
return(errno);
if(write(modem, "ATX3\r\n", 6) != 6)
return(errno);
if(write(modem, "ATDW\r\n", 6) != 6)
return(errno);
return(0);
}
OK ich denke das reicht erstmal falls etwas fuer etwaige Antworten fehlen oder unverstaedlich sein sollte werde ich das -sofern mir das moeglich ist- korrigieren.
Vielen Dank im Vorraus.