3

監視システムからSMSメッセージを送信するために使用されるスクリプトにエラー検出を追加しようとしています。ほとんどの場合、それは魅力のように機能しますが、まれにメッセージの送信を停止し、理由がわかりません。

エラーを再現できなかったので、誰かが同様の問題を抱えているのではないかと思います。以下はメッセージを送信するコードであり、その下に私が持っていたアイデアがエラーをキャッチできる可能性があります。

メッセージを送信するコードは次のとおりです。

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 ($@) {
      print "ERROR: attempt $t: $@\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";
  }
}

put関数:

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');
   }
}

これは機能しますか?

そうでない場合はどうなりますか?

ギスリ

4

1 に答える 1

0

これはハードウェアの問題のようです。3GモデムとSIMカードを交換しましたが、今のところすべてスムーズに機能しています。この種の障害を検出する方法があるかどうかを知ることは興味深いでしょう。

于 2012-06-18T09:55:36.540 に答える