Python hakkında kısa kısa notlar

Başlatan fide, 22 Mart 2019, 13:12:02

fide

Arkadaşlar okulda kullanmak için hazırladığım python çalışma notlarını paylaşıyorum.
içinde başlangıç seviyesinden veritabanı ve dosya okuma yazma işlemlerine kadar kısa kısa notlar var.

https://drive.google.com/file/d/1vndDvc25Jf0jbSOFhql1txHVckJkGuzW/view?usp=sharing
https://drive.google.com/file/d/17BoFyXDCtaUuFG2HE-79GzXqGTCwjYuO/view?usp=sharing
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

22 Mart 2019, 22:44:43 #1 Son düzenlenme: 23 Mart 2019, 09:30:51 fide
Serial port erişimi için bunu kullanıyorum.
#gsm modül iletişim seri portu
import serial

ser
=serial.Serial()
ser.baudrate=115200
ser
.port='/dev/ttyS1'        # windows için  com2 comvb olacak
ser.open()
sleep(0.1)
Veri almak kontrol etmek ve yazmak için de aşağıdaki komutlar kullanılıyor.
ser.inwaiting --> seri port bufferda bekleyen veri miktarını verir.

ser.read() ile istenen byte kadar veri okuma  yapılıyor.

ser.read(ser.inwaiting)  komutuyla da bekleyen verinin tamamı okunur.

komut="AT\r"
ser.write(komut.encode('utf-8')) ile seri port veri gönderme yapılıyor
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

urllib kütüphanesiyle dosya indirme işlemi

import urllib.request

req 
urllib.request.Request('http://httpbin.org')
with urllib.request.urlopen(req) as response:
	
the_page response.read().decode('utf-8')
	
print (
"req Stat:{}\r\n".format(req.status))

dosya=open("/home/site.html","w")
print(
the_page,file=dosya,flush=True)
dosya.close()
print(
"dosyaya yazdim")
#print(the_page)
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

SQlite veritabanı ile işlemlerin fonksiyona dökülmüş hali

#kütüphane import
import sqlite3
import os
dbFile
="/home/arts/db/dbArts.sqlite"
# dosya yolunu kendi projenizde değiştirin


Veritabanı dosyası var mı kontrol et
def dbKontrol():
	
dosyaMevcut=os.path.exists(dbFile)
	
if 
not dosyaMevcut:
	
	
dbOlustur()
	
else:
	
	
print(
"db dosyası var.\r\n")
	
	
Veritabanı dosyası ve tabloları oluştur
def dbOlustur():
	
vt=db.connect(dbFile)
	
im=vt.cursor()
	
#im.execute("CREATE TABLE arac(id,plate,marka,model,yas,barcode)")
	
#vt.commit()
	
im.execute("""
	
CREATE TABLE action(
	
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
	
'longitude' VARCHAR(25),
	
'longitudeDir'  VARCHAR(5),
	
'latitude' VARCHAR(25), 
	
'latitudeDir' VARCHAR(5), 
	
'rakim'  REAL,
	
'yon' REAL,
	
'kms' REAL,
	
'knot' REAL,
	

	
'tarih' VARCHAR(10), 
	
'saat' VARCHAR(10)
	
)"""
)
	
#im.execute("CREATE TABLE action(id,enlem,boylam,rakim,yon,hiz,tarih,saat)")
	
vt.commit()
	
vt.close()
	
print(
"Veritabanı olusturuldu\r\n")
Veritabanına veri ekle
def veriGir(longitude,longitudeDir,latitude,latitudeDir,rakim,yon,kms,knot,gsmTarih,gsmSaat):
	
with db.connect(dbFile) as vt:
	
	
im=vt.cursor()
	
	
sorguText="""INSERT INTO 
	
	
action(longitude,longitudeDir,latitude,latitudeDir,rakim,yon,kms,knot,tarih,saat) 
	
	
values('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}') """
.format(longitude,longitudeDir,latitude,latitudeDir,rakim,yon,kms,knot,gsmTarih,gsmSaat)
	
	
#print (sorguText)
	
	
im.execute(sorguText)
	
	
vt.commit()
	
	
print(
"Veritabanına eklendi")
	

Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Veritabanınadan sorgu yap

def sorgula():
	
global 
veri
	
with db.connect(dbFile) as vt:
	
	
im=vt.cursor()
	
	
sorguText="select * from ogrenci"
	
	
#sorguText="""INSERT INTO 
	
	
#ogrenci(adi,soyadi,ogrNo,sinif) 
	
	
#values('{}','{}','{}','{}') """.format(adi,soyadi,ogrNo,sinif)
	
	
#print (sorguText)
	
	
im.execute(sorguText)
	
	
veri=im.fetchall()
	
	
vt.commit()
	
	

	
	
#print("veriler: {}".format(veri))
	

parametrik sorgu yap
def paramSorgu(adi,soyadi,ogrNo,sinif):
	
global 
veri
	
