AT Kommandos für USB Modems

Ein Script, das ich für ein HUAWEI E1552 geschrieben habe:

#! /bin/bash

function getresponse {
echo -e "$1\r" > /dev/ttyUSB2 ;
sed -e '/^OK\r/q' -e '/^ERROR\r/q' /dev/ttyUSB2 | \
sed -e 's/\r/\n/g' | \
sed -e '/^OK$/d' -e '/^\s*$/d' | \
tail -n+2
}

if [ "$#" = 1 ]; then
getresponse "$1"
exit 0
fi

echo -n "AT+CGMI Manufacturer: "
getresponse "AT+CGMI"
echo -n "AT+CGMM Modell: "
getresponse "AT+CGMM"
echo -n "AT+CGMR Revision: "
getresponse "AT+CGMR"
echo -n "AT+CGSN Serial/IMEI: "
getresponse "AT+CGSN"
echo -n "AT+CIMI IMSI: "
getresponse "AT+CIMI"
echo -n "AT+CNUM Number: "
getresponse "AT+CNUM"
echo -n "AT+COPS? Carrier: "
getresponse "AT+COPS?"
echo -n "AT+COPS=? Carriers: "
getresponse "AT+COPS=?"

echo -n "AT+CSQ Signal: "
ret=$(getresponse "AT+CSQ")
signalcode=$(echo $ret | cut -d" " -f2 | cut -d"," -f1)
signal=$(( $signalcode*2 -113 ))
echo $ret = $signal dBm

# and more ...

Ausgabe ohne Parameter

~# ./modem.sh
AT+CGMI Manufacturer: huawei
AT+CGMM Modell: E1552
AT+CGMR Revision: 11.608.12.00.00
AT+CGSN Serial/IMEI: 3XXXXXXXXXXXXX7
AT+CIMI IMSI: 2XXXXXXXXXXXXX6
AT+CNUM Number: +CNUM: "Leitung 1","+43681XXXXXXXX",145
AT+COPS? Carrier: +COPS: 0,0,"A1",2
AT+COPS=? Carriers: ERROR
AT+CSQ Signal: +CSQ: 11,99 = -91 dBm

oder mit Parameter

~# ./modem.sh AT+COPS?
+COPS: 0,0,"A1",2

Zur Erklärung:

  1. Mit echo "AT+CGMI^M" > /dev/ttyUSBX" schickt man normalerweise ein AT Kommando an ein Modem. "^M" ist dabei "Strg+V Strg+M". Das ist aber nichts anders als ein "\r" also ein Carriage Return. Damit man das in einem Script angeben kann muss man echo -e "AT+CGMI\r" verwenden.
  2. Da echo nur schickt, wir aber die Antwort empfangen wollen, verwendet man normalerweise cat oder ähnliches am Device des Modems. In meinem Fall kam da laufend irgendetwas an - und dazwischen meine Commands und die Antwort darauf. Das musste gefiltert werden. Jede Antwort des Modems endet immer mit "OK" order "ERROR". Daher verwende ich sed, um auf dem Stream zu lauschen, bis eine dieser Zeilen kommt. Achtung, auch die Antworten des Modems sind mit \r terminiert und nicht mit \n. Daher funktionieren normale "zeilenweise" Operationen nicht.
  3. Das erledigt der zweite sed Befehl - ersezte \r durch \n
  4. Lösche das "OK" als positive Bestätigung und ebenso alle möglichen Leerzeilen
  5. Mit tail löschen wir jetzt noch die erste Zeile - das nämlich unsere Anfrage an das Modem, und wir wollen nur die Antwort.

AT-Commandos: