Browse Source

Abfragen via SIM Klasse bereinigt
Config Objekt erstellt
Unicode Umstellung auf allen

Chris Hoelzel 3 years ago
parent
commit
b5b32e511f
4 changed files with 87 additions and 35 deletions
  1. 70 31
      SIM.py
  2. 1 0
      config.json
  3. 15 4
      main.py
  4. 1 0
      tcall.py

+ 70 - 31
SIM.py

@@ -1,9 +1,14 @@
+# -*- coding: utf-8 -*-
 # Diese Klasse ist für normales Python mit pySerial
 # Diese Klasse ist für normales Python mit pySerial
 # Sie stellt ein Interface für SIM800 Befehlssätze dar
 # Sie stellt ein Interface für SIM800 Befehlssätze dar
 
 
 # 2022-03-02 - devnull - initial
 # 2022-03-02 - devnull - initial
 # 2022-03-06 - devnull - Schritt 1 : Anpassung für ESP ohne Auslesefunktionalitäten
 # 2022-03-06 - devnull - Schritt 1 : Anpassung für ESP ohne Auslesefunktionalitäten
 # 2022-03-29 - devnull - Schritt 2 : Branch für den TTGO T-Call
 # 2022-03-29 - devnull - Schritt 2 : Branch für den TTGO T-Call
+#                                  : Entfernung von ESP Code
+# 2022-04-02 - devnull -           : Operator und RSSI implementiert
+#                                  : CleanOutput mit Byte decoding versehen
+#                                  : Debug Funktion eingebaut
 
 
 import sys, os
 import sys, os
 from machine import UART
 from machine import UART
@@ -11,6 +16,7 @@ from machine import Timer
 
 
 class SIM:
 class SIM:
 
 
+    debugvalue = 0
     ser = None
     ser = None
     pintx = None
     pintx = None
     pinrx = None
     pinrx = None
@@ -28,7 +34,9 @@ class SIM:
 
 
 
 
     # wenn keine PIN übergeben, dann brechen wir ab
     # wenn keine PIN übergeben, dann brechen wir ab
-    def __init__(self, baud = 115200, pintx = None, pinrx = None, simpin = None):
+    def __init__(self, baud = 115200, pintx = None, pinrx = None, simpin = None, debug=0):
+
+        self.setDebug(debug)
 
 
         # wir brauchen hier noch etwas um zu prüfen und abzubrechen, wenn PIN und TTY nicht gesetzt sind
         # wir brauchen hier noch etwas um zu prüfen und abzubrechen, wenn PIN und TTY nicht gesetzt sind
         if (pintx is None or pinrx is None):
         if (pintx is None or pinrx is None):
@@ -38,64 +46,83 @@ class SIM:
             self.setBaud(baud)
             self.setBaud(baud)
             self.setPIN(pintx,pinrx)
             self.setPIN(pintx,pinrx)
 
 
+        # todo: kann nicht gehen, wo war denn jemals die PIN Zuweisung ? -> genau eins drüber
+        # todo: hier muss eine Prüfung rein, ob das Modem überhaupt erriechbar ist.
         self.sio = UART(1, baudrate=self.getBaud(), rx=self.getPINRX(), tx=self.getPINTX()) # ESP
         self.sio = UART(1, baudrate=self.getBaud(), rx=self.getPINRX(), tx=self.getPINTX()) # ESP
         self.devSetup()
         self.devSetup()
 
 
-
         # sammle Modem Informationen
         # sammle Modem Informationen
-        # wir brauchen hier einen Timer, der dann in regelmaessigen Abstaenden die Modeminfos holt
-        #self.getDevInfo()
-        #self.getDevProd()
-        #self.getDevRev()
-        #self.getDevSN()
-        #self.devTemp()
 
 
         # wir führen hier erstmal einen first Runtimecheck aus, damit anschließend der PIN erfolgreich geschickt werden kann
         # wir führen hier erstmal einen first Runtimecheck aus, damit anschließend der PIN erfolgreich geschickt werden kann
         self.devRuntime()
         self.devRuntime()
-
-        # todo: Status Updatetimer prüfen
-        self.SIMtim.init(period=1000, callback=self.devRuntime)
+        self.SIMtim.init(period=3000, callback=self.devRuntime)
 
 
         # PIN Übergabe
         # PIN Übergabe
-        # todo: angepasst-testen, Umstellung auf die korrekte PIN Funktion
-        #self.sendESPPIN(pin)
         self.sendPIN(simpin)
         self.sendPIN(simpin)
 
 
 
 
     #übermittelt ein AT Command, aber bitte nur eine Zeile als Rückgabewert
     #übermittelt ein AT Command, aber bitte nur eine Zeile als Rückgabewert
