Serielles Modem GSM Pegelmessung

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    Ich möchte mit mit dem Raspberry Pi über einen USB to Serial Adapter eine Verbindung zu dem Modem herstellen und den aktuellen GSM/GPRS Emfangspegel abfragen. Der Empfangspegel soll zyklisch (ca. alle 10s.) abgefragt und nach Möglichkeit in einer Datei dokumentiert/gespeichert werden.

    Modem:
    Ich habe ein Siemens MC35i GSM/GPRS Modem inkl. Antenne.
    http://www.telefon.de/mobile-Loesung…RS-Modem_p28864

    Seriell USB Adapter:
    http://www.amazon.de/gp/product/B0007OWNYA/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1&tag=psblog-21 [Anzeige]

    Um an dem Modem die Pegelmessung zu starten muss ich dieses 4 Befehle senden.
    Befehle:
    1. "AT+CPIN=XXXX" (Der Simkarten PIN wird an das Modem übergeben)
    2. "AT+CPIN?" (Die Rückmeldung auf diesen Befehl muss "+CPIN; READY" lauten. Das Modem bestätigt hiermit die richtige PIN eingabe.
    3. "AT+COPS?" (Die Rückmeldung muss für mein T-MobileNetz "+COPS 0,0, T-Mobile D" lauten. Damit bestätigt das Modem die Einbuchung im Netz.
    4. "AT^MONI=10" startet die GSM Pegelabfrage im Abstand von 10 Sekunden. Die Antwort sollte ca. so aussehen:
    43 50 -60 262 01 451F F950 7 6 33 -107 47 I No connection
    43 51 -59 262 01 451F F950 7 6 33 -107 48 I No connection
    ...

    Die Antwort aus Punkt 4 soll irgendwie dokumentiert und gespeichert werden.

    Nun die wichtigste Frage:
    Wie sende ich mit Python die AT Befehle über den USB to Serial Adapter an das Modem und wie wird mir die Antwort angezeigt bzw. wie könnte ich diese in einer Datei dokumentieren?

    Ist dies mit Python überhaupt möglich?

    Vielen Dank schonmal in die Runde.

  • Du könntest die serielle Schnittstelle mit Systembefehlen auf die korrekte Baudrate einstellen und dann im Pythoncode einfach die Schnittstelle als "Datei" öffnen, und darauf lesend/schreibend zugreifen. Evt. gibt es aber noch eine elegantere Lösung, mit Python kenne ich mich nicht wirklich aus.

    btw. ich habe für solche Anwendungsfälle immer die PIN in einem Handy deaktiviert. Damit spart man sich die PIN-Eingabe ;)

    • Offizieller Beitrag

    Wenn es auf der Konsole schonmal klappt, dann machst du das gleiche in python per subprocess modul. Dort kannst du auch alle Ausgaben direkt abfangen.

    hier mal ein Beispiel aus einem anderen Thread

    Code
    import subprocess
    def bluettooth_check(MAC):
        bt = subprocess.Popen(
            ["bluez-test-input","connect",MAC],
            stdout = subprocess.PIPE,
            stderr = subprocess.PIPE
            )
        out, error = bt.communicate()

    anschliessend hast du in out di eantwort das aufgerufenen Programms und in error etwaige Fehlermeldungen.

  • Danke für die schnellen Antworten.

    Allerdings hat mich deine Antwort etwas überfordert.
    Was ich eventuell vergessen habe. Bisher habe ich das Modem nur über Windows mit Hyperterminal angesprochen.
    Für die Verbindung sind folgende Schnittstelleneinstellungen nötig:
    Baudrate 19200
    Databits 8
    Stopbits 1
    Parity none
    Flow Control none

    Über das Terminal des Raspberry habe ich noch keine Verbindung zu stande gebracht.
    Mir fehlt quasi die Info wie ich die AT Befehle gezielt an die Schnittstelle des USB to Serial Adapters sende bzw wie ich diese Schnittstelle mit den entsprechenden Schnittstelleneinstellungen wie oben beschrieben in Python einbinden kann.

    Das würde mich einen großen Schritt weiter bringen.

    Vielen Dank

    Die Idee mit der PIN deaktivierung ist schon mal super :bravo2:

    Einmal editiert, zuletzt von Dinopolis (2. September 2014 um 12:40)

  • Ich nutze ein GSM board via TXD/RXD Pins mit "minicom" (sudo apt-get install minicom)

    via terminal dann minicom starten (in meinem Fall):
    minicom -b 19200 -o -D /dev/ttyAMA0


    bei dir könnte folgendes funktionieren:

    Code
    minicom -b 19200 -o -D /dev/ttyACM0

    kann aber sein dass du bei /dev/ttyxxx was anderes angeben musst.


    Edit:

    Ein Bsp. mit Pyserial:

    Code
    import time
    import serial
    
    
    phone = serial.Serial("/dev/ttyACM0",  19200, timeout=2)
    try:
        time.sleep(0.5)
        phone.write('AT')
    finally:
        phone.close()

    lesen klappt über den

    "readlines()" Befehl (WICHTIG: Timeout beim Herstellen der Verbindung nicht vergessen)

    also z.B. phone.readlines()

    Einmal editiert, zuletzt von Nueffe (2. September 2014 um 19:40)

  • Hier ist mein aktuelle Python Programm:
    #!/usr/bin/env python

    import serial
    import time

    port=serial.Serial("/dev/ttyUSB0", baudrate=19200,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, writeTimeout = 1,
    timeout = 1, rtscts=False, dsrdtr=False, xonxoff=False)

    port.write("AT+CPIN=0000")
    port.write("AT+COPS?")
    port.write("AT^MONI=1")

    while True:
    response = port.readlines()
    print(response)

    Leider führt mein Programm nur zu folgendem Ergebnis:

    pi@raspberrypi ~ $ sudo python Test.py
    ['AT+CPIN=2924AT+COPS?AT^MONI=1']
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    ^CTraceback (most recent call last):
    File "Test.py", line 25, in <module>response = port.readlines()
    File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 442, in read
    ready,_,_ = select.select([self.fd],[],[], self._timeout)
    KeyboardInterrupt

    Anstelle von [] sollte ich eigentlich den aktuellen Empfangspegel als Antwort bekommen. Irgendwie bin ich ratlos warum ich keine Antwort vom GSM Modem bekomme.

  • Vielen Dank,
    das hat mich schon mal einen Schritt weiter gebracht. :thumbs1:
    Die gewünschte Antwort kommt allerdings nur genau 1 mal. Danach erhalte ich wieder nur [].
    Für einen weiteren Tipp wäre ich sehr dankbar.

    Aktuelles Programm:
    #!/usr/bin/env python

    import serial
    import time

    port=serial.Serial("/dev/ttyUSB0", baudrate=19200,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, writeTimeout = 1,
    timeout = 1, rtscts=False, dsrdtr=False, xonxoff=False)

    port.write("AT+CPIN=0000\r")
    port.write("AT+COPS?\r")
    port.write("AT^MONI=1\r")

    while True:
    response = port.readlines()
    print(response)


    Antwort:

    ['AT+CPIN=5197AT+COPS?\rAT^MONI\r\n', 'ERROR\r\n', '=1\r\r\n', 'Serving Cell I Dedicated channel\r\n', '
    chann rs dBm MCC MNC LAC cell NCC BCC PWR RXLev C1 I chann TS timAdv PWR dBm Q ChMod\r\n', ' Searching']
    50 -78 262 01 451F F950 7 6 33 -107 47 I No connection
    []
    []
    []
    []

  • Moin,

    sorry ich habe von python keine Ahnung aber denke Du wertest den response vom GSM Modem nicht aus.
    Nach jedem AT Kommando erfolgt eine Antwort z. B.
    (PIN Abfrage)
    AT+CPIN?
    +CPIN: READY OK = SIM PIN ist schon gesetzt
    Wenn die PIN erst noch eingegeben werden muss, sind einige Sekunden Wartezeit angebracht, da jetzt erst eine Verbindung zum GSM Netzwerk aufgebaut wird.
    Hier könnte man eine Registrierungsabfrage starten
    AT+CREG? > Ausgabe z. B. +CREG: 2,1, 37B0, 51AD OK wenn eingebucht.
    und erst dann die Ausgabe/logging für Signal Strength Indicator.....

    Bye

    Jürgen

    Einmal editiert, zuletzt von rpivpn (11. September 2014 um 19:25)

  • Einfache Loesung: sleep( x ) zwischen die Ausgaben

    Nach dem AT+CPIN muesste x relativ gross sein, z. B. 20 Sekunden.

    Das OK kommt zwar frueher, aber das Modul ist meist noch nicht bereit !

    Und das Timeout der Schnittstelle hochsetzen. So viele Timeouts bringen
    nichts.

    - - -

    Komplexere Loesung: nach rpivpn

    Besser, kann aber recht komplex werden wenn man es wirklich sauber machen will ...

  • Perfekt!!
    Das war die Lösung.
    Zum einen die Wartezeiten nach den Befehlen und zum anderen muss in die while true Schleife ein port.readline() und nicht port.readlines().
    Timeout habe ich auf 10 hochgesetzt funktioniert aber auch einwandfrei mit 1!

    Vielen Dank an alle Helfer :danke_ATDE::danke_ATDE::danke_ATDE::bravo2:


    Anbei noch meine fertige Programmierung:
    #!/usr/bin/env python

    import serial
    import time

    port=serial.Serial("/dev/ttyUSB0", baudrate=19200,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, writeTimeout = 1,
    timeout = 10, rtscts=False, dsrdtr=False, xonxoff=False)

    port.write("AT+CPIN=0000\r")
    time.sleep(10)
    port.write("AT+COPS?\r")
    time.sleep(5)
    port.write("AT^MONI=10\r")

    while True:
    response = port.readline()
    print(response)

Jetzt mitmachen!

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