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