+    # todo: Hier scheint es ein Problem mit dem Puffer zu geben. Es sieht so aus, als ob mehrere Anfragen gleichzeitig verschickt werden und die Antwort nicht ausgewertet weden kann, da bereits ausgelesen. Das muss serialisiert werden
     def sendAT(self,AT):
     def sendAT(self,AT):
         self.sio.write(AT + '\n')
         self.sio.write(AT + '\n')
         #PC: self.sio.flush() # it is buffering. required to get the data out *now*
         #PC: self.sio.flush() # it is buffering. required to get the data out *now*
         #PC: return self.cleanOutput(self.sio.readlines())
         #PC: return self.cleanOutput(self.sio.readlines())
 
 
-        #os.dupterm(None,1)
-        return self.cleanOutput(self.sio.read(self.sio.any()))
+        #intermediate debug
+        ATout=self.sio.read(self.sio.any())
+        self.debug("AT Result: \n" + str(ATout))
+
+        #ATline = self.sio.readline()
+        #while ATline:
+        #    ATline = ATline + self.sio.readline()
 
 
+        #print("Debug: AT Result: " + str(ATline))
+
+        #return self.cleanOutput(ATline)
+        return self.cleanOutput(ATout)
 
 
     # Antwort DICT bereinigen
     # Antwort DICT bereinigen
+    #  Anpassung für Micrpython: str.remove() gibt es da nicht, wurde durch replace ersetzt
     def cleanOutput(self,outputin):
     def cleanOutput(self,outputin):
 
 
-        output=str(outputin)
+        output=str(outputin.decode("utf-8"))
+
         # erstmal suchen wir nach einem OK in der Ausgabe
         # erstmal suchen wir nach einem OK in der Ausgabe
         if not 'Error' in output:
         if not 'Error' in output:
 
 
             # wir entfernen alle OKs
             # wir entfernen alle OKs
-            while 'OK\n' in output:
-                output.remove('OK\n')
+            #while 'OK\n' in output:
+            #    output.replace('OK\n','')
 
 
             # wir entfernen alle \n
             # wir entfernen alle \n
-            while '\n' in output:
-                output.remove('\n')
+            #while '\n' in output:
+            #    output.replace('\n','')
+
+            output = output.replace('OK','').replace('\n','').replace('\r','')
+
+            # wir brauchen hier noch einen Output
+            self.debug("cleanOutput Ausgabe: \n" + output)
 
 
         else:
         else:
             return 'ERROR'
             return 'ERROR'
 
 
         if len(output) > 0:
         if len(output) > 0:
-            return output[0].replace('\n','')
+            return output
         else:
         else:
             return ' '
             return ' '
 
 
 
 
+    # Debugging Funktionen
+    def setDebug(self,debugIn=0):
+        self.debugvalue = debugIn
+
+    def getDebug(self):
+        return self.debugvalue
+
+    def debug(self,msg):
+        if self.getDebug() == 1:
+            sys.stderr.write("DEBUG: " + msg + "\n")
+
     # Modem TX/RX PIN setter/getter
     # Modem TX/RX PIN setter/getter
     def setPIN(self,pintx,pinrx):
     def setPIN(self,pintx,pinrx):
         self.pintx = pintx
         self.pintx = pintx
@@ -123,6 +150,7 @@ class SIM:
 
 
     # Konfigurationsoptionen für das Modem
     # Konfigurationsoptionen für das Modem
     def devSetup(self):
     def devSetup(self):
+        print("Modem Setup")
         self.sendAT('ATE0')
         self.sendAT('ATE0')
         self.sendAT('AT+CRSL=100')
         self.sendAT('AT+CRSL=100')
         self.sendAT('AT+CSCS="GSM"')
         self.sendAT('AT+CSCS="GSM"')
@@ -131,6 +159,7 @@ class SIM:
     # Temperaturchecks
     # Temperaturchecks
     # todo: liefert leider keine Temperaturwerte zurück
     # todo: liefert leider keine Temperaturwerte zurück
     def getDevTemp(self):
     def getDevTemp(self):
+        self.debug(self.sendAT('AT+CMTE?'))
         self.devTemp = self.sendAT('AT+CMTE?').partition(",")[2]
         self.devTemp = self.sendAT('AT+CMTE?').partition(",")[2]
 
 
 
 
@@ -139,11 +168,14 @@ class SIM:
         self.devInfo = self.sendAT('ATI')
         self.devInfo = self.sendAT('ATI')
 
 
     # PIN State
     # PIN State
+    # AT Commando der PIN Abfrage
     def getDevSIMPINstate(self):
     def getDevSIMPINstate(self):
         if 'ready' in self.sendAT('AT+CPIN?'):
         if 'ready' in self.sendAT('AT+CPIN?'):
-            self.simpinentered=True
+            self.setSIMPINentered(True)
+            return True
         else:
         else:
-            self.simpinentered=False
+            self.setSIMPINentered(False)
+            return False
 
 
     # Laufzeitinformationen vom Modem abfragen
     # Laufzeitinformationen vom Modem abfragen
     def devRuntime(self,timer=None):
     def devRuntime(self,timer=None):
@@ -159,8 +191,8 @@ class SIM:
         self.getDevSIMPINstate()
         self.getDevSIMPINstate()
         print("SIM PIN state: " + str(self.getSIMPINentered()))
         print("SIM PIN state: " + str(self.getSIMPINentered()))
 
 
