Armadilloフォーラム

expectを介したATコマンドの自動化

user_2018-02-14

2018年10月15日 16時35分

Armadillo G3においてATコマンドでの下記のようにモデムと対話することができると思います。

root@armadillo:/# cu -l /dev/ttyACM3 -s 115200
Connected.
ATI1
Cinterion
PDS6-J
REVISION 03.001
A-REVISION 00.000.35
 
OK
~.
 
Disconnected.

上記をexpectで自動化するため、下記のようなスクリプト(test.sh)を作成しました。

#!/bin/bash
# test.sh
 
DEVICE_FILE="$1"
 
expect -c "
set timeout "30"
spawn env LANG=C cu -l "${DEVICE_FILE}" -s 115200
expect \\"Connected.\\"
send \\"ATI1\n\\"
expect \\"OK\\"
send \\"~.\n\\"
exit 0
"

ところが、実行したところ、ATコマンドを送信したところで、下記のように処理がストップしてしまいます。

bash ./test.sh /dev/ttyACM3
spawn env LANG=C cu -l /dev/ttyACM3 -s 115200
Connected.
ATI1

同じスクリプトでArmadillo-G3Lでは動作したのですが、何故かArmadillo-G3だと動作しない状態です。

原因について、ご存の方がいらっしゃましたら、ご助言をお願い申し上げます。

コメント

y.nakamura

2018年10月15日 22時22分

中村です。

> 同じスクリプトでArmadillo-G3Lでは動作したのですが、何故かArmadillo-G3だと動作しない状態です。
>
> 原因について、ご存の方がいらっしゃましたら、ご助言をお願い申し上げます。

原因ではないですが、
シェルスクリプトからexpectでspawnで外部コマンドを使って
送受信をするときの書き方についてです。

expectの書き方は人によっていろいろあるようですけど、
私はヒアドキュメントを使ってます。
scpやsftpなどが主ですが、昔Armadillo-420用に書いた
スクリプトがG3Lでも修正なしでそのまま動いています。

以下、参考になれば幸いです。

>

> #!/bin/bash
> # test.sh
> 
> DEVICE_FILE="$1"
> 
> expect -c "
> set timeout "30"
> spawn env LANG=C cu -l "${DEVICE_FILE}" -s 115200
> expect \\"Connected.\\"
> send \\"ATI1\n\\"
> expect \\"OK\\"
> send \\"~.\n\\"
> exit 0
> "
> 

これを私が普段使っているやり方でヒアドキュメントで書くと、
次のようになります。
(試してませんので、これで動くかどうかはわかりません)

#!/bin/sh
 
DEVICE_FILE=$1
 
expect - <<EOF
  set timeout 30
  spawn cu -l $DEVICE_FILE -s 115200
  expect {
    eof          { exit [lindex [wait] 3] }
    timeout      { exit 255 }
    "Connected." { send "ATI1\n" }
  }
  expect {
    eof          { exit [lindex [wait] 3] }
    timeout      { exit 255 }
    "OK"         { send "~.\n" }
  }
EOF
 
exit $?

// expectでcuを使ったことはないので、
// eofのところがこれでいいのかはわかりません。

--
なかむら

y.nakamura

2018年10月16日 8時01分

中村です。

試してみました。

G3Lでは投稿にあったtest.shそのままで動きました。
test.shをそのままで、G3では同様に動かないです。
私が書いたスクリプトも症状は同じでした。
質問にあったように

Connected.
ATI1

で止まってしまいます。

症状から察するに改行コードかな?と思い、
"\n"を"\r"に変更したところ、
書いてあったtest.shも、私のも動くようになりました。

G3とG3Lとで、モデムの改行コードが違うようです。

--
なかむら

user_2018-02-14

2018年10月16日 9時54分

中村様

ありがとうございます。
改行コードとは盲点でした。

ご指摘の通り、改行コードを変更したら、正常に動作しました。