Raspberry pi python soket bağlantı ile led on-off

Başlatan gokhangokcen, 04 Temmuz 2017, 14:35:37

gokhangokcen

Cümleten selamun aleyküm;
pythonda oldukça acemiyim. Yavaş yavaş öğrenmeye çalışıyorum. Amacım soket ile bağlantı kurup (telnet üzerinden) led açıp kapatmak. Aşağıda denediğim kod mevcut. Şu haliyle program if deyimi içerisine hiç bir şekilde girmiyor. Muhtemelen karakterleri alırken ascii karşılaştırırken farklı yorumlatıyor olabilirim. Nasıl bir çözüme gitmeliyim? Hatayı nerede yapıyorum?
import socket
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)
GPIO.output(11,False)

def led_blink():
            while 1:
                       print("mesaj")
                       GPIO.output(11,True)
                       GPIO.output(11,False)
                       time.sleep(1)
           GPIO.cleanup()

s=socket.socket()
host = "192.168.2.10
port = 4747
s.bind((host,port))
s.listen5)
while True:
           c,addr = s.accept()
           print('baglanti saglandi',addr)
           msg = c.recv(1024)
           msg1="10"
           if msg == msg1:
                       led_blink()
print ('gelen var',msg)
c.close()

   
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

vitruvius

Debug yapıp baktın mı? msg ne değer alıyor mesela?

muhittin_kaplan

#2
gelen veriyi önce bir print ile bakınız ne geliyor?
msgl="10" nin hemen altına
print (msg) yazıp deneyiniz

muhittin_kaplan

if msg == msg1[0]
şeklinde deneyebilirmisiniz ?


(UDP gönderi kodunuzuda görsek daha iyi yardım edebileceğiz.)

gokhangokcen

#4
hocam pythondan kodunu şu şekilde düzenledim;
import socket
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)
GPIO.output(11,False)

def led_blink():
            while 1:
                       print("mesaj")
                       GPIO.output(11,True)
                       GPIO.output(11,False)
                       time.sleep(1)
           GPIO.cleanup()

s=socket.socket()
host = "192.168.2.10
port = 4747
s.bind((host,port))
s.listen5)
while True:
           c,addr = s.accept()
           print('got connection from',addr)
           msg = c.recv(1024)
           msg1=10
           print (msg1)
           if msg == msg1:
                       led_blink()
print ('gelen',msg)
c.close()


gelen veriler ise böyle;
got connection from ('192.168.2.8' , 49591)   #print('got connection from',addr) bu satırın karşılığı
10                                                              #print (msg1) satırının karşılığı
gelen b'10'                                                  #print ('gelen',msg) satırının karşılığı


gelen de 10 rakamı karşılaştırmaya girmesi gereken değer de 10 ama ne hikmetse led yanmıyor..
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

vitruvius


gokhangokcen

#6
3.4.2 hocam şimdi şöyle birşey daha fark ettim sanki ledi normalde de yakamıyorum gibi?
birde yukarıda udp gönderi kodunuz dediniz ama ben tcpip üzerinden giriyor sanıyorum yanılıyor muyum? bu socket kütüphanesi udp için mi ?


import socket
import time
import RPi.GPIO as GPIO

LedPin = 11

GPIO.setmode(GPIO.BOARD)
GPIO.setup(LedPin,GPIO.OUT)
GPIO.output(LedPin,LOW)

def led_blink():
            while 1:
                       print("mesaj")
                       GPIO.output(LedPin,GPIO.HIGH)
                       time.sleep(1)
                       GPIO.output(LedPin,GPIO.LOW)
                       time.sleep(1)
           GPIO.cleanup()

s=socket.socket()
host = "192.168.2.10
port = 4747
s.bind((host,port))
s.listen(5)
while True:
           c,addr = s.accept()
           print('got connection from',addr)
           msg = c.recv(1024)
           msg1=10
           print (msg1)
           if 'msg == msg1':                 #sorun buradaki tek tırnaklardan kaynaklanıyormuş
                       led_blink()
print ('gelen',msg)
GPIO.output(LedPin,GPIO.HIGH)            //normalde bağlantı geldikten sonra herhangi bir veri geldiğinde bu satırda led yanması lazım ama hata veriyor
time.sleep(1)                                       //hata aşağıda
GPIO.output(LedPin,GPIO.LOW)            // 
time.sleep(1)                                      //
c.close()


Traceback (most recent call last):
file "/home/pi/projeler/deneme.py" line 35 , in <module>
GPIO.output(LedPin,HIGH)
nameerror : name 'HIGH' ıs not defined


sorun çözüldü üstadlar sağolun. İf deyimindeki sorgulamayı ' ' kullarak yapmak gerekiyormuş. karambole dener iken buldum sorunu.



Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

muhittin_kaplan

Gelen veri b'10' sen int 10 ile sorguluyorsun ve evet ben udp sanmıştım ama TCP kullanıyormussun.

gokhangokcen

muhittin hocam düzelttiğimi sanmıştım meğer yanılmışım. Şimdi telnet üzerinden herhangi bir veri geldiğinde led blink fonksiyonuna giriyor. İşin doğrusu nasıl olmalı? Binary ya da int olarak kontrol etmek için ne yapmak gerekir?
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

muhittin_kaplan

type casting yapabilirsin (tip dönüşümü), sonra if ile karşılaştırırsın. yada doğrudan yaparsın (type ı bilmek lazım)



deger=b'10'
print (type(deger),deger)


intDeger=int(deger)
print (type(intDeger),intDeger)


stringDeger=str(deger)
print(type(stringDeger),stringDeger)


buda doğrudan
if deger==b'10':
    print ("Doğru")