SIM.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. # Diese Klasse ist für normales Python mit pySerial
  2. # Sie stellt ein Interface für SIM800 Befehlssätze dar
  3. # 2022-03-02 - devnull - initial
  4. # 2022-03-06 - devnull - Schritt 1 : Anpassung für ESP ohne Auslesefunktionalitäten
  5. import sys
  6. import io
  7. from machine import UART
  8. class SIM:
  9. tty = None
  10. ser = None
  11. pin = None
  12. baud = None
  13. sio = None
  14. devInfo = None
  15. devTemp = None
  16. devSN = None
  17. devProd = None
  18. devRev = None
  19. # wenn keine PIN übergeben, dann brechen wir ab
  20. def __init__(self, tty = None, baud = 115200, pin = None):
  21. # wir brauchen hier noch etwas um zu prüfen und abzubrechen, wenn PIN und TTY nicht gesetzt sind
  22. if (tty is None) or (pin is None):
  23. sys.stderr.write('TTY oder PIN fehlt')
  24. sys.exit(1)
  25. else:
  26. self.setTTY(tty)
  27. self.setBaud(baud)
  28. self.setPIN(pin)
  29. #PC: import serial
  30. try:
  31. # Verbindung oeffnen
  32. #PC: self.ser = serial.Serial(self.getTTY(), self.getBaud(), timeout=1) # PC
  33. #PC: self.sio = io.TextIOWrapper(io.BufferedRWPair(self.ser, self.ser)) # PC
  34. self.sio = UART(self.getTTY(), baudrate=self.getBaud())
  35. self.devSetup()
  36. #try:
  37. # self.ser.open()
  38. #PC: except serial.SerialException as e:
  39. except:
  40. sys.stderr.write('Could not open serial port {}: {}\n'.format(self.getTTY(), e))
  41. sys.exit(1)
  42. # sammle Modem Informationen
  43. #self.devInfo()
  44. #self.devProd()
  45. #self.devRev()
  46. #self.devSN()
  47. #self.devTemp()
  48. # PIN Übergabe
  49. self.sendESPPIN(pin)
  50. # PIN senden
  51. #übermittelt ein AT Command, aber bitte nur eine Zeile als Rückgabewert
  52. def sendAT(self,AT):
  53. self.sio.write(AT + '\n')
  54. #PC: self.sio.flush() # it is buffering. required to get the data out *now*
  55. #PC: return self.cleanOutput(self.sio.readlines())
  56. # Antwort DICT bereinigen
  57. def cleanOutput(self,output):
  58. # erstmal suchen wir nach einem OK in der Ausgabe
  59. if not 'Error' in output:
  60. # wir entfernen alle OKs
  61. while 'OK\n' in output:
  62. output.remove('OK\n')
  63. # wir entfernen alle \n
  64. while '\n' in output:
  65. output.remove('\n')
  66. else:
  67. return 'ERROR'
  68. if len(output) > 0:
  69. return output[0].replace('\n','')
  70. else:
  71. return ' '
  72. # tty setter
  73. def setTTY(self,tty):
  74. self.tty = tty
  75. # tty getter
  76. def getTTY(self):
  77. return self.tty
  78. # PIN setter/getter
  79. def setPIN(self,pin):
  80. self.pin = pin
  81. def getPIN(self):
  82. return self.pin
  83. # Baud setter/getter
  84. def setBaud(self,baud):
  85. self.baud = baud
  86. def getBaud(self):
  87. return self.baud
  88. # Konfigurationsoptionen für das Modem
  89. def devSetup(self):
  90. self.sendAT('ATE0')
  91. self.sendAT('AT+CRSL=100')
  92. self.sendAT('AT+CSCS="GSM"')
  93. self.sendAT('AT+CMGF=1')
  94. # Temperaturchecks
  95. def devTemp(self):
  96. self.devTemp = self.sendAT('AT+CMTE?').partition(",")[2]
  97. # Informationen vom Modem lesen
  98. def devInfo(self):
  99. self.devInfo = self.sendAT('ATI')
  100. def devProd(self):
  101. self.devProd = self.sendAT('AT+GMM')
  102. def devSN(self):
  103. self.devSN = self.sendAT('AT+GSN')
  104. def devRev(self):
  105. self.devRev = self.sendAT('AT+GMR')
  106. # setzt den PIN auf dem Modem
  107. def sendPIN(self,pin):
  108. if not 'ready' in self.sendAT('AT+CPIN?'):
  109. # PIN fehlt, hier noch eintragen
  110. self.sendAT('AT+CPIN=' + str(pin))
  111. # temporaer: ESP setzt den PIN auf dem Modem
  112. def sendESPPIN(self,pin):
  113. self.sendAT('AT+CPIN=' + str(pin))
  114. def sendSMS(self,number,text):
  115. self.sendAT('AT+CMGS="'+ str(number) + '"\n' + str(text) + '\x1A')
  116. #print (ser.out_waiting)
  117. #mdm = SIM('/dev/ttyUSB1', 115200, 2389)
  118. #mdm.sendSMS("017643609376", "neue Testnachricht")