SIM.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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, os
  6. from machine import UART
  7. from machine import Timer
  8. class SIM:
  9. tty = None
  10. ser = None
  11. pin = None
  12. pinentered = False
  13. baud = None
  14. sio = None
  15. devInfo = None
  16. devTemp = None
  17. devSN = None
  18. devProd = None
  19. devRev = None
  20. SIMtim = Timer(2)
  21. # wenn keine PIN übergeben, dann brechen wir ab
  22. def __init__(self, tty = None, baud = 115200, pin = None):
  23. # wir brauchen hier noch etwas um zu prüfen und abzubrechen, wenn PIN und TTY nicht gesetzt sind
  24. if (tty is None) or (pin is None):
  25. sys.stderr.write('TTY oder PIN fehlt')
  26. sys.exit(1)
  27. else:
  28. self.setTTY(tty)
  29. self.setBaud(baud)
  30. self.setPIN(pin)
  31. #PC: import serial
  32. try:
  33. # Verbindung oeffnen
  34. #PC: self.ser = serial.Serial(self.getTTY(), self.getBaud(), timeout=1) # PC
  35. #PC: self.sio = io.TextIOWrapper(io.BufferedRWPair(self.ser, self.ser)) # PC
  36. self.sio = UART(self.getTTY(), baudrate=self.getBaud()) # ESP
  37. self.devSetup()
  38. #try:
  39. # self.ser.open()
  40. #PC: except serial.SerialException as e:
  41. except:
  42. sys.stderr.write('Could not open serial port {}: {}\n'.format(self.getTTY(), e))
  43. sys.exit(1)
  44. # sammle Modem Informationen
  45. # wir brauchen hier einen Timer, der dann in regelmaessigen Abstaenden die Modeminfos holt
  46. #self.devInfo()
  47. #self.devProd()
  48. #self.devRev()
  49. #self.devSN()
  50. #self.devTemp()
  51. self.SIMtim.init(period=1000, callback=self.devRuntime)
  52. # PIN Übergabe
  53. self.sendESPPIN(pin)
  54. #übermittelt ein AT Command, aber bitte nur eine Zeile als Rückgabewert
  55. def sendAT(self,AT):
  56. self.sio.write(AT + '\n')
  57. #PC: self.sio.flush() # it is buffering. required to get the data out *now*
  58. #PC: return self.cleanOutput(self.sio.readlines())
  59. #os.dupterm(None,1)
  60. # Antwort DICT bereinigen
  61. def cleanOutput(self,output):
  62. # erstmal suchen wir nach einem OK in der Ausgabe
  63. if not 'Error' in output:
  64. # wir entfernen alle OKs
  65. while 'OK\n' in output:
  66. output.remove('OK\n')
  67. # wir entfernen alle \n
  68. while '\n' in output:
  69. output.remove('\n')
  70. else:
  71. return 'ERROR'
  72. if len(output) > 0:
  73. return output[0].replace('\n','')
  74. else:
  75. return ' '
  76. # tty setter
  77. def setTTY(self,tty):
  78. self.tty = tty
  79. # tty getter
  80. def getTTY(self):
  81. return self.tty
  82. # PIN setter/getter
  83. def setPIN(self,pin):
  84. self.pin = pin
  85. def getPIN(self):
  86. return self.pin
  87. # PIN entered Setter
  88. def setPINentered(self,entered=False):
  89. self.pinentered=entered
  90. def getPINentered(self):
  91. return self.pinentered
  92. # Baud setter/getter
  93. def setBaud(self,baud):
  94. self.baud = baud
  95. def getBaud(self):
  96. return self.baud
  97. # Konfigurationsoptionen für das Modem
  98. def devSetup(self):
  99. self.sendAT('ATE0')
  100. self.sendAT('AT+CRSL=100')
  101. self.sendAT('AT+CSCS="GSM"')
  102. self.sendAT('AT+CMGF=1')
  103. # Temperaturchecks
  104. def devTemp(self):
  105. self.devTemp = self.sendAT('AT+CMTE?').partition(",")[2]
  106. # Informationen vom Modem lesen
  107. def devInfo(self):
  108. self.devInfo = self.sendAT('ATI')
  109. # PIN State
  110. def devPINstate(self):
  111. if 'ready' in self.sendAT('AT+CPIN?'):
  112. self.pinentered=True
  113. else:
  114. self.pinentered=False
  115. # Laufzeitinformationen vom Modem abfragen
  116. def devRuntime(self):
  117. self.devInfo()
  118. self.devProd()
  119. self.devRev()
  120. self.devSN()
  121. self.devTemp()
  122. self.devPINstate()
  123. def devProd(self):
  124. self.devProd = self.sendAT('AT+GMM')
  125. def devSN(self):
  126. self.devSN = self.sendAT('AT+GSN')
  127. def devRev(self):
  128. self.devRev = self.sendAT('AT+GMR')
  129. # setzt den PIN auf dem Modem
  130. def sendPIN(self,pin):
  131. if not pinentered:
  132. # PIN fehlt, hier noch eintragen
  133. self.sendAT('AT+CPIN=' + str(pin))
  134. # temporaer: ESP setzt den PIN auf dem Modem
  135. def sendESPPIN(self,pin):
  136. self.sendAT('AT+CPIN=' + str(pin))
  137. self.setPINentered(True)
  138. def sendSMS(self,number,text):
  139. self.sendAT('AT+CMGS="'+ str(number) + '"\n' + str(text) + '\x1A')
  140. #print (ser.out_waiting)
  141. #mdm = SIM(1, 115200, 2389)
  142. #mdm.sendSMS("017643609376", "neue Testnachricht")