Raspberry Pi / Python / Socket (Læst 3392x)

Offline Jakobsen

  • Højpas filter
  • *****
  • Indlæg: 302
  • Antal brugbare Indlæg: 45
    • Vis profil
Raspberry Pi / Python / Socket
« Dato: April 08, 2015, 20:58:59 »
Hej
Jeg er igang med et Raspberry Pi projekt hvor jeg har følgende;

En Raspberry pi med i2c gpio expander hvor jeg på 8 bit har led's og 8 andre har push swithces
Jeg ønsker at styre led over IP fra en PC og bruger Socket + et TCP program på PC der kan sende cmd til Pi'en

Jeg har lavet et test program i python og det fungerer i de basale dele
Det venter på en connection og når jeg har connected så kan jeg sende simple cmd's som så tænder led's eller slukker
jeg kan også læse switches.... MEN kun når jeg spørger efter status med "sw" cmd

Problemet er at jeg ønsker at software læser switch status hele tiden så man kan detektere om nogen trykker på en knap, men hvis jeg læser switch status ved den linie der hedder

       data = c.recv(1024)

så læser den kun hver gang det kommer noget data fra PC
med andre ord så "hænger" koden her indtil der kommer data

Jeg kunne godt tænke mig at hvis ikke der er data så kan jeg læse switche alligevel og sende data til PC hvis nogen har trykket på en knap

Håber det giver mening og at der er en der har rodet mere med python end jeg har :-)

Kode:
from socket import *
 ## Import GPIO library
import RPi.GPIO as GPIO
import time ## Import 'time' library. Allows us to use 'sleep'
import serial
import smbus

bus = smbus.SMBus(1)    # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)

DEVICE = 0x20      #7 bit address (will be left shifted to add the read$
IODIRA = 0x00 # Pin direction register
OLATA  = 0x14 # Register for outputs
GPIOA  = 0x12 # Register for inputs

# Set all GPA pins as outputs by setting
# all bits of IODIRA register to 0
bus.write_byte_data(DEVICE,IODIRA,0x00)

# Set output all 7 output bits to 0
bus.write_byte_data(DEVICE,OLATA,0)

#port1 = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=3.0)
port1 = serial.Serial("/dev/ttyAMA0", baudrate=250000, timeout=3.0)

 # Use physical pin numbers
GPIO.setmode(GPIO.BOARD)
#GPIO.setmode(GPIO.BCM)
 # Set up header pin 7 (GPIO7) as an output
GPIO.setup(12,GPIO.OUT)
host = "192.168.1.93"
print host
port = 7777
s = socket(AF_INET, SOCK_STREAM)
#s.setblocking(0)
print "Socket Made"
s.bind((host,port))
print "Socket Bound"
s.listen(5)
print "Listening for connections..."
port1.write("\r\nHello Wold:")

while True:
    c, addr = s.accept() # Establish connection with client.
    print 'Got connection from', addr
    c.send('Thank you for connecting')
    while True:
        data = c.recv(1024)

        if(data == "sw" ):
  # Read state of GPIOA register
         MySwitch = bus.read_byte_data(DEVICE,GPIOA)
         if MySwitch & 0b10000000 == 0b10000000:
          print "Switch 1 was pressed!"
         if MySwitch & 0b01000000 == 0b01000000:
          print "Switch 2 was pressed!"
         else:
          print "NOT pressed"

        if(data[0:3] == "led" ):
            print 'led'
            bus.write_byte_data(DEVICE,OLATA,ord(data[3]))
            print data

        if(data == "on" ):
            print 'pin 12 on'
            GPIO.output(12,True)

        elif(data == 'off' ):
            print 'pin 12 off'
            GPIO.output(12,False) ## Turn off GPIO pin 7

        elif(data == 'close' ):
            print 'closing connection'
            c.close()
            break

        elif(data == 'exit' ):
            print 'closing program'
            c.close()
            s.close()
            break
        else:
            print 'none'
print 'break'
GPIO.cleanup()
c.close()
s.close()

 

Offline Jakobsen

  • Højpas filter
  • *****
  • Indlæg: 302
  • Antal brugbare Indlæg: 45
    • Vis profil
Sv: Raspberry Pi / Python / Socket
« Svar #1 Dato: April 08, 2015, 22:40:18 »
Har selv fundet noget info på problemet

"socket.recv is a blocking call"

http://stackoverflow.com/questions/7174927/when-does-socket-recvrecv-size-return

Så må jeg se om jeg kan får det lavet un-blocking på en smart måde

Gode ideer modtages gerne :-)

 

Offline asm7100

  • Højpas filter
  • *****
  • Indlæg: 309
  • Antal brugbare Indlæg: 17
  • Hvis det ikke kan gøres så gør det alligevel.
    • Vis profil
Sv: Raspberry Pi / Python / Socket
« Svar #2 Dato: April 08, 2015, 23:14:30 »
Hvis du bruger en mcp23017 eller mcp23008 har de et interrupt ben, dette ben kunne du jo så læse og hvis der sker noget på det, kan du læse selve porten.
Bare lige min 5cent
MVH
Allan Madsen

 

Offline Jakobsen

  • Højpas filter
  • *****
  • Indlæg: 302
  • Antal brugbare Indlæg: 45
    • Vis profil
Sv: Raspberry Pi / Python / Socket
« Svar #3 Dato: April 09, 2015, 00:02:49 »
Jeg bruger mcp23017 og vil faktisk udvide til 5 stk når jeg har fået det til at virke.

Men selv om jeg connecter int benet til en gpio på Pi så kan jeg jo ikke læse i python hvis jeg er låst indtil der kommer data  til socket fra PC

Der er en del skriv om non blocking sockets på nettet
men pt får jeg en fejl når jeg bruger s.setblocking(0)

socket.error: [Errno 11] Resource temporarily unavailable

Den skal man så undertrykke og det er ikke lykkedes endnu