with db.connect(dbFile) as vt:
	
	
im=vt.cursor()
	
	
#sorguText="""select * from ogrenci where adi like'%{}%'""".format(adi)
	
	
if 
adi!="":
	
	
	
sorguText="""select * from ogrenci where adi='{}'""".format(adi)
	
	
if 
soyadi!="":
	
	
	
sorguText="""select * from ogrenci where soyadi='{}'""".format(soyadi)
	
	
if 
ogrNo!="":
	
	
	
sorguText="""select * from ogrenci where ogrNo='{}'""".format(ogrNo)
	
	
if 
sinif!="":
	
	
	
sorguText="""select * from ogrenci where sinif='{}'""".format(sinif)
	
	

	
	
if 
adi=="" and soyadi=="" and ogrNo=="" and sinif=="":
	
	
	
sorguText="""select * from ogrenci"""
	
	
#sorguText="""INSERT INTO 
	
	
#ogrenci(adi,soyadi,ogrNo,sinif) 
	
	
#values('{}','{}','{}','{}') """.format(adi,soyadi,ogrNo,sinif)
	
	
#print (sorguText)
	
	
im.execute(sorguText)
	
	
veri=im.fetchall()
	
	
vt.commit()
	
	
if 
len(veri)==0:
	
	
	
return 
"Sorgu Sonucu Boş"
	
	
else:
	
	
	
return 
veri
	
	
#print("veriler: {}".format(veri))
	

parametreye dayalı veri sil
def paramSil(adi):
	
global 
veri
	
with db.connect(dbFile) as vt:
	
	
im=vt.cursor()
	
	
sorguText="""delete from ogrenci where adi='{}'""".format(adi)
	
	
im.execute(sorguText)
	
	

	
	
vt.commit()
	
	
	

Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

25 Mart 2019, 12:22:19 #5 Son düzenlenme: 25 Mart 2019, 12:25:17 fide
Omega2+ ve GM862 GSM modül ile girilen lokasyonu google maps linki şeklinde SMS atan Python uygulaması

from time import sleep
import onionGpio
import serial


# define pins
pinLed=
pinGsmBoot
=3
pinGsmPwrCtl
=2

# define states
ON=1
OFF
=0
gsmPwrState
=0
line
=""
commResp=["OK","ERROR","+CPIN: SIM PIN","+CPIN: READY","$GPSACP:","+CREG:","#MONI:"]
bckspc=bytes([26])
bigger=">"
tryOut=30
sayac
=0

gpsText
=""
gsmRespText=""
bekleyen=0

dummyText
=""


#_freegpio
#onionGpio._freegpio(pinLed)
#onionGpio._freegpio(pinGsmBoot)
#onionGpio._freegpio(pinGsmPwrCtl)

# pin tanımlama ve konfigürasyonu
ledonionGpio.OnionGpio(pinLed)
gsmBootonionGpio.OnionGpio(pinGsmBoot)
gsmPwrCtlonionGpio.OnionGpio(pinGsmPwrCtl)

# pin direction
led.setOutputDirection(ON)
	
