AT-Befehle automatisieren und Rückmeldung speichern

  • Hallo :)

    Ich bin noch recht neu dabei mit meinem Raspi 3 B+ und bin gerade ziemlich am verzweifeln, weil ich das Programm atinout einfach nicht installiert bekomme... Leider ist dieses Programm jedoch gar nicht für dne Raspi vorgesehen, weshalb ich nun eine andere Lösung benötige.

    Ich baue gerade einen GPS-Tracker. Das SIM808 ist seriell mit dem Raspberry 3b+ verbunden und es wird über AT-commands kommuniziert. Diese Befehle funktionieren soweit auch alle, so dass ich den Standort anfragen kann, SMS verschicken usw. Jedoch möchte ich die Standortabfrage automatisieren. Hierzu müsste ich automatisiert die entsprechenden Befehle senden und vor allem die Rückmeldung in einer variable oder einer Datei speichern.

    Die grundlegenden Befehle für die Standortabfrage sind folgende:

    AT Rückmeldung: "OK"

    AT+CGPS=? Rückmeldung: "OK"

    AT+CGPS=1 Rückmeldung: "OK"

    AT+CGPSINFO Rückmeldung: "$GPRMY, 194301.000,A,4854.4899,N,00910.6255,E,0.00,318$$GPRMZ, 194301.000,A,4854.4899,N,00910.6255,E,0.00,318$

    $GPRMY, 194301.000,A,4854.4899,N,00910.6255,E,0.00,318$$GPRMZ, 194301.000,A,4854.4899,N,00910.6255,E,0.00,318"


    Hast du eine Idee, wie ich diese Befehle automatisiert ausführen und die Rückmeldung speichern kann?

    Tausend Dank für jede Idee!

    Jan :)

  • AT-Befehle automatisieren und Rückmeldung speichern? Schau mal ob du hier fündig wirst!

  • Hey

    Als erstes brauchen wir mal ein Log was der Befehl alles zurueckgibt.

    Dann muessten wir wissen was mit der Antwort passieren soll.

    Und die Sprache fuer das Script oder Programm ist auch nicht unerheblich.

    Entschuldige, das war dämlich von mir...

    - Die Sprache des Programms ist zweitrangig, wobei Python oder direkt in der shell aus meiner Sicht das geschickteste wäre.

    - Die Antwort hätte ich gerne in einer Variable oder auch gerne in einer Textdatei gespeichert, so das ich sie anschließend weiter verarbeiten kann.

    Hier die Rückmeldungen der Befehle!

    Linux raspberrypi 5.4.51-v7+ #1333 SMP Mon Aug 10 16:45:19 BST 2020 armv7l

    The programs included with the Debian GNU/Linux system are free software;

    the exact distribution terms for each program are described in the

    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent

    permitted by applicable law.

    Last login: Sat Oct 17 22:31:37 2020 from 127.0.0.1

    pi@raspberrypi:~ $ picocom -b 9600 /dev/ttyS0

    picocom v3.1

    port is : /dev/ttyS0

    flowcontrol : none

    baudrate is : 9600

    parity is : none

    databits are : 8

    stopbits are : 1

    escape is : C-a

    local echo is : no

    noinit is : no

    noreset is : no

    hangup is : no

    nolock is : no

    send_cmd is : sz -vv

    receive_cmd is : rz -vv -E

    imap is :

    omap is :

    emap is : crcrlf,delbs,

    logfile is : none

    initstring : none

    exit_after is : not set

    exit is : no

    Type [C-a] [C-h] to see available commands

    Terminal ready

    AT

    OK

    AT+CGPSPWR=1

    OK

    AT+CGPSINF=0

    +CGPSINF: 0,4811.193300,910.111300,281.900000,20201017204252.000,0,9,0.129640,137.600006

    OK


    Besten Dank für deine Hilfe :)

  • Python Kann das Modul pyserial benutzen. Sollte per Paketverwaltung oder zur Not pip installierbar sein. Und damit kannst du deine Befehle absetzen. Und die Resultate einlesen & weiter verarbeiten.

  • Python Kann das Modul pyserial benutzen. Sollte per Paketverwaltung oder zur Not pip installierbar sein. Und damit kannst du deine Befehle absetzen. Und die Resultate einlesen & weiter verarbeiten.

    oder er bastelt einfach n bashscript unt tut echo n

    nach /dev/ttyUSBx oder wie die bei ihm heissen ( wieso /dev/ttyS0 ? hm)

    echo "AT+CSQ" > /dev/ttyUSB2 ;head /dev/ttyUSB2 | grep CSQ:

    oder

    echo -e 'AT+CPIN=xxxx' > /dev/ttyUSB0 ;head /dev/ttyUSB1 | grep blabla

    und dann mit do while if else oder so

    Aber mit Python is wohl besser hast recht da gibts fertigen kram

    :)

  • Die Suchfunktion hier ist absolut unbrauchbar. Eine aehnliche Frage wurde erst kuerzlich gestellt :(

    Mein Modul kann kein GPS, die Commands muessen also angepasst werden.

  • Danke für die ganzen Ideen!

    Mit Python habe ich es bereit probiert, jedoch bekomme ich folgende Fehlermeldung:

    pi@raspberrypi:/var/www/Tests/pyserial $ python pyserial.py

    Traceback (most recent call last):

    File "pyserial.py", line 4, in <module>

    ser = serial.Serial()

    AttributeError: 'module' object has no attribute 'Serial'


    Ich habe pyserial und serial installiert, daran kann es nicht liegen.

    Mein Script sieht so aus:

    #!/usr/bin/python

    import serial, time

    ser = serial.Serial()

    ser.port = "/dev/ttyS0"

    ser.baudrate = 9600

    ser.bytesize = ser.EIGHTBITS #number of bits per bytes

    ser.parity = serial.PARITY_NONE #set parity check: no parity

    ser.stopbits = serial.STOPBITS_ONE #number of stop bits

    ser.timeout = 1 #non-block read

    ser.xonxoff = False #disable software flow control

    ser.rtscts = False #disable hardware (RTS/CTS) flow control

    ser.dsrdtr = False #disable hardware (DSR/DTR) flow control

    ser.writeTimeout = 2 #timeout for write



    try:

    ser.open()

    except Exception as e:

    print ("error open serial port: " + str(e))

    exit()



    if ser.isOpen():

    try:

    ser.flushInput() #flush input buffer, discarding all its contents

    ser.flushOutput() #flush output buffer, aborting current output and discard all that is in buffer



    #write data

    ser.write("AT+CSQ")

    print("write data: AT+CSQ")

    time.sleep(1)

    numOfLines = 0

    while True:

    response = ser.readline()

    print("read data: " + response)



    numOfLines = numOfLines + 1

    if (numOfLines >= 5):

    break



    ser.close()

    except Exception as e1:

    print ("error communicating...: " + str(e1))

    else:

    print ("cannot open serial port ")


    Habt ihr mir Tipps, woran es sonst liegen könnte?

    Ich werde mich die Tage mal an das Bash-script machen, das wird aber vermutlich noch ein wenig dauern.

    Vielen Dank euch schonmal :))

    Jan

  • Du Hast dein Skript serial genannt, und dadurch verschattet das das Modul. Benenn das um, und lösch ggf rumliegende .pyc Dateien.

  • Du Hast dein Skript serial genannt, und dadurch verschattet das das Modul. Benenn das um, und lösch ggf rumliegende .pyc Dateien.

    Ich habe die Datei umbenannt und die besagten Dateien gelöscht. Ich erhalte jedoch noch die gleiche Fehlermeldung :(


    pi@raspberrypi:/var/www/Tests/pyserial $ python atAutomatisierung.py

    Traceback (most recent call last):

    File "atAutomatisierung.py", line 4, in <module>

    ser = serial.Serial()

    AttributeError: 'module' object has no attribute 'Serial'

  • Was sagt

    import serial

    print (serial)

    ?

    pi@raspberrypi:/var/www/Tests/pyserial $ python testser.py

    <module 'serial' from '/home/pi/.local/lib/python2.7/site-packages/serial/__init__.pyc'>

    Serial und pyserial ist aber installiert, siehe hier:


    pi@raspberrypi:/var/www/Tests/pyserial $ pip install serial

    Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple

    Requirement already satisfied: serial in /home/pi/.local/lib/python2.7/site-packages (0.0.97)

    Requirement already satisfied: pyyaml>=3.13 in /home/pi/.local/lib/python2.7/site-packages (from serial) (5.3.1)

    Requirement already satisfied: future>=0.17.1 in /home/pi/.local/lib/python2.7/site-packages (from serial) (0.18.2)

    Requirement already satisfied: iso8601>=0.1.12 in /home/pi/.local/lib/python2.7/site-packages (from serial) (0.1.13)

    pi@raspberrypi:/var/www/Tests/pyserial $ pip install pyserial

    Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple

    Requirement already satisfied: pyserial in /usr/lib/python2.7/dist-packages (3.4)


    Wenn ich das Script jedoch mit Python3 starte, bekomme ich folgende Fehlermeldungen:

    pi@raspberrypi:/var/www/Tests/pyserial $ python3 atAutomatisierung.py

    Traceback (most recent call last):

    File "atAutomatisierung.py", line 8, in <module>

    ser.bytesize = ser.EIGHTBITS #number of bits per bytes

    AttributeError: 'Serial' object has no attribute 'EIGHTBITS'

  • Du musst serial.EIGHTBITS schreiben. Mit dem PI hat das nix zu tun, das ist auch auf jedem anderen Rechner der Python ausführt so.

  • Ich habe sonst keinerlei Erfahrung mit Python, aber der Fehler war dumm...! Danke dir =)

    Jedoch kam gleich wieder was neues auf und ich stehe wieder voll auf dem Schlauch. Entschuldige bitte die ganzen doofen Fragen!


    ser.write('AT')

    print("write data: AT")

    Führt zu:

    pi@raspberrypi:/var/www/Tests/pyserial $ python3 atAutomatisierung.py

    error communicating...: unicode strings are not supported, please encode to bytes: 'AT'


    Okay, also habe ich es mit der Funktion bytes() kodiert aber es passt immer noch nicht...


    ser.write(bytes('AT', 'utf-8'))

    print("write data: AT")

    Führt zu:

    pi@raspberrypi:/var/www/Tests/pyserial $ python3 atAutomatisierung.py

    write data: AT

    error communicating...: can only concatenate str (not "bytes") to str

    Vielen Dank!!

  • Serial.write benötigt bytes.

    Code
    ser.write(b'AT')

    Hab mich zwar noch nie mit den AT-Befehlen beschäftigt, aber du wirst ein CRLF mit senden müssen, damit der Befehl abgearbeitet wird.

    CR = Carriage return = Wagenrücklauf (kommt von der Schreibmaschine)

    LF = Linefeed = Zeilenvorschub

    Code
    CRLF = b"\r\n"
    ser.write(b'AT' + CRLF)
  • Bitte immer das volle Skript und die volle Fehlermeldung posten, in den dazugehörigen Code-Tags. Sonst spielt man hier immer 20-Fragen.

  • Ich habe alles nochmal in Ruhe getestet und nun auch zum laufen bekommen. Ich danke euch für eure Hilfe!

    Das fertige Script sieht folgendermaßen aus - eventuell hilft es ja jemandem weiter :)


Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!