#python 3!!!! #v shellu: #import sys #sys.path.append('/home/pi') #import gsmmodule #David Pleskot, 2016 import serial import time import os import math inicializovano=False apn=b'internet' #upravit podle navodu poskytovatele, tohle je vodafone ftpuser=b'jmeno' #doplnit svoje udaje ftpserver=b'ftp.sweb.cz' ftppassw=b'heslo' debug=False def ctiradky(kolik): for i in range(kolik): fn=ser.readline() if debug: print(fn) def inituart(): global ser ser=serial.Serial('/dev/serial0', 19200, timeout=1) #modul je nastavenej na 19200bd AT+IPR=19200 global inicializovano inicializovano=True def zavriuart(): global inicializovano if inicializovano: ser.close() inicializovano=False def cekej(naco, jakdlouho): i=0 retez='' while (i0: return(1) return(0) def initgsm(): if inicializovano: opak=3 ch=1 while (opak>0) and (ch>0): ch=at() opak=opak-1 if ch>0: print('gsm modul se nehlasi') return(1) ser.flushInput() ser.write(b'AT+CPIN?\r\n') ctiradky(2) retez=ser.readline() if debug: print(retez) ctiradky(2) #vyctu dalsi data, prazdnej radek a OK if retez!=b'+CPIN: READY\r\n': #potrebuje PIN ser.flushInput() ser.write(b'AT+CPIN=1234\r\n') count=1 retez='' while (count<40) and (retez!=b'Call Ready\r\n'): retez=ser.readline() if debug: print(retez) count=count+1 if retez==b'UNDER-VOLTAGE WARNNING\r\n': print('UNDER-VOLTAGE WARNNING') if retez!=b'Call Ready\r\n': print('gsm modul nema sit') return(1) time.sleep(1) #pokud prislo Call Ready, tak pockam este nez se vykeca ser.flushInput() ser.write(b'AT+CMGF=1\r\n') if cekej(b'OK\r\n',4)>0: print('nelze prepnout do textoveho modu sms') return(1) ser.flushInput() ser.write(b'AT+CLIP=1\r\n') if cekej(b'OK\r\n',4)>0: print('nelze zapnout zobrazovani cisla prichoziho hovoru') return(1) return(0) return(2) def vytoc(cislo): if inicializovano: bz=initgsm() if bz!=0: return(bz) ser.flushInput() c=bytes(cislo.encode(encoding='UTF-8')) ser.write(b'ATD'+c+b';\r\n') if cekej(b'OK\r\n',4)>0: print('spojeni nelze navazat') return(1) count=0 retez='' while (count<30) and (retez!=b'BUSY\r\n') and (retez!=b'NO ANSWER\r\n'): retez=ser.readline() if debug: print(retez) count=count+1 #takze pocka 30 sekund if (retez!=b'BUSY\r\n') and (retez!=b'NO ANSWER\r\n'): ser.write(b'ATH\r\n') #ukoncim hovor else: print('hovor neprijat, nebo ukoncen volanym') return(0) return(2) def pocitani_sms(argument): #ALL, nebo REC UNREAD, pocet sms if inicializovano: bz=initgsm() if bz!=0: return(-1) ser.flushInput() c=bytes(argument.encode(encoding='UTF-8')) ser.write(b'AT+CMGL=\x22'+c+b'\x22\r\n') ctiradky(2) pocetsms=0 count=0 retez='' while (count<50) and (retez!=b'OK\r\n'): retez=ser.readline() if debug: print(retez) count=count+1 if len(retez)>6: if retez[:6]==b'+CMGL:': pocetsms=pocetsms+1; if retez!=b'OK\r\n': print('chyba v prikazu AT+CMGL') return(-1) return pocetsms return(-1) def indexy_sms(argument): #ALL, nebo REC UNREAD, seznam indexu sms if inicializovano: bz=initgsm() if bz!=0: return('') vystup='' ser.flushInput() c=bytes(argument.encode(encoding='UTF-8')) ser.write(b'AT+CMGL=\x22'+c+b'\x22\r\n') ctiradky(2) count=0 retez='' while (count<50) and (retez!=b'OK\r\n'): retez=ser.readline() if debug: print(retez) count=count+1 if len(retez)>6: if retez[:6]==b'+CMGL:': retez=str(retez) #da tam i to pocatecni b' zac=retez.find('+CMGL: ') carka=retez.find(',',zac) #za +CMGL je mezera vystup=vystup+retez[zac+7:carka+1] if retez!=b'OK\r\n': print('chyba v prikazu AT+CMGL') return('') if len(vystup)>0: return vystup[:len(vystup)-1] #umazu posledni carku else: return vystup return('') def cteni_sms(index): #index je string! if inicializovano: bz=initgsm() if bz!=0: return('') vystup='' ser.flushInput() c=bytes(index.encode(encoding='UTF-8')) ser.write(b'AT+CMGR='+c+b'\r\n') ctiradky(2) retez=ser.readline() if debug: print(retez) if retez[:6]==b'+CMGR:': vystup=ser.readline() if debug: print(vystup) vystup=str(vystup)[2:-5] #umazu b'...\r\n' return vystup return('') def cteni_posledni_sms(): if inicializovano: bz=initgsm() if bz!=0: return('') ret=indexy_sms('ALL') if len(ret)!=0: i=-1 while ret.find(',',i+1)!=-1: i=ret.find(',',i+1) if i==-1: return(cteni_sms(ret)) #mam v seznamu jen jeden index, carku jsem nenasel else: return(cteni_sms(ret[i+1:])) #posledni index v seznamu return('') def smaz_vsechny_sms(): if inicializovano: bz=initgsm() if bz!=0: return(bz) if pocitani_sms('ALL')>0: ser.flushInput() ser.write(b'AT+CMGD=1,4\r\n') if cekej(b'OK\r\n',4)>0: print('chyba v prikazu AT+CMGD') return(1) return(0) return(2) def smaz_sms(index): if inicializovano: c=bytes(index.encode(encoding='UTF-8')) bz=initgsm() if bz!=0: return(bz) indexy=indexy_sms('ALL') if (indexy!='') and (indexy.find(index)>=0): ser.flushInput() ser.write(b'AT+CMGD='+c+b',0\r\n') if cekej(b'OK\r\n',4)>0: print('chyba v prikazu AT+CMGD') return(1) return(0) return(2) def posli_sms(cislo,text): if inicializovano: bz=initgsm() if bz!=0: return(bz) ser.flushInput() c=bytes(cislo.encode(encoding='UTF-8')) ser.write(b'AT+CMGS=\x22'+c+b'\x22\r\n') #0x22 jsou uvozovky ctiradky(2) retez=ser.read(1) if retez!=b'>': print('chyba v prikazu AT+CMGS') return(1) c=bytes(text.encode(encoding='UTF-8')) ser.write(c+b'\x1A') #text + ctrl+Z if cekej(b'OK\r\n',10)>0: print('nepodarilo se odeslat') return(1) return(0) return(2) def initgprs(): if inicializovano: bz=initgsm() if bz!=0: return(bz) ser.flushInput() ser.write(b'AT+SAPBR=2,1\r\n') retez=cekej_cast(b'+SAPBR:',10) if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+SAPBR') return(1) if retez[10:11]=='1': print(retez) return(0) #uz mam pripojeno ser.flushInput() ser.write(b'AT+SAPBR=3,1,\x22CONTYPE\x22,\x22GPRS\x22\r\n') if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+SAPBR 1') return(1) ser.flushInput() ser.write(b'AT+SAPBR=3,1,\x22APN\x22,\x22'+apn+b'\x22\r\n') #APN upravit podle instrukci poskytovatele, vodafone ma "internet" if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+SAPBR 2') return(1) ser.flushInput() ser.write(b'AT+SAPBR=1,1\r\n') if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+SAPBR 3') return(1) ser.flushInput() ser.write(b'AT+SAPBR=2,1\r\n') print(cekej_cast(b'+SAPBR:',10)) if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+SAPBR 4') return(1) return(0) return(2) def closegprs(): if not inicializovano: return (2) bz=initgsm() if bz!=0: return(bz) ser.flushInput() ser.write(b'AT+SAPBR=0,1\r\n') if cekej(b'OK\r\n',10)!=0: return(1) return(0) def ftpodesli(soubor): def odesli_cast(data, delka): sdelka=str(delka) ser.flushInput() ser.write(b'AT+FTPPUT=2,'+bytes(sdelka.encode(encoding='UTF-8'))+b'\r\n') retez=cekej_cast(b'+FTPPUT:',15) if retez=='': #nereaguje, chyba print('chyba v prubehu odesilani souboru 1') return(-1) if retez=='+FTPPUT:2,'+sdelka: #mozno odeslat, takze odeslu ser.write(data) if cekej(b'OK\r\n',10)!=0: print('chyba v prubehu odesilani souboru 2') return(-1) return(0) #povedlo se odeslat if retez[:12]=='+FTPPUT:1,1,': #spadlo spojeni a znova se nahodilo return (int(retez[12:])) #vratim maxdelku print('chyba v prubehu odesilani souboru: '+retez) return(-2) if inicializovano: #mam inicializovanou seriovou linku lomitko=-1 for i in range(0, len(soubor)-1): if soubor[i]=='/': lomitko=i jmenosouboru=soubor[lomitko+1: len(soubor)] bz=initgsm() #mam inicializovanej modul if bz!=0: return(bz) bz=initgprs() #mam pripojeni k netu if bz!=0: return(bz) print('inicializace ftp klienta') ser.flushInput() ser.write(b'AT+FTPCID=1\r\n') if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+FTPCID') return(1) ser.flushInput() ser.write(b'AT+FTPSERV=\x22'+ftpserver+b'\x22\r\n') if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+FTPSERV') return(1) ser.flushInput() ser.write(b'AT+FTPUN=\x22'+ftpuser+b'\x22\r\n') if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+FTPUN') return(1) ser.flushInput() ser.write(b'AT+FTPPW=\x22'+ftppassw+b'\x22\r\n') if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+FTPPW') return(1) ser.flushInput() ser.write(b'AT+FTPPUTNAME=\x22'+bytes(jmenosouboru.encode(encoding='UTF-8'))+b'\x22\r\n') if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+FTPPUTNAME') return(1) ser.flushInput() ser.write(b'AT+FTPPUTPATH=\x22/\x22\r\n') if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+FTPPUTPATH') return(1) print('zahajeni sesion') ser.flushInput() ser.write(b'AT+FTPPUT=1\r\n') #zahajeni session retez=cekej_cast(b'+FTPPUT:1,',60) if retez=='': print('nepodarilo se navazat ftp spojeni') return(1) if retez[10:12]!='1,': print('nepodarilo se navazat ftp spojeni, chyba:'+retez[10:]) return(1) maxdelka=int(retez[12: len(retez)]) fajl=open(soubor,'rb') velikost=os.path.getsize(soubor) zbytek=velikost % maxdelka kolikrat=int((velikost-zbytek)/maxdelka) print('odesilani souboru') if kolikrat>0: #odeslani souboru for i in range(1, kolikrat+1): pokusu=5 ch=1 d=fajl.read(maxdelka) while (pokusu>0) and (ch>0): ch=odesli_cast(d, maxdelka) pokusu=pokusu-1 if ch<0: #to znamena chyba v prubehu odesilani, nebo neco takoveho ser.write(b'AT+FTPPUT=2,0\r\n') return(1) if (i % 10)==0: print('\todeslano '+str(i)+'/'+str(kolikrat)) if zbytek>0: pokusu=5 ch=1 d=fajl.read(zbytek) while (pokusu>0) and (ch>0): ch=odesli_cast(d, zbytek) pokusu=pokusu-1 if ch<0: ser.write(b'AT+FTPPUT=2,0\r\n') return(1) fajl.close() ser.flushInput() print('ukonceni session') ser.write(b'AT+FTPPUT=2,0\r\n') #ukonceni session if cekej(b'OK\r\n',10)!=0: print('chyba v prikazu AT+FTPPUT=2,0') #je odeslano, vracim 0 ser.write(b'AT+FTPPUT=2,0\r\n') #zkusim to este jednou a seru na to cekej(b'OK\r\n',10) return(0) return(2) def vyzvaneni(cislo): #pokud se zada cislo, tak odpovi 'ok' pokud volalo, jinak '', pozor na mezinarodni format +420.... if not inicializovano: #pokud se zada '', tak odpovi prvnim cislem v rade ktery volalo, nebo '' return('') p=ser.inWaiting() if p>0: retez=str(ser.read(p)) if debug: print(retez) if retez.find('RING')>=0: if cislo=='': q=retez.find('+CLIP:') if q>=0: u1=retez.find('\x22',q) u2=retez.find('\x22',u1+1) return(retez[u1+1:u2]) else: if retez.find('+CLIP: \x22'+cislo+'\x22'): return('ok') return('') def servicedata(dotaz): #dotaz na kredit '*22#' if not inicializovano: return('') bz=initgsm() if bz!=0: return(bz) ser.flushInput() ser.write(b'AT+CUSD=1,\x22'+bytes(dotaz.encode(encoding='UTF-8'))+b'\x22,15\r\n') retez=cekej_cast(b'+CUSD: 0,',10) if retez=='': return('') prvni=retez.find('\x22') #najdeme uvozovky druhe=retez.find('\x22',prvni+1) return(retez[prvni+1:druhe])