|
|
@@ -1,29 +1,37 @@
|
|
|
-# -*- coding: utf-8 -*-
|
|
|
-# Diese Klasse ist für normales Python mit pySerial
|
|
|
-# Sie stellt ein Interface für SIM800 Befehlssätze dar
|
|
|
+#-*- coding: utf-8 -*-
|
|
|
+# Diese Klasse ist fr normales Python mit pySerial
|
|
|
+# Sie stellt ein Interface fr SIM800 Befehlsstze dar
|
|
|
|
|
|
# 2022-03-02 - devnull - initial
|
|
|
-# 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-06 - devnull - Schritt 1 : Anpassung fr ESP ohne Auslesefunktionalitten
|
|
|
+# 2022-03-29 - devnull - Schritt 2 : Branch fr den TTGO T-Call
|
|
|
# : Entfernung von ESP Code
|
|
|
# 2022-04-02 - devnull - : Operator und RSSI implementiert
|
|
|
# : CleanOutput mit Byte decoding versehen
|
|
|
# : Debug Funktion eingebaut
|
|
|
+# 2022-04-12 - devnull : Wartezeiten beim Absetzen der AT-Kommandos
|
|
|
+# 2022-04-13 - devnull : SIN Inserted Abfrage
|
|
|
+# 2022-04-17 - devnull : Umstellung auf Loggerklasse für Debug und Verbose
|
|
|
+# 2022-04-28 - devnull : AT Kommandos ergänzt, RSSI und OperatorAusgabe gefixt
|
|
|
|
|
|
import sys, os
|
|
|
+import utime
|
|
|
from machine import UART
|
|
|
from machine import Timer
|
|
|
|
|
|
class SIM:
|
|
|
|
|
|
- debugvalue = 0
|
|
|
+ logger = None
|
|
|
ser = None
|
|
|
pintx = None
|
|
|
pinrx = None
|
|
|
simpin = None
|
|
|
- simpinentered = False
|
|
|
+ issimpinentered = False
|
|
|
+ issiminserted = False
|
|
|
baud = None
|
|
|
sio = None
|
|
|
+ devOper = None
|
|
|
+ devRSSI = None
|
|
|
devInfo = None
|
|
|
devTemp = None
|
|
|
devSN = None
|
|
|
@@ -33,12 +41,12 @@ class SIM:
|
|
|
|
|
|
|
|
|
|
|
|
- # wenn keine PIN übergeben, dann brechen wir ab
|
|
|
- def __init__(self, baud = 115200, pintx = None, pinrx = None, simpin = None, debug=0):
|
|
|
+ # wenn keine PIN bergeben, dann brechen wir ab
|
|
|
+ def __init__(self, baud = 115200, pintx = None, pinrx = None, simpin = None, logger = None):
|
|
|
|
|
|
- self.setDebug(debug)
|
|
|
+ self.logger = logger
|
|
|
|
|
|
- # 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 prfen und abzubrechen, wenn PIN und TTY nicht gesetzt sind
|
|
|
if (pintx is None or pinrx is None):
|
|
|
sys.stderr.write('PINTX/PINRX fehlt')
|
|
|
sys.exit(1)
|
|
|
@@ -46,62 +54,46 @@ class SIM:
|
|
|
self.setBaud(baud)
|
|
|
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.
|
|
|
+ # todo: hier muss eine Prfung rein, ob das Modem berhaupt erriechbar ist.
|
|
|
self.sio = UART(1, baudrate=self.getBaud(), rx=self.getPINRX(), tx=self.getPINTX()) # ESP
|
|
|
self.devSetup()
|
|
|
|
|
|
# sammle Modem Informationen
|
|
|
|
|
|
- # wir führen hier erstmal einen first Runtimecheck aus, damit anschließend der PIN erfolgreich geschickt werden kann
|
|
|
+ # wir fhren hier erstmal einen first Runtimecheck aus, damit anschlieend der PIN erfolgreich geschickt werden kann
|
|
|
self.devRuntime()
|
|
|
- self.SIMtim.init(period=3000, callback=self.devRuntime)
|
|
|
+ #self.SIMtim.init(period=10000, callback=self.devRuntime)
|
|
|
|
|
|
- # PIN Übergabe
|
|
|
+ # PIN bergabe
|
|
|
self.sendPIN(simpin)
|
|
|
|
|
|
|
|
|
- #ü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
|
|
|
+ #bermittelt ein AT Command, aber bitte nur eine Zeile als Rckgabewert
|
|
|
def sendAT(self,AT):
|
|
|
self.sio.write(AT + '\n')
|
|
|
- #PC: self.sio.flush() # it is buffering. required to get the data out *now*
|
|
|
- #PC: return self.cleanOutput(self.sio.readlines())
|
|
|
|
|
|
- #intermediate debug
|
|
|
- ATout=self.sio.read(self.sio.any())
|
|
|
- self.debug("AT Result: \n" + str(ATout))
|
|
|
+ utime.sleep_ms(1000)
|
|
|
|
|
|
- #ATline = self.sio.readline()
|
|
|
- #while ATline:
|
|
|
- # ATline = ATline + self.sio.readline()
|
|
|
+ if self.sio.any():
|
|
|
+ ATout=self.sio.read(self.sio.any()).decode("utf-8")
|
|
|
+ self.logger.debug("AT Result: \n" + str(ATout))
|
|
|
|
|
|
- #print("Debug: AT Result: " + str(ATline))
|
|
|
+ else:
|
|
|
+ ATout='ERROR'
|
|
|
|
|
|
- #return self.cleanOutput(ATline)
|
|
|
return self.cleanOutput(ATout)
|
|
|
|
|
|
- # Antwort DICT bereinigen
|
|
|
- # Anpassung für Micrpython: str.remove() gibt es da nicht, wurde durch replace ersetzt
|
|
|
- def cleanOutput(self,outputin):
|
|
|
-
|
|
|
- output=str(outputin.decode("utf-8"))
|
|
|
+ # Anpassung fr Micrpython: str.remove() gibt es da nicht, wurde durch replace ersetzt
|
|
|
+ def cleanOutput(self,output):
|
|
|
|
|
|
# erstmal suchen wir nach einem OK in der Ausgabe
|
|
|
if not 'Error' in output:
|
|
|
|
|
|
- # wir entfernen alle OKs
|
|
|
- #while 'OK\n' in output:
|
|
|
- # output.replace('OK\n','')
|
|
|
-
|
|
|
- # wir entfernen alle \n
|
|
|
- #while '\n' in output:
|
|
|
- # output.replace('\n','')
|
|
|
-
|
|
|
+ # geh fort mit den OKs, Zeilenumbruechen und Zeilenvorschueben
|
|
|
output = output.replace('OK','').replace('\n','').replace('\r','')
|
|
|
|
|
|
# wir brauchen hier noch einen Output
|
|
|
- self.debug("cleanOutput Ausgabe: \n" + output)
|
|
|
+ self.logger.debug("cleanOutput Ausgabe: \n" + output)
|
|
|
|
|
|
else:
|
|
|
return 'ERROR'
|
|
|
@@ -112,17 +104,6 @@ class SIM:
|
|
|
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
|
|
|
def setPIN(self,pintx,pinrx):
|
|
|
self.pintx = pintx
|
|
|
@@ -135,11 +116,11 @@ class SIM:
|
|
|
return self.pinrx
|
|
|
|
|
|
# SIM PIN entered Setter Getter
|
|
|
- def setSIMPINentered(self,entered=False):
|
|
|
- self.simpinentered=entered
|
|
|
+ def setIssimpinentered(self,entered=False):
|
|
|
+ self.issimpinentered=entered
|
|
|
|
|
|
- def getSIMPINentered(self):
|
|
|
- return self.simpinentered
|
|
|
+ def getIssimpinentered(self):
|
|
|
+ return self.issimpinentered
|
|
|
|
|
|
# Baud setter/getter
|
|
|
def setBaud(self,baud):
|
|
|
@@ -148,33 +129,68 @@ class SIM:
|
|
|
def getBaud(self):
|
|
|
return self.baud
|
|
|
|
|
|
- # Konfigurationsoptionen für das Modem
|
|
|
+ # SIM Inserted States
|
|
|
+ def setIssiminserted(self,si):
|
|
|
+ if si == 1:
|
|
|
+ self.issiminserted = True
|
|
|
+
|
|
|
+ else:
|
|
|
+ self.issiminserted = False
|
|
|
+
|
|
|
+ def getIssiminserted(self):
|
|
|
+ return self.issiminserted
|
|
|
+
|
|
|
+ def setTemperature(self,temp):
|
|
|
+ self.devTemp = temp
|
|
|
+
|
|
|
+ def getTemperature(self):
|
|
|
+ return self.devTemp
|
|
|
+
|
|
|
+ def setOperator(self,operator):
|
|
|
+ self.devOper = operator
|
|
|
+
|
|
|
+ def getOperator(self):
|
|
|
+ return self.devOper
|
|
|
+
|
|
|
+ def setRSSI(self,rssi):
|
|
|
+ self.devRSSI = rssi
|
|
|
+
|
|
|
+ def getRSSI(self):
|
|
|
+ return self.devRSSI
|
|
|
+
|
|
|
+ # Konfigurationsoptionen fr das Modem
|
|
|
def devSetup(self):
|
|
|
- print("Modem Setup")
|
|
|
- self.sendAT('ATE0')
|
|
|
+ self.logger.verbose("Modem Setup")
|
|
|
+ self.sendAT('AT+COPS=0') # Automatisch den Operator aussuchen
|
|
|
+ self.sendAT('ATE0') # Echo Off auf der Schnittstelle
|
|
|
self.sendAT('AT+CRSL=100')
|
|
|
self.sendAT('AT+CSCS="GSM"')
|
|
|
self.sendAT('AT+CMGF=1')
|
|
|
|
|
|
+
|
|
|
# Temperaturchecks
|
|
|
- # todo: liefert leider keine Temperaturwerte zurück
|
|
|
def getDevTemp(self):
|
|
|
- self.debug(self.sendAT('AT+CMTE?'))
|
|
|
- self.devTemp = self.sendAT('AT+CMTE?').partition(",")[2]
|
|
|
-
|
|
|
+ self.setTemperature(self.sendAT('AT+CMTE?').partition(",")[2])
|
|
|
+ self.logger.debug(self.getTemperature())
|
|
|
|
|
|
# Informationen vom Modem lesen
|
|
|
def getDevInfo(self):
|
|
|
self.devInfo = self.sendAT('ATI')
|
|
|
|
|
|
+ def getDevSIMinserted(self):
|
|
|
+ si=self.sendAT('AT+CSMINS?').partition(",")[2]
|
|
|
+ self.logger.debug("SIM inserted: newState=" + str(si) + " savedState=" + str(self.getIssiminserted()))
|
|
|
+
|
|
|
+ self.setIssiminserted(int(si))
|
|
|
+
|
|
|
# PIN State
|
|
|
# AT Commando der PIN Abfrage
|
|
|
def getDevSIMPINstate(self):
|
|
|
- if 'ready' in self.sendAT('AT+CPIN?'):
|
|
|
- self.setSIMPINentered(True)
|
|
|
+ if 'READY' in self.sendAT('AT+CPIN?'):
|
|
|
+ self.setIssimpinentered(True)
|
|
|
return True
|
|
|
else:
|
|
|
- self.setSIMPINentered(False)
|
|
|
+ self.setIssimpinentered(False)
|
|
|
return False
|
|
|
|
|
|
# Laufzeitinformationen vom Modem abfragen
|
|
|
@@ -186,10 +202,13 @@ class SIM:
|
|
|
|
|
|
|
|
|
self.getDevTemp()
|
|
|
- print("Modem Temperature degC: " + str(self.devTemp))
|
|
|
+ self.logger.verbose("Modem Temperature degC: " + str(self.getTemperature()))
|
|
|
+
|
|
|
+ self.getDevSIMinserted()
|
|
|
+ self.logger.verbose("SIM Inserted: " + str(self.getIssiminserted()))
|
|
|
|
|
|
self.getDevSIMPINstate()
|
|
|
- print("SIM PIN state: " + str(self.getSIMPINentered()))
|
|
|
+ self.logger.verbose("SIM PIN state: " + str(self.getIssimpinentered()))
|
|
|
|
|
|
self.getDevOperator()
|
|
|
self.getDevRSSI()
|
|
|
@@ -203,32 +222,35 @@ class SIM:
|
|
|
def getDevRev(self):
|
|
|
self.devRev = self.sendAT('AT+GMR')
|
|
|
|
|
|
- # todo: Netzqualitätsanzeige (RSSI)
|
|
|
+ # todo: Netzqualittsanzeige (RSSI)
|
|
|
def getDevRSSI(self):
|
|
|
#debugausgabe zum herausfinden der Ausgabe
|
|
|
- self.debug("RSSI: " + self.sendAT("AT+CSQ"))
|
|
|
+ self.setRSSI(>>> sim.sendAT("AT+CSQ").partition(",")[0].partition(": ")[2])
|
|
|
+ self.logger.debug("RSSI: " + self.getRSSI())
|
|
|
|
|
|
# todo: Netzprovider Anzeige
|
|
|
def getDevOperator(self):
|
|
|
#debugausgabe
|
|
|
- self.debug("Operator: " + self.sendAT("AT+COPS"))
|
|
|
+ self.setOperator(self.sendAT("AT+COPS?").partition(",\"")[2])
|
|
|
+ self.logger.debug("Operator: " + self.getOperator())
|
|
|
|
|
|
# setzt den PIN auf dem Modem
|
|
|
def sendPIN(self,pin=None):
|
|
|
- if not self.getSIMPINentered() and pin is not None and not self.getDevSIMPINstate():
|
|
|
+ if not self.getIssimpinentered() and pin is not None and not self.getDevSIMPINstate():
|
|
|
# PIN fehlt, hier noch eintragen
|
|
|
self.sendAT('AT+CPIN=' + str(pin))
|
|
|
- self.setSIMPINentered(True)
|
|
|
+ self.setIssimpinentered(True)
|
|
|
+
|
|
|
|
|
|
- if not self.getSIMPINentered() and self.simpin is not None and not self.getDevSIMPINstate():
|
|
|
+ if not self.getIssimpinentered() and self.simpin is not None and not self.getDevSIMPINstate():
|
|
|
# PIN fehlt, hier noch eintragen
|
|
|
self.sendAT('AT+CPIN=' + str(pin))
|
|
|
- self.setSIMPINentered(True)
|
|
|
+ self.setIssimpinentered(True)
|
|
|
|
|
|
|
|
|
+ #
|
|
|
+ # sim.sendSMS("017643609376", "neue Testnachricht")
|
|
|
def sendSMS(self,number,text):
|
|
|
self.sendAT('AT+CMGS="'+ str(number) + '"\n' + str(text) + '\x1A')
|
|
|
|
|
|
-#print (ser.out_waiting)
|
|
|
-#mdm = SIM(1, 115200, 2389)
|
|
|
-#mdm.sendSMS("017643609376", "neue Testnachricht")
|
|
|
+
|