2011-07-04 11 views
0

私はhuawei 3g usbモデムの中に置いたSIMカードからLinuxのシリアルポート経由でSMSメッセージを読み込もうとしています。私はいくつかのSMSメッセージが画面に表示されるまでにスクリプトを何度も実行しなければなりません。時にはそれは異常な文字を表示します。私がしたいのは、ATコマンド、Cとシリアルポートを使ってシムからSMSメッセージを読むことだけです。以下は私が使用しているコードです。シムからのSMSメッセージをLinuxのシリアルポート経由で読むC

int main(){ 
int fd; 
struct termios options; 

/* open the port */ 
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); 
if (fd == -1) 
{ /* Could not open the port */ 
fprintf(stderr, "open_port: Unable to open /dev/ttyS1 - %s\n",strerror(errno)); 
}else{ 
printf("port opened\n"); 
} 
fcntl(fd, F_SETFL, 0); 

/* get the current options */ 
tcgetattr(fd, &options); 

/* set raw input, 1 second timeout */ 
options.c_cflag |= (CLOCAL | CREAD); 
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
options.c_oflag &= ~OPOST; 
options.c_cc[VMIN] = 0; 
options.c_cc[VTIME] = 10; 

/* set the options */ 
tcsetattr(fd, TCSANOW, &options); 

char buffer[400]; /* Input buffer */ 
char *bufptr; /* Current char in buffer */ 
int nbytes; /* Number of bytes read */ 
int tries; /* Number of tries so far */ 

for (tries = 0; tries < 1; tries ++) 
{ 
/* send an AT command*/ 
if (write(fd, "AT+CMGL=\"ALL\"\r", strlen("AT+CMGL=\"ALL\"\r")) < 3){ 
printf("command sent\n"); 
continue; 
} 

/* read characters into our string buffer*/ 
bufptr = buffer; 

nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1); 
printf("%s\n",bufptr); 

char *p; 

p = strstr(buffer, "tin"); 
printf("%s",p); 

p = strstr(buffer, "server"); 
if(p == NULL) printf("not from server\n"); 

*bufptr = '\0'; 

} 
return 0; 
} 

答えて

0

まず、戻り値readを確認する必要があります。基本的にreadは、あなたの望むものをあなたに与えることは決して保証されません。あなたのタイムアウトやシグナルによって中断されたために何も読まなくても早く復帰するかもしれません(ただし、シグナルハンドラがないので問題はありません)。あなたはあなたがあなたが探しているすべてのデータを読んだことを決定するまで、戻り値を使用してバッファポインタを進め、もっと読む必要があります。

これ以外にも、SMSの固定テキストを見て、送信者のIDを確認するだけでは不十分です。 http://wiki.gnokii.org/index.php/Huawei

私はどちらかと行くだろう - あなたはそれが本当にあなたがそれを送ったと思うサーバーから来た知っておく必要がある場合、私は

0

Appearently Gnokiiプロジェクトは、Huawei社のデバイスをサポートしています...公開鍵暗号とSMSを署名しますgnokiiは、それはこの単純です:

$ gnokii --getsms 

または少なくともgnokii源に見て、問題はあなたが確かに、同期のようなルックスを記述したり待っ-ため、出力の問題を、彼らはほぼ確実すでに素晴らしく、テストを持っているので、それのための解決策。

関連する問題