2012-06-12 4 views
3

감시 시스템에서 SMS 메시지를 보내는 데 사용되는 스크립트에 오류 검색을 추가하려고합니다. 대부분의 경우 매력처럼 작동하지만 일부 드문 경우 메시지 전송을 중단하고 이유를 알 수 없습니다.3G 모뎀에서 오류 감지

우리는 오류를 재현하지 못했기 때문에 비슷한 문제가있는 사람이 있는지 궁금합니다. 아래는 메시지를 보내는 코드이며 아래에는 오류를 잡을 수있는 아이디어가 있습니다.

sub sendsms { 
    my ($number,$msg) = @_; 
    my $store = undef; 
    my $status = undef; 
    $msg =~ tr/\\[\]_'^~\{\}\|/\/\(\)\-"??\(\)!/; # \ -> /, [ -> (, ] ->), ...., strippa út [ ] _ '^~ { } | \ 
    $msg =~ tr/\xe1\xe9\xed\xf3\xfa\xfd\xf0\xfe\xe6\xf6\xc1\xc9\xcd\xd3\xda\xdd\xd0\xde\xc6\xd6/aeiouydtaoAEIOUYDTAO/; 
    for (my $i = 0; $i < length($msg); $i++) { 
    substr($msg,$i,1) = '_' if (ord(substr($msg,$i,1)) < 0x20 || ord(substr($msg,$i,1)) > 0x7f); 
    } 
    my $s = substr($msg,0,$maxlen); 
    RETRY: for (my $t = 0; $t < 5; $t++) { 
    eval { 
     put('AT+CMGD='.($next_store+1), 'OK'); 
     put('AT+CSCA="'.$sca.'",145', 'OK'); 
     put('AT+CMGF=1', 'OK'); 
     put('AT+CMGW="'.$number.'",145', '>'); 
     put($s, '>'); 
     my $a = put("\x{1a}", undef); 
     print "a = '$a'\n" if ($verbose); 
     if ($a =~ /\+CMGW: ([0-9]*)/) { 
     $store = $1; 
     last RETRY; 
     } 
    }; 
    if ([email protected]) { 
     print "ERROR: attempt $t: [email protected]\n"; 
    } 
    sleep 2*($t+1); 
    } 
    if (defined $store) { 
    print "Message store $store\n" if ($verbose); 
    put('AT+CMSS='.$store.',"'.$number.'",145',undef); 
    $next_store = (($store - 1) + 1) % $stores; 
    } 
    else { 
    die "Message not stored"; 
    } 
} 

올리기 기능 :

sub put { 
    my ($cmd,$expect) = @_; 
    print "Sending command '$cmd' expecting '$expect'\n" if ($verbose); 
    $modem->atsend($cmd."\r\n") || die "FAILED send\n"; 
    my $a = $modem->answer(); 
    die "Failed '$cmd' expected '$expect' got '$a'\n" if (defined $expect && !($a =~ /$expect/)); 
    return $a; 
} 

내가이 시간의 99 %를 작동 앞서 말했듯이 여기

메시지를 전송하는 코드입니다. 이 오류는 메시지가 상점에 작성되었지만 보내진 적이없는 것으로 보입니다.

내 아이디어 :

eval {'$status = AT+CPAS'}; 
if (defined $status and ($status == '+CPAS: 1' or $status == '+CPAS: 2')){ 
    print "Modem returned an error status: ".$status; 
    flush_stores(); 
    sendsms('+xxxxxxxxxx', 'There is an error in the 3G modem'); 
} 

을 세척 기능 :

sub flush_stores { 
    for (my $i = 0; $i < $stores; $i++) { 
     put('AT+CMGD='.($i+1), 'OK'); 
    } 
} 

윌이 작품?

그렇지 않은 경우 어떻게됩니까?

지 슬리

+0

@daxim 감사, 나는 sendsms 기능 아래를 추가, 풋 기능을 잊었다 – Gisli

답변

0

이것은 하드웨어 문제인 것 같습니다. 우리는 3G 모뎀과 SIM 카드를 교체했으며 지금은 원활하게 작동합니다. 이러한 종류의 오류를 감지 할 수있는 방법이 있는지 알아 보는 것은 흥미로울 것입니다.