# 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")