Reputation: 1239
I would like to send AT
command to my modem by using shell script and parse the result in order to verify if the OK is returned.
at=`echo -ne "AT+CFUN1=1\r\n" > /dev/ttyUSB0 | cat /dev/ttyUSB0`
What is the best way to parse the at1 variable and extract "OK" or "ERROR" otherwise ?
Upvotes: 7
Views: 19802
Reputation: 1539
I was unable to communicate with my Huawei E3372h-158 with @hlovdal's solution, so I rolled my own using expect
and screen
, in this case for reading the temperature sensors via ^CHIPTEMP?
:
output=$(sudo expect <<EOF
set timeout 5
log_user 0 spawn sudo screen /dev/ttyUSB0-
sleep 1
send "AT\x5ECHIPTEMP?\r"
expect "OK"
puts "\n-->\$expect_out(buffer)<--"
# Send C-a \ to end the session
send "\x01"
send "\x5C"
EOF
)
# Strip non-printable control characters
output=$(printf "$output" | tr -dc '[:print:]\n' )
printf "$output\n" | grep -P "^\^CHIPTEMP"
Hints and caveats: Set log_user 1
to get the output of screen
. Not sure screen
works in all cases as it produces some non-printing characters and perhaps repeating output.
Upvotes: 0
Reputation: 28180
It is absolutely possible to send AT commands to a modem and capture its output from the command line like you are trying to do, however not by just using plain bash shell scripting. Which is why I wrote the program atinout specifically to support scenarios like you ask about.
Test like the following:
MODEM_DEVICE=/dev/ttyUSB0
MODEM_OUTPUT=`echo AT | atinout - $MODEM_DEVICE -`
case $MODEM_OUTPUT
in
*OK*)
echo "Hurray, modem is up and running :)"
;;
*)
echo "Oh no! Something is not working :("
;;
esac
If you intend to parse the output in any more sophisticated way you should save the output to a file instead by giving a filename instead of the last -
and read that.
Upvotes: 8