# Diese Klasse ist für normales Python mit pySerial # Sie stellt ein Interface für SIM800 Befehlssätze dar # 2022-03-02 - devnull - initial import sys import io 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) import serial try: # Verbindung oeffnen self.ser = serial.Serial(self.getTTY(), self.getBaud(), timeout=1) #self.sio = io.TextIOWrapper(io.BufferedRWPair(self.ser, self.ser),newline="\r\n") self.sio = io.TextIOWrapper(io.BufferedRWPair(self.ser, self.ser)) self.devSetup() #try: # self.ser.open() except serial.SerialException as e: 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.sendPIN(pin) print("DEBUG:") print(" " + self.devInfo) print(" " + self.devProd) print(" " + self.devRev) print(" " + self.devSN) print(" " + self.devTemp) # PIN senden #übermittelt ein AT Command, aber bitte nur eine Zeile als Rückgabewert def sendAT(self,AT): self.sio.write(AT + '\n') self.sio.flush() # it is buffering. required to get the data out *now* 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)) 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")