#led için çıkış
gsmBoot.setOutputDirection(OFF#gsmBoot için çıkış
gsmPwrCtl.setInputDirection() #gsmPwrCtl için giriş olarak ayarlandı

def gsmBootProc():
	
gsmPwrStateint(gsmPwrCtl.getValue())
	
#print(type(gsmPwrCtl))
	
print(
"Gsm Power:{}\r\n".format(gsmPwrState))
	
if 
gsmPwrState==1:
	
	
print(
"Gsm zaten acik\r\n")
	
else:
	
	
led.setValue(OFF)
	
# işaret ver
	
	
gsmBoot.setValue(ON)
	
	
sleep(1)
	
	
gsmBoot.setValue(OFF)
	
	
sleep(5)
	
	

	
	
print(
"Gsm Boot\r\n")
	
led.setValue(ON)
	
# işaret ver
def smsGonder(num,text):
	
if 
"+90" in num:
	
	
numType=145
	
else:
	
	
numType=129
	
	

	
komut="AT+CMGS={},{}\r".format(num,numType)
	
	
# SMS göndermek için başla
	
ser.write(komut.encode('utf-8'))
	
sleep(3)
	
if 
ser.in_waiting>0:
	
	
	
	
	
# > gelirse
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
print(
"gsmRespText: {} \r\n".format(gsmRespText))
	
	
	
	
	
	

	
if 
bigger in gsmRespText
	

	
	

	
	
ser.write(text.encode('utf-8'))
	
	
ser.write(bckspc)
	


def atGonder(komut):
	

	
if 
komut.startswith("AT+CPIN="): #komut pin girme ise komutu göndermeden önce pin durumu sorgusu yap 
	
	
atPin="AT+CPIN?\r"
	
	
	
# eğer pin girilmedi ise gir, girildi ise pass geç
	
	
ser.write(atPin.encode('utf-8'))
	
	
sleep(0.5)
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
if 
"+CPIN: SIM PIN" in gsmRespText:
	
# eğer SIM PIN dönerse
	
	
	
print(
"Simm Pin\r\n")
	
	
	
ser.write(komut.encode('utf-8'))
	
#pin gir"
	
	
	
sleep(1)
	
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
	
if 
"OK" in gsmRespText:
	
	
# pin girme işi tamam
	
	
	
	
print(
"Pin Ok\r\n")
	
	
	
	
#break
	
	
	
elif "ERROR" in gsmRespText:
	
# pinde hata var burayla ilgili uyarı yap
	
	
	
	
print(
"Pin ERROR\r\n")
	
	
	
	
#break
	
	
elif "+CPIN: READY" in gsmRespText:
	
# diyelim ki board resetlendi ama gsm modül açık. bu durumda tekrar pin girme
	
	
	
print(
"Pin zaten girilmiş\r\n")
	
	
	
#break
	
elif "AT#MONI" in komut:
	
#eğer komut "AT#MONI\r" ise
	
	
sayac=0
	
	
while(
True):
	
#Burda sonsuz döngü ile ya bağlanana ya da deneme sayısı aşılana kadar dön
	
	
	
print(
"{}\r\n Sayac{}\r\n ".format(komut,sayac))
	
	
#komutu yazdır
	
	
	
sayac=sayac+1
	
	
	
ser.write(komut.encode('utf-8'))
	
	
	
sleep(2)
	
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
	

	
	
	
print(
"{}\r\nSayac:{}".format(gsmRespText,sayac))
	
# bulduğunu ve sayacı yazdır
	
	
	
if (
sayac>tryOut) or ("BSIC:" in gsmRespText): #Eğer cevap "OK" döndü ise (bu ileride GPSACP gibisonunda bir de OK döndüren komutlarda sıkıntı olabilir.)
	
	
	
	
print(
"MONI: out\r\n")
	
	
	
	
#tamamsa çık (modül değişince burası da değişecek)
	
	
	
	
break
	
	

	
else:
	
	
# eğer komut CPIN ve MONI komutu değilse normal işleme devam et
	
	
	

	

	
	
print(
komut+"\r\n")
	
	
#komutu yazdır
	
	
ser.write(komut.encode('utf-8'))
	
	
sleep(1)
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	

	
	
if 
"OK" in gsmRespText:  #Eğer cevap "OK" döndü ise (bu ileride GPSACP gibisonunda bir de OK döndüren komutlarda sıkıntı olabilir.)
	
	
	
pass
	
	
	
#break
	
	

#-----------------başlıyoruz ------------------
# terminal seri portu 
terminal=serial.Serial()
terminal.baudrate=115200
terminal
.port='/dev/ttyS0'
terminal.open()

gsmBootProc()
#sm modül iletişim seri portu
ser=serial.Serial()
ser.baudrate=115200
ser
.port='/dev/ttyS1'
ser.open()

sayac=0

	

atGonder("AT\r")
atGonder("AT+CPIN=3711\r")
atGonder("AT#MONI\r")
atGonder("AT+CNMI=2,1\r")
atGonder("AT+CMGF=1\r")
atGonder("AT+CMGD=1,4\r")
#atGonder("""AT+CMGL="REC UNREAD"\r""") 

while(True):
	
print(
"sayac: {}\r\n".format(sayac))
	
sayac=sayac+1
	
if 
terminal.in_waiting>0:
	
	
break

	
#led.setValue(OFF)
	

	
if 
ser.in_waiting>4:
	
# eğer veri varsa al ve değerlendir.
	
	
#seriporttan veri gelirken kesme oluşmadığı için bekleme yaparak 
	
	
#veri alınıyor. Bu bekleme esnasında da bazen veri alınırken veri 
	
	
#ortada kesilebiliyor
	
	
#bunun için küçük bir bekleme test rutini ekledim.
	
	
bekleyen=ser.in_waiting
	
	
sleep(0.1)
	
	
if 
ser.in_waiting != bekleyen:
	
	
	
sleep(0.2)
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
print(
"Veri: {}".format(gsmRespText))
	
	
print(
"------------------------\r\n")
	
	

	
	
print(
"gsmRespText:{}\r\n".format(gsmRespText))
	
smsKoordinat="Konum: https://www.google.com.tr/maps/place/{}.{}{}+{}.{}{}".format(10,22222,"N",33,15255,"E")
	

	
smsGonder("+90505xxxxxxx",smsKoordinat)
	
sleep(15)
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

25 Mart 2019, 12:29:50 #6 Son düzenlenme: 25 Mart 2019, 12:32:48 fide
SMS ile led yak / söndür / blink ve google maps linki şeklinde gönderen python uygulaması

Telit GM862  ve Omega2+ üzerinde geliştirildi.


#! /usr/bin/env python
# -*- coding: UTF-8 -*-
#Bismillahirrahmanirrahim
from time import sleep
import onionGpio
import serial
import sqlite3 
as db
import os


# define pins
pinLed=
pinGsmBoot
=3
pinGsmPwrCtl
=2

# define states
ON=1
OFF
=0
gsmPwrState
=0
line
=""
commResp=["OK","ERROR","+CPIN: SIM PIN","+CPIN: READY","$GPSACP:","+CREG:","#MONI:"]
bckspc=bytes([26])
bigger=">"
tryOut=30
sayac
=0

# tanımlar
dbFile="/home/arts/db/dbArts.sqlite"
gpsText=""
gsmRespText=""
bekleyen=0
# saat ve tarih tanımları
sa=0
dk
=0
san
=0
gun
=0
ay
=0
yil
=0
dkEx
=0

dummyText
=""

saat=""
enlem=""
boylam=""
rakim=0
yon
=0
hiz
=0
tarih
=""
uydu=0

#_freegpio
#onionGpio._freegpio(pinLed)
#onionGpio._freegpio(pinGsmBoot)
#onionGpio._freegpio(pinGsmPwrCtl)

# pin tanımlama ve konfigürasyonu
ledonionGpio.OnionGpio(pinLed)
gsmBootonionGpio.OnionGpio(pinGsmBoot)
gsmPwrCtlonionGpio.OnionGpio(pinGsmPwrCtl)

# pin direction
led.setOutputDirection(ON)
	
#led için çıkış
gsmBoot.setOutputDirection(OFF#gsmBoot için çıkış
gsmPwrCtl.setInputDirection() #gsmPwrCtl için giriş olarak ayarlandı

#fonksiyonlar
def dbOlustur():
	

	
vt=db.connect(dbFile)
	
im=vt.cursor()
	
#im.execute("CREATE TABLE arac(id,plate,marka,model,yas,barcode)")
	
#vt.commit()
	
im.execute("""CREATE TABLE action (id INTEGER PRIMARY KEY, enlem VARCHAR(25),boylam VARCHAR(25), rakim  REAL, yon REAL,hiz REAL, tarih VARCHAR(10), saat VARCHAR(10))""")
	
#im.execute("CREATE TABLE action(id,enlem,boylam,rakim,yon,hiz,tarih,saat)")
	
vt.commit()
	
vt.close()
	
print(
"Veritabanı olusturuldu\r\n")
	

def gsmBootProc():
	
gsmPwrStateint(gsmPwrCtl.getValue())
	
#print(type(gsmPwrCtl))
	
print(
"Gsm Power:{}\r\n".format(gsmPwrState))
	
if 
gsmPwrState==1:
	
	
print(
"Gsm zaten acik\r\n")
	
else:
	
	
led.setValue(OFF)
	
# işaret ver
	
	
gsmBoot.setValue(ON)
	
	
sleep(1)
	
	
gsmBoot.setValue(OFF)
	
	
sleep(5)
	
	

	
	
print(
"Gsm Boot\r\n")
	
led.setValue(ON)
	
# işaret ver
def smsGonder(num,text):
	
if 
"+9" in num:
	
	
numType=145
	
else:
	
	
numType=129
	
	

	
komut="AT+CMGS={},{}\r".format(num,numType)
	
	
# SMS göndermek için başla
	
ser.write(komut.encode('utf-8'))
	
sleep(3)
	
if 
ser.in_waiting>0:
	
	
	
	
	
# > gelirse
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
print(
"gsmRespText: {} \r\n".format(gsmRespText))
	
	
	
	
	
	

	
if 
bigger in gsmRespText
	

	
	

	
	
ser.write(text.encode('utf-8'))
	
	
ser.write(bckspc)
	


def dbKontrol():
	
dosyaMevcut=os.path.exists(dbFile)
	
if 
not dosyaMevcut:
	
	
dbOlustur()
	
else:
	
	
print(
"db dosyası var.\r\n")

def atGonder(komut):
	

	
if 
komut.startswith("AT+CPIN="): #komut pin girme ise komutu göndermeden önce pin durumu sorgusu yap 
	
	
atPin="AT+CPIN?\r"
	
	
	
# eğer pin girilmedi ise gir, girildi ise pass geç
	
	
ser.write(atPin.encode('utf-8'))
	
	
sleep(0.5)
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
if 
"+CPIN: SIM PIN" in gsmRespText:
	
# eğer SIM PIN dönerse
	
	
	
print(
"Simm Pin\r\n")
	
	
	
ser.write(komut.encode('utf-8'))
	
#pin gir"
	
	
	
sleep(1)
	
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
	
if 
"OK" in gsmRespText:
	
	
# pin girme işi tamam
	
	
	
	
print(
"Pin Ok\r\n")
	
	
	
	
#break
	
	
	
elif "ERROR" in gsmRespText:
	
# pinde hata var burayla ilgili uyarı yap
	
	
	
	
print(
"Pin ERROR\r\n")
	
	
	
	
#break
	
	
elif "+CPIN: READY" in gsmRespText:
	
# diyelim ki board resetlendi ama gsm modül açık. bu durumda tekrar pin girme
	
	
	
print(
"Pin zaten girilmiş\r\n")
	
	
	
#break
	
elif "AT#MONI" in komut:
	
#eğer komut "AT#MONI\r" ise
	
	
sayac=0
	
	
while(
True):
	
#Burda sonsuz döngü ile ya bağlanana ya da deneme sayısı aşılana kadar dön
	
	
	
print(
"{}\r\n Sayac{}\r\n ".format(komut,sayac))
	
	
#komutu yazdır
	
	
	
sayac=sayac+1
	
	
	
ser.write(komut.encode('utf-8'))
	
	
	
sleep(2)
	
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
	

	
	
	
print(
"{}\r\nSayac:{}".format(gsmRespText,sayac))
	
# bulduğunu ve sayacı yazdır
	
	
	
if (
sayac>tryOut) or ("BSIC:" in gsmRespText): #Eğer cevap "OK" döndü ise (bu ileride GPSACP gibisonunda bir de OK döndüren komutlarda sıkıntı olabilir.)
	
	
	
	
print(
"MONI: out\r\n")
	
	
	
	
#tamamsa çık (modül değişince burası da değişecek)
	
	
	
	
break
	
	

	
else:
	
	
# eğer komut CPIN ve MONI komutu değilse normal işleme devam et
	
	
	

	

	
	
print(
komut+"\r\n")
	
	
#komutu yazdır
	
	
ser.write(komut.encode('utf-8'))
	
	
sleep(1)
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	

	
	
if 
"OK" in gsmRespText:  #Eğer cevap "OK" döndü ise (bu ileride GPSACP gibisonunda bir de OK döndüren komutlarda sıkıntı olabilir.)
	
	
	
pass
	
	
	
#break
	
	

#-----------------başlıyoruz ------------------
dbKontrol() #veritabanı var kontrol et yoksa oluştur varsa aşağıda bağlan
# terminal seri portu 
terminal=serial.Serial()
terminal.baudrate=115200
terminal
.port='/dev/ttyS0'
terminal.open()

gsmBootProc()
#sm modül iletişim seri portu
ser=serial.Serial()
ser.baudrate=115200
ser
.port='/dev/ttyS1'
ser.open()

sayac=0

	

atGonder("AT\r")
atGonder("AT+CPIN=3711\r")
atGonder("AT#MONI\r")
atGonder("AT+CNMI=2,1\r")
atGonder("AT+CMGF=1\r")
atGonder("AT+CMGD=1,4\r")
#atGonder("""AT+CMGL="REC UNREAD"\r""") 

while(True):
	
print(
"sayac: {}\r\n".format(sayac))
	
sayac=sayac+1
	
if 
terminal.in_waiting>0:
	
	
break

	
#led.setValue(OFF)
	

	
if 
ser.in_waiting>4:
	
# eğer veri varsa al ve değerlendir.
	
	
#seriporttan veri gelirken kesme oluşmadığı için bekleme yaparak 
	
	
#veri alınıyor. Bu bekleme esnasında da bazen veri alınırken veri 
	
	
#ortada kesilebiliyor
	
	
#bunun için küçük bir bekleme test rutini ekledim.
	
	
bekleyen=ser.in_waiting
	
	
sleep(0.1)
	
	
if 
ser.in_waiting != bekleyen:
	
	
	
sleep(0.2)
	
	
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
	
	
print(
"Veri: {}".format(gsmRespText))
	
	
print(
"------------------------\r\n")
	
	

	
	
print(
"gsmRespText:{}\r\n".format(gsmRespText))
	
	
#gelen veri üzerinde çalış
	
	
#SMS bildirimi gelince SMS okumak için komut ver
	
	
if 
"+CMTI:" in gsmRespText:
	
	
	
print(
"+CMTI: {}\r\n".format(gsmRespText))
	
	
	
komut="""AT+CMGL="REC UNREAD"\r"""
	
	
	
ser.write(komut.encode('utf-8'))
	
	
#gelen SMS i okuma komutu
	
	
if 
"+CMGL:" in gsmRespText:
	
	
	
#yeni SMS metnini aldım 
	
	
	
#gerekli işlemleri yaptıktan sonra SMSi sil, simm kart hafızası dolmasın
	
	
	
print(
"SMS:{}\r\n".format(gsmRespText))
	
	
	
#gelen SMSi parçala ve bildir
	
	
	
# gelen veri: :b'\r\n+CMGL:  20,"REC UNREAD","+90505xxxxxxxxx"\r\nABCDEFG\r\nOK\r\n'
	
	
	

	
	
	
smsRecvText=gsmRespText[gsmRespText.find("+"):]
	
	
	
smsTextList=list(smsRecvText.split("\r\n"))
	
	
	
for 
i in smsTextList:
	
	
	
	
print(
"smsTextlist:{}\r\n".format(i))
	
	
	
#Çıktılar:
	
	
	
#b'\r\n+CMGL:  20
	
	
	
#"REC UNREAD"
	
	
	
#"+90505xxxxxxx"\r\nABCDEFG\r\nOK\r\n
	
	
	

	
	
	
smsTelNumList=smsTextList[0].split(",")
	
	
	
for 
i in smsTelNumList:
	
	
	
	
print (
"smsTelNumList:{}\r\n".format(i))
	
	
	
	

	
	
	
telNum=smsTelNumList[2].replace('"','')
	
	
	

	
	
	
print(
"Telefon:{}\r\n".format(telNum))
	
	
	

	
	
	
smsBody=smsTextList[1]
	
	
	
print(
"smsBody:{}--\r\n".format(smsBody))
	
	
	
#artık SMS ve telefon ile istediğimi yapabilirim.
	
	
	
smsComm=["On","Off","Blink","Sms"]
	
	
	
if 
smsBody in smsComm:
	
	
	
	
#eğer gelen SMS ON OFF blink ise
	
	
	
	
if 
"On" in smsBody:
	

	
	
	
	
	
led.setValue(ON)
	
	
	
	
if 
"Off" in smsBody:
	
	
	
	
	
led.setValue(OFF)
	
	
	
	
if 
"Blink" in smsBody:
	
	
	
	
	
for 
ii in range(25):
	
	
	
	
	
	
sleep(0.2)
	
	
	
	
	
	
led.setValue(ii%2)
	
	

	
	
	
	
if 
"Sms" in smsBody:
	
	
	
	
	
#smsGonder("+90505xxxxxxxx","SMS test for Python")
	
	
	
	
	
#smsKoordinat="e:{}, b:{}, y:{}, h:{}".format(enlem,boylam,yon,hiz)
	
	
	
	
	
#google koordinatlara çevir
	
	
	
	
	

	
	
	
	
	
	
	
	
	
	

	
	
	
	
	
en_der=enlem[:2]
	
	
	
	
	
en_toplu=enlem[2:len(enlem)-1]
	
	
	
	
	
#print("enlem: {}\r\n".format(enlem))
	
	
	
	
	
#print("en_toplu: {}\r\n".format(en_toplu))

	
	
	
	
	
en_int=float(en_toplu)/60
	
	
	
	
	
en_str=str(en_int)[2:8]

	
	
	
	
	
	
	
	
	
	

	
	
	
	
	
en_pol=enlem[len(enlem)-1:len(enlem)]
	
	
	
	
	
boy_der=boylam[:3]
	
	
	
	
	
boy_toplu=boylam[3:len(boylam)-1]

	
	
	
	
	
#print("boylam: {}\r\n".format(boylam))
	
	
	
	
	
#print("boy_toplu: {}\r\n".format(boy_toplu))

	
	
	
	
	
boy_int=float(boy_toplu)/60
	
	
	
	
	
boy_str=str(boy_int)[2:8]

	
	
	
	
	
#print("boy_str:{}\r\n".format(boy_str))

	
	
	
	
	
boy_pol=boylam[len(boylam)-1:len(boylam)]

	
	
	
	
	
smsKoordinat="Konum: https://www.google.com.tr/maps/place/{}.{}{}+{}.{}{}".format(en_der,en_str,en_pol,boy_der,boy_str,boy_pol)
	
	
	
	
	
	
	
	
	
	
	

	
	
	
	
	
smsGonder(telNum,smsKoordinat)
	
	
	
	
	
sleep(10)
	
	
	
	
#gelen komut için bu komut mu? karşılaştırması koy ve gelen text istenen uzunlukta mı bak
	

	
	
if ( (
"$GPSACP"in gsmRespText) and (len(gsmRespText)>85): # gelen veri $GPSACP ve 80 karakterden uzunsa
	
	
	
#eğer gps cümlesinin önünde başka bir komutun cevabı gelirse bölmek sıkıntı oluşturuyor
	
	
	
#bunun için $GPSACP: konumu alınıp onunla işlem yapılıyor.
	
	

	
	
	
gpsText=gsmRespText[gsmRespText.find("$"):]
	

	
	
	
params=list(gpsText.split(","))
	
	
	
saat=params[0]
	
	
	
saat=saat[saat.find(":")+2:saat.find(":")+8]
	
	
	
#saat=saat[8:len(saat)]
	
	
	
enlem=params[1]
	
	
	
boylam=params[2]
	
	
	
rakim=float(params[4])
	
	
	
yon=round(float(params[6]))
	
	
	
hiz=round(float(params[7]))
	
	
	
tarih=params[9]
	
	
	
uydu=int(params[10][:2])
	
	
	
#bulduklarını yazdır
	
	
	
#print( "saat: {}\r\n".format(saat))
	
	
	
#print( "enlem: {}\r\n".format(enlem))
	
	
	
#print( "boylam: {}\r\n".format(boylam))
	
	
	
#print( "rakım: {}\r\n".format(rakim))
	
	
	
#print( "yön: {}\r\n".format(yon))
	
	
	
#print( "hiz: {}\r\n".format(hiz))
	
	
	
#print( "tarih: {}\r\n".format(tarih))
	
	
	
#print( "uydu: {}\r\n".format(uydu))
	
	
	

	
	
	
dkEx=dk
	
	
	
#sleep(1)
	
	
	
# zaman ifadelerini çek
	
	
	
sa=int(saat[0:2])
	
	
	
dk=int(saat[2:4])
	
	
	
san=int(saat[4:6])
	
	
	
#tarih ifadelerini çek
	
	
	
gun=int(tarih[0:2])
	
	
	
ay=int(tarih[2:4])
	
	
	
yil=int(tarih[4:6])
	
	
	

	
	
	
print(
"Tarih ve Saat {}/{}/{} {}:{}:{}\r\n".format(gun,ay,yil,sa,dk,san))
	
	
	

	
	
	
# dakika değişiminde çalış
	
	
	
if 
dk!=dkEx
	
	
	
	
#bulduklarını veritabanına yazdır
	
	
	
	

	
	
	
	
with db.connect(dbFile) as vt:
	
	
	
	
	
im=vt.cursor()
	
	
	
	
	
sorguText="""INSERT INTO action(enlem,boylam,rakim,yon,hiz,tarih,saat) VALUES("{}","{}","{}","{}","{}","{}","{}")""".format(enlem,boylam,rakim,yon,hiz,tarih,saat)
	
	
	
	
	
#print (sorguText)
	
	
	
	
	
im.execute(sorguText)
	
	
	
	
	
vt.commit()
	
	
	
	
	
print(
"Veritabanına eklendi")
	
	
	

	
# gönderilecek komutları buraya gir.
	
#sonra bir süre beklet
	
#Sonra komut içindeki tüm texti yukarıda ayıklasın
	

	

	
komut="AT$GPSACP\r"
	
ser.write(komut.encode('utf-8'))
	
sleep(0.5)
	

	

	

ser.close()
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Omega2 üzerinde gpio uygulaması ile ilgili daha önce küçük bir paylaşım yapmıştım ama kendi forumunda Omega2 ile ilgili periphery yada raspberry pi kütüphaneyi kullanın gibi bir yazı okudum.

https://pypi.org/project/python-periphery/

periphery kütüphanesi yukarıdaki linkten indirilebilir.

GPIO yanında Seri port, SPI, I2C, PWM vb kütüphaneleri de içeriyor.

GPIO Kontrol:

16 ve 17 nolu pinler çıkış olarak tanımlandı.

pinA=16
pinB
=17


ledA
GPIO("/dev/gpiochip0"pinA"out")
ledBGPIO("/dev/gpiochip0"pinB"out")



for 
i in range(20):
	

	
ledA.write(True)
	
ledB.write(False)
	
sleep(0.1)
	
ledA.write(False)
	
ledB.write(True)
	
sleep(0.1)

ledA.close()
ledB.close()

Write komutu ile yak / söndür, read komutu ile (pin giriş olarak ayarlanmak şartı ile) pin seviyesi okuması yapılabiliyor.


Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Kullanılan ağ bağlantısının MAC adresini almak.

Eğer aynı cihazdan birden fazla kullanıp cihazlara id numarası vermeniz gerekirse MAC adresini alıp bunu id olarak verebilirsiniz. ::ok  ::ok

Kütüphane bu adreste. Kulanım  örnekleri de var.
https://pypi.org/project/getmac/

import getmac


def main
():
    print(
getmac.get_mac_address(interface="eth0"))
    print(
getmac.get_mac_address(interface="Ethernet 3"))
    print(
getmac.get_mac_address(ip="10.0.0.1"))
    print(
getmac.get_mac_address(hostname="localhost"))
    print(
getmac.get_mac_address(ip="10.0.0.1"network_request=True))
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

NamedTuple
Python dilinde namdtuple isimli bir yapı var. Bu yapı kullandığınız sözlüğe istediğiniz sayıda değişken eklemenizi ve değişkenlere verdiğiniz isimle ulaşmanızı sağlıyor.

kullanabilmek için collections içinden import etmeniz gerekiyor.

from collections import namedtuple
önce kullanmak istediğimiz yapıya ait değişkenleri belirleyip isim veriyoruz.

Point namedtuple('Point', ['x''y'])
Point isminde bir namedtuple değişken tanımladık. namedtuple içindeki Point kullanacağımız değişken, x ve y ise çağıracağımız değişkenler.

sonraki adım
Point(33,22)

print(
p.x)
print(
p.y)
print(
p.x-p.y)


Kullanım örneği:
cmd=namedtuple('cmd', ['cmdText','timeout','responses'])

at=cmd("AT\r",100,["OK","ERROR"])                     #AT
atE0=cmd("ATE0\r",100,["OK","ERROR"])                 #Command Echo
atGSN=cmd("AT+GSN\r",100,["OK","ERROR"])              # GSM Module Serial Number
...

serial.write(at.cmdText.encode("utf-8"))

sleep(at.timeout/10)

if 
x in at.responses:
    do 
something

kaynak:
https://docs.python.org/3/library/collections.html#collections.namedtuple

https://pymotw.com/2/collections/namedtuple.html

https://www.geeksforgeeks.org/namedtuple-in-python/
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

23 Şubat 2020, 23:54:20 #10 Son düzenlenme: 24 Şubat 2020, 00:24:18 fide
Bir önceki yazıda namedtuple isimli yapılardan bahsetmiştim.
namedtuple isminden de anlaşılacağı gibi yapı içindeki öğelere ismi ile ulaşmanızı sağlıyor.

Özellikle gsm modül gibi birçok farklı komut ve parametreye sahip cihazlarla haberleşmek için komutlara ait verileri tutmak için bir yapı ihtiyacım vardı.
namedtuple bunu bir anlamda çözdü ama yeni problem ortaya çıktı.

at=cmd("AT\r",100,["OK","ERROR"])                    #AT
atE0=cmd("ATE0\r",100,["OK","ERROR"])                #Command Echo
atGSN=cmd("AT+GSN\r",100,["OK","ERROR"])              # GSM Module Serial Number

yukarıdaki yapı ile 3 adet komut tanımladım. bunlara at.timeout yada at.cmdText ile rahat bir şekilde ulaşabiliyorum. Ben komut ismini parametre olarak vermek istiyorum ama problem şu her tanımladığım komutu kullanmak için komut ismini yazmam gerekiyor. Komut ismini paramtre olarak vermem için ya namedtuple sınıfının öğelerine erişmem gerek yada tanımladığım komutların isimlerini teker teker başka bir listede tutmam gerek.
Python ve namedtuple ile araştırma yaparken bir komut ile karşılaştım.
modname globals()['__name__']
modobj sys.modules[modname]
Bu komut tanımladığınız bir öğeye parametre gibi ulaşmanızı sağlıyor.

Örnek verecek olursak a değişkeni var.
import sys

a
=[1,2,3,4]
modname globals()['__name__']
modobj sys.modules[modname]
print(
getattr(modobj,"a"))

yukarıdaki kodları incelediğimizde yapılan işi şu şekilde açıklayabiliriz. (hatalı olabilirim) Python içindeki globals değişkeni içindeki a değişkenini bul ve içeriğini al.

Buraya kadar a değişkeni benim işime çok yaramıyor ama a değişkeni yerine namedtuple ile tanımladığım yapıyı koyunca işler değişiyor.

at=cmd("AT\r",100,["OK","ERROR"])                    #AT
atE0=cmd("ATE0\r",100,["OK","ERROR"])                #Command Echo
atGSN=cmd("AT+GSN\r",100,["OK","ERROR"]) 
 
yukarıda tanımladığım değişkenlere a listesine uyguladığım işlemi uygularsam istediğim şekilde çağırma ve parametre olarak verme şansım var.

from collections import namedtuple
import sys

cmd
=namedtuple('cmd', ['cmdText','timeout','responses'])


at=cmd("AT\r",100,["OK","ERROR"])                    #AT
atE0=cmd("ATE0\r",100,["OK","ERROR"])                #Command Echo
atGSN=cmd("AT+GSN\r",100,["OK","ERROR"])              # GSM Module Serial Number

def atGonder(cmd):
    
modname globals()['__name__']
    
modobj sys.modules[modname]
    print(
getattr(modobj,cmd).cmdText)
    
atGonder("atE0")

Burada listeyi asıl oluşturmak istememein sebebi birçok komutta standart olarak farklı bulunan değişkenleri tek bir yapıda toplamaktı. Örneğin ATD komutu için timeout 150sn, olası cevaplar "NO CARRIER", "CONNECT", "ERROR" gibi bunu yukarıdali ATE0 komutu yada atGSN komutu ile aynı yapıda tutabiliyorum.
Komutu göndermek için ise
atGonder("atE0")yazmam yeterli.
atGonder fonksiyonu içinde artık ister timeout kontrol ederim ister responses'a bakarım yada cmdText ile seri porta komut yazarım. Tamamen programcıya kalmış.

Eğer bu yapıyı namedtuple ile tanımlamış olsaydım:
print(at.cmdText) şeklinde kullanmak zorunda kalacak ve bunu bir fonksiyona parametre olarak gönderemeyecektim. Bu açıdan parametre olarak gönderebilmek benim için çok önemli.

Bu komut yapısı sayesinde omega2+ yada raspberry pi üzerinde çalışacak bir gsm modül kontrol library geliştiriyorum. Bitirince burada paylaşmayı planlıyorum.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Tanımlamamnın güzelliğine bakar mısınız?

pins = [machine.Pin(imachine.Pin.IN) for i in (024512131415)]
Bu kod ne kadar ESP32 micropython için yazılmış olsa da 8 adet pini bir defada tanımlayıp kullanmak için yazılmış güzel bir kod.

kodun açık hali:
pins=[machine.Pin(0machine.Pin.IN),machine.Pin(2machine.Pin.IN),machine.Pin(4machine.Pin.IN),machine.Pin(5machine.Pin.IN),machine.Pin(12machine.Pin.IN),machine.Pin(13machine.Pin.IN),machine.Pin(14machine.Pin.IN),machine.Pin(15machine.Pin.IN)]
pin tanımlarken bile fonksiyon yazılabiliyor.  ::op  ::op

Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com