|
|
@@ -0,0 +1,162 @@
|
|
|
+# Diese Klasse ist für normales Python mit pySerial
|
|
|
+# Sie stellt ein Interface für SIM800 Befehlssätze dar
|
|
|
+
|
|
|
+# 2022-03-02 - devnull - initial
|
|
|
+# 2022-03-06 - devnull - Schritt 1 : Anpassung für ESP ohne Auslesefunktionalitäten
|
|
|
+
|
|
|
+import sys
|
|
|
+import io
|
|
|
+from machine import UART
|
|
|
+
|
|
|
+class SIM:
|
|
|
+
|
|
|
+
|
|
|
+ tty = None
|
|
|
+ ser = None
|
|
|
+ pin = None
|
|
|
+ baud = None
|
|
|
+ sio = None
|
|
|
+ devInfo = None
|
|
|
+ devTemp = None
|
|
|
+ devSN = None
|
|
|
+ devProd = None
|
|
|
+ devRev = None
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ # wenn keine PIN übergeben, dann brechen wir ab
|
|
|
+ def __init__(self, tty = None, baud = 115200, pin = None):
|
|
|
+
|
|
|
+ # wir brauchen hier noch etwas um zu prüfen und abzubrechen, wenn PIN und TTY nicht gesetzt sind
|
|
|
+ if (tty is None) or (pin is None):
|
|
|
+ sys.stderr.write('TTY oder PIN fehlt')
|
|
|
+ sys.exit(1)
|
|
|
+ else:
|
|
|
+ self.setTTY(tty)
|
|
|
+ self.setBaud(baud)
|
|
|
+ self.setPIN(pin)
|
|
|
+
|
|
|
+ #PC: import serial
|
|
|
+
|
|
|
+ try:
|
|
|
+ # Verbindung oeffnen
|
|
|
+ #PC: self.ser = serial.Serial(self.getTTY(), self.getBaud(), timeout=1) # PC
|
|
|
+ #PC: self.sio = io.TextIOWrapper(io.BufferedRWPair(self.ser, self.ser)) # PC
|
|
|
+ self.sio = UART(self.getTTY(), baudrate=self.getBaud())
|
|
|
+ self.devSetup()
|
|
|
+
|
|
|
+ #try:
|
|
|
+ # self.ser.open()
|
|
|
+ #PC: except serial.SerialException as e:
|
|
|
+ except:
|
|
|
+ sys.stderr.write('Could not open serial port {}: {}\n'.format(self.getTTY(), e))
|
|
|
+ sys.exit(1)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ # sammle Modem Informationen
|
|
|
+ #self.devInfo()
|
|
|
+ #self.devProd()
|
|
|
+ #self.devRev()
|
|
|
+ #self.devSN()
|
|
|
+ #self.devTemp()
|
|
|
+
|
|
|
+ # PIN Übergabe
|
|
|
+ self.sendESPPIN(pin)
|
|
|
+
|
|
|
+
|
|
|
+ # PIN senden
|
|
|
+
|
|
|
+ #übermittelt ein AT Command, aber bitte nur eine Zeile als Rückgabewert
|
|
|
+ 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())
|
|
|
+
|
|
|
+ # Antwort DICT bereinigen
|
|
|
+ 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.remove('OK\n')
|
|
|
+
|
|
|
+ # wir entfernen alle \n
|
|
|
+ while '\n' in output:
|
|
|
+ output.remove('\n')
|
|
|
+
|
|
|
+ else:
|
|
|
+ return 'ERROR'
|
|
|
+
|
|
|
+ if len(output) > 0:
|
|
|
+ return output[0].replace('\n','')
|
|
|
+ else:
|
|
|
+ return ' '
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ # tty setter
|
|
|
+ def setTTY(self,tty):
|
|
|
+ self.tty = tty
|
|
|
+
|
|
|
+ # tty getter
|
|
|
+ def getTTY(self):
|
|
|
+ return self.tty
|
|
|
+
|
|
|
+ # PIN setter/getter
|
|
|
+ def setPIN(self,pin):
|
|
|
+ self.pin = pin
|
|
|
+
|
|
|
+ def getPIN(self):
|
|
|
+ return self.pin
|
|
|
+
|
|
|
+ # Baud setter/getter
|
|
|
+ def setBaud(self,baud):
|
|
|
+ self.baud = baud
|
|
|
+
|
|
|
+ def getBaud(self):
|
|
|
+ return self.baud
|
|
|
+
|
|
|
+ # Konfigurationsoptionen für das Modem
|
|
|
+ def devSetup(self):
|
|
|
+ self.sendAT('ATE0')
|
|
|
+ self.sendAT('AT+CRSL=100')
|
|
|
+ self.sendAT('AT+CSCS="GSM"')
|
|
|
+ self.sendAT('AT+CMGF=1')
|
|
|
+
|
|
|
+ # Temperaturchecks
|
|
|
+ def devTemp(self):
|
|
|
+ self.devTemp = self.sendAT('AT+CMTE?').partition(",")[2]
|
|
|
+
|
|
|
+ # Informationen vom Modem lesen
|
|
|
+ def devInfo(self):
|
|
|
+ self.devInfo = self.sendAT('ATI')
|
|
|
+
|
|
|
+ def devProd(self):
|
|
|
+ self.devProd = self.sendAT('AT+GMM')
|
|
|
+
|
|
|
+ def devSN(self):
|
|
|
+ self.devSN = self.sendAT('AT+GSN')
|
|
|
+
|
|
|
+ def devRev(self):
|
|
|
+ self.devRev = self.sendAT('AT+GMR')
|
|
|
+
|
|
|
+ # setzt den PIN auf dem Modem
|
|
|
+ def sendPIN(self,pin):
|
|
|
+ if not 'ready' in self.sendAT('AT+CPIN?'):
|
|
|
+ # PIN fehlt, hier noch eintragen
|
|
|
+ self.sendAT('AT+CPIN=' + str(pin))
|
|
|
+
|
|
|
+ # temporaer: ESP setzt den PIN auf dem Modem
|
|
|
+ def sendESPPIN(self,pin):
|
|
|
+ self.sendAT('AT+CPIN=' + str(pin))
|
|
|
+
|
|
|
+
|
|
|
+ def sendSMS(self,number,text):
|
|
|
+ self.sendAT('AT+CMGS="'+ str(number) + '"\n' + str(text) + '\x1A')
|
|
|
+
|
|
|
+#print (ser.out_waiting)
|
|
|
+#mdm = SIM('/dev/ttyUSB1', 115200, 2389)
|
|
|
+#mdm.sendSMS("017643609376", "neue Testnachricht")
|