-        #todo: regelmäßige Abfrage auch von RSSI
-        # todo: regelmäßige Abfrage auch ISP
+        self.getDevOperator()
+        self.getDevRSSI()
 
 
     def getDevProd(self):
     def getDevProd(self):
         self.devProd = self.sendAT('AT+GMM')
         self.devProd = self.sendAT('AT+GMM')
@@ -172,19 +204,26 @@ class SIM:
         self.devRev = self.sendAT('AT+GMR')
         self.devRev = self.sendAT('AT+GMR')
 
 
     # todo: Netzqualitätsanzeige (RSSI)
     # todo: Netzqualitätsanzeige (RSSI)
+    def getDevRSSI(self):
+        #debugausgabe zum herausfinden der Ausgabe
+        self.debug("RSSI: " + self.sendAT("AT+CSQ"))
+
     # todo: Netzprovider Anzeige
     # todo: Netzprovider Anzeige
+    def getDevOperator(self):
+        #debugausgabe
+        self.debug("Operator: " + self.sendAT("AT+COPS"))
 
 
     # setzt den PIN auf dem Modem
     # setzt den PIN auf dem Modem
-    def sendPIN(self,pin):
-        if not self.getSIMPINentered() and pin is not None:
+    def sendPIN(self,pin=None):
+        if not self.getSIMPINentered() and pin is not None and not self.getDevSIMPINstate():
             # PIN fehlt, hier noch eintragen
             # PIN fehlt, hier noch eintragen
             self.sendAT('AT+CPIN=' + str(pin))
             self.sendAT('AT+CPIN=' + str(pin))
             self.setSIMPINentered(True)
             self.setSIMPINentered(True)
 
 
-    # temporaer: ESP setzt den PIN auf dem Modem
-    def sendESPPIN(self,pin):
-        self.sendAT('AT+CPIN=' + str(pin))
-        self.setSIMPINentered(True)
+        if not self.getSIMPINentered() and self.simpin is not None and not self.getDevSIMPINstate():
+            # PIN fehlt, hier noch eintragen
+            self.sendAT('AT+CPIN=' + str(pin))
+            self.setSIMPINentered(True)
 
 
 
 
     def sendSMS(self,number,text):
     def sendSMS(self,number,text):

+ 1 - 0
config.json

@@ -1,4 +1,5 @@
 {
 {
+    "debug" : 1,
     "alarm" : {
     "alarm" : {
         "pin1" : 34
         "pin1" : 34
     },
     },

+ 15 - 4
main.py

@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 # Alarmgeber MainCode
 # Alarmgeber MainCode
 
 
 # 2022-03-06 - devnull - initial
 # 2022-03-06 - devnull - initial
@@ -11,8 +12,7 @@ import sys
 
 
 # Unsere Klassen für die Steuerung des Boards und des Modems
 # Unsere Klassen für die Steuerung des Boards und des Modems
 from tcall import *
 from tcall import *
-#todo: SIM Modul importieren
-#from SIM import *
+from SIM import *
 
 
 # als erstes nach dem starten lesen wir die die config
 # als erstes nach dem starten lesen wir die die config
 with open('config.json','r') as cf:
 with open('config.json','r') as cf:
@@ -24,11 +24,22 @@ with open('config.json','r') as cf:
 
 
 
 
 # tcall Objekt initialisieren und Maschinen LED einschalten
 # tcall Objekt initialisieren und Maschinen LED einschalten
-tcall = tcall(config['tcall']['MDM_PWR_PIN'],config['tcall']['MDM_PWRKEY_PIN'],config['tcall']['MDM_RST_PIN'],config['tcall']['MLED_PIN'])
+tcall = tcall(config['tcall']['MDM_PWR_PIN'],
+              config['tcall']['MDM_PWRKEY_PIN'],
+              config['tcall']['MDM_RST_PIN'],
+              config['tcall']['MLED_PIN'])
+
 tcall.mledblink(2000)
 tcall.mledblink(2000)
 
 
+# Modem einschalten
+tcall.mdmpwrsw()
+
 # todo: SIM Objekt anlegen und starten
 # todo: SIM Objekt anlegen und starten
-sim = SIM(baud = 115200, pintx = config['SIM']['MDM_TX_PIN'], pinrx = config['SIM']['MDM_RX_PIN'], simpin = config['SIM']['SIMPIN'])
+sim = SIM(baud = 115200,
+          pintx = config['SIM']['MDM_TX_PIN'],
+          pinrx = config['SIM']['MDM_RX_PIN'],
+          simpin = config['SIM']['SIMPIN'],
+          debug = config['debug'])
 
 
 # todo: Abfrage Callback erstellen
 # todo: Abfrage Callback erstellen
 # INPUT Callback Funktion
 # INPUT Callback Funktion

+ 1 - 0
tcall.py

@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 # Python TTGO T-Call Klasse
 # Python TTGO T-Call Klasse
 
 
 # 2022-03-16 - cho - erste Version erstellt
 # 2022-03-16 - cho - erste Version erstellt