Kamera-modulen till Raspberry är här!

Permalänk
Medlem
Skrivet av zonar:

Hojta till om du vill bli av med en
/z

Ja jo fast en kostar ju ungefär som porto inom Sverige

Visa signatur

Solen i africa! Hjälp snabbt. Tävling i klassen!
Det var High noon.
Om solen i Africa en truckförare kommer från East till Weast på huvudvägen. och exact vid eqvatorn vid Africa. Landskapet är totalt slät. På en tidpunkt var solen så ett par telestolpar gjorde så att det blev skugga.
3 gissar jag på, men kan inte förklara?

Permalänk
Medlem
Skrivet av zonar:

Strålande! Nu fick jag ett fint exempel på hur jag ska fixa till problemet med att skicka ett e-mail!

Dock tror jag att jag ska använda min internetoperatörs smtp-server för att då borde jag slippa hårdkoda in mitt lösenor till gmail!

Fantiastikt bra när man kan dela med sig av lite kodsnuttar!

För övrigt, är det någon som har någon idé om hur jag skulle kunna trycka på en knapp på min hemsida, för att skicka ett kommando till Pi som jag kan aggera på?

mvh
/z

Är nog en bättre idé, fick bara det här att funka och har inte orkat ändra det.

Jag kör lighttpd och en html-sida som gör ajax-anrop mot en php-sida och använder mig av:

shell_exec('bash /sökvätillbashskript');

Om du vill ha en exakt kopia av sidan jag har gjort så kan jag rensa den på "hemliga" saker och skicka dig.

Såhär ser den ut. Inte riktigt klar då både av/på-knapparna syns och den första knappen inte gör något. Den andra sätter igång min server och den tredje visar vädret som RPin hämtar från ett rss-flöde.

Visa signatur

Mb: MSI Z77A-G43 ATX | Ram: Crucial Ballistix Sport 8GB 1600Mhz | CPU: Intel Core i5 3450 3,1Ghz (Ivy Bridge) | Chassi: Cooler Master Elite 430 Svart | Psu: Fractal Design Integra 500W | Grafikkort: PowerColor Radeon HD7970 | Hdd: 1TB Seagate Barracuda | SSD: Samsung EVO Basic 256gb | Monitor: HP Compaq LA2306x 23'' & (random) Acer 19''
Diverse projekt

Permalänk
Medlem
Skrivet av Zhirgoyt:

Är nog en bättre idé, fick bara det här att funka och har inte orkat ändra det.

Jag kör lighttpd och en html-sida som gör ajax-anrop mot en php-sida och använder mig av:

shell_exec('bash /sökvätillbashskript');

Om du vill ha en exakt kopia av sidan jag har gjort så kan jag rensa den på "hemliga" saker och skicka dig.

Såhär ser den ut. Inte riktigt klar då både av/på-knapparna syns och den första knappen inte gör något. Den andra sätter igång min server och den tredje visar vädret som RPin hämtar från ett rss-flöde.

http://i.imgur.com/BvT8AOG.png

Det ser ut som en smidig och trevlig lösning som absolut är ett alternativ! Dock måste jag i så fall även köra webserver ockå på Pi, ska fundera på om det är rätt väg.

Det är riktigt kul när man är några som kan hjälpa varandra. Synd att det är så långt till Gbg, annars hade jag gärna kommit förbi pi-coding eventet!

Satt och funderade lite till... om man anväder python och threading så kanske man kan skapa en separat tråd för kommunikation. Då kan man få python att lyssna efter kontroll-meddelanden.

På min webserver som körs på min server har jag php och apache just nu, skulle man kunna generera ett kommando från hemsidan som skickas till raspberryn?

Då tror jag att jag skulle kunna styra allt beteende i python nämligen?

mvh
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av zonar:

Det ser ut som en smidig och trevlig lösning som absolut är ett alternativ! Dock måste jag i så fall även köra webserver ockå på Pi, ska fundera på om det är rätt väg.

Det är riktigt kul när man är några som kan hjälpa varandra. Synd att det är så långt till Gbg, annars hade jag gärna kommit förbi pi-coding eventet!

Satt och funderade lite till... om man anväder python och threading så kanske man kan skapa en separat tråd för kommunikation. Då kan man få python att lyssna efter kontroll-meddelanden.

På min webserver som körs på min server har jag php och apache just nu, skulle man kunna generera ett kommando från hemsidan som skickas till raspberryn?

Då tror jag att jag skulle kunna styra allt beteende i python nämligen?

mvh
/z

Jo, det är roligt när man kan hjälpa varandra. Synd att du inte kan komma förbi... men om ett par år har det växt sig så stort att du kör vi en nationell träff istället.

Jag tror inte riktigt jag är med på hur du menar. Var skulle python lyssna mot? Jag vet att man kan få den att kolla efter meddelanden som kommer in (gTalk/jabber) eller mail, men du menar ett kommando som skicka via din webserver till RPin på något annat sätt? Om du skickar det "direkt" tror jag att du lämnar ett sju-helvetes säkerhetshål... men jag är inte expert på sånt.

Visa signatur

Mb: MSI Z77A-G43 ATX | Ram: Crucial Ballistix Sport 8GB 1600Mhz | CPU: Intel Core i5 3450 3,1Ghz (Ivy Bridge) | Chassi: Cooler Master Elite 430 Svart | Psu: Fractal Design Integra 500W | Grafikkort: PowerColor Radeon HD7970 | Hdd: 1TB Seagate Barracuda | SSD: Samsung EVO Basic 256gb | Monitor: HP Compaq LA2306x 23'' & (random) Acer 19''
Diverse projekt

Permalänk
Medlem
Skrivet av Zhirgoyt:

Jo, det är roligt när man kan hjälpa varandra. Synd att du inte kan komma förbi... men om ett par år har det växt sig så stort att du kör vi en nationell träff istället.

Jag tror inte riktigt jag är med på hur du menar. Var skulle python lyssna mot? Jag vet att man kan få den att kolla efter meddelanden som kommer in (gTalk/jabber) eller mail, men du menar ett kommando som skicka via din webserver till RPin på något annat sätt? Om du skickar det "direkt" tror jag att du lämnar ett sju-helvetes säkerhetshål... men jag är inte expert på sånt.

Jag tänkte att min hemsida genererar ett meddelande till Raspberryn, som den lyssnar på. Tanken är att inte exponera Raspberryn mot internet, webserver går på LAN och den skickar meddelandet till raspberryn. Raspberryn FTPar sedan tillbaka den nya bilden så att den blir publicerad på webservern.

Jag ser inte omdelbart risken med att låta Python lyssna efter fördefinierad kommandon. Kommandot tas emot som en raw string och sedan körs en if/elseif sats för att bestämma vad som ska göras.

Du får gärna utveckla hur du tänker med säkerhetsproblemet.

Kan man få php att skicka något sorts meddelande om man trycker på en knapp?

mvh
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av zonar:

Jag tänkte att min hemsida genererar ett meddelande till Raspberryn, som den lyssnar på. Tanken är att inte exponera Raspberryn mot internet, webserver går på LAN och den skickar meddelandet till raspberryn. Raspberryn FTPar sedan tillbaka den nya bilden så att den blir publicerad på webservern.

Jag ser inte omdelbart risken med att låta Python lyssna efter fördefinierad kommandon. Kommandot tas emot som en raw string och sedan körs en if/elseif sats för att bestämma vad som ska göras.

Du får gärna utveckla hur du tänker med säkerhetsproblemet.

Kan man få php att skicka något sorts meddelande om man trycker på en knapp?

mvh
/z

Nej, jag menade bara att om man kör med shell_exec så kan man säkert injecta lite vad man vill om man bara hackar lite och då vill man ju inte ha den öppen mot internet, men om du kör på sättet du skrev skall det väl inte vara några problem.

Det beror lite vad för sorts meddelande du menar? Vad är det Raspberryn skall lyssna på? Menar du något slags "lan-meddelande" eller typ en gmail?

Visa signatur

Mb: MSI Z77A-G43 ATX | Ram: Crucial Ballistix Sport 8GB 1600Mhz | CPU: Intel Core i5 3450 3,1Ghz (Ivy Bridge) | Chassi: Cooler Master Elite 430 Svart | Psu: Fractal Design Integra 500W | Grafikkort: PowerColor Radeon HD7970 | Hdd: 1TB Seagate Barracuda | SSD: Samsung EVO Basic 256gb | Monitor: HP Compaq LA2306x 23'' & (random) Acer 19''
Diverse projekt

Permalänk
Medlem
Skrivet av Zhirgoyt:

Nej, jag menade bara att om man kör med shell_exec så kan man säkert injecta lite vad man vill om man bara hackar lite och då vill man ju inte ha den öppen mot internet, men om du kör på sättet du skrev skall det väl inte vara några problem.

Det beror lite vad för sorts meddelande du menar? Vad är det Raspberryn skall lyssna på? Menar du något slags "lan-meddelande" eller typ en gmail?

Jag tänkte mig som ett LAN meddelade. Det går både att ta emot och skicka med socket-modulen.

Ta emot signalen på Pi med python fixar jag nog. Värre är hur jag med Apache och php ska kunna skicka något.

Alternativt kan jag köra python via php exec(), på webservern beroende på vad som ska göras körs olika sprit.

Har googlat lite men inte hittat en simpel lösning.

Mvh z

Skickades från m.sweclockers.com

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av zonar:

Jag tänkte mig som ett LAN meddelade. Det går både att ta emot och skicka med socket-modulen.

Ta emot signalen på Pi med python fixar jag nog. Värre är hur jag med Apache och php ska kunna skicka något.

Alternativt kan jag köra python via php exec(), på webservern beroende på vad som ska göras körs olika sprit.

Har googlat lite men inte hittat en simpel lösning.

Mvh z

Skickades från m.sweclockers.com

UDP-sockets kanske kan vara något? Verkar ganska enkelt:

För PHP: http://www.binarytides.com/udp-socket-programming-in-php/
För Python: http://wiki.python.org/moin/UdpCommunication

Visa signatur

Solen i africa! Hjälp snabbt. Tävling i klassen!
Det var High noon.
Om solen i Africa en truckförare kommer från East till Weast på huvudvägen. och exact vid eqvatorn vid Africa. Landskapet är totalt slät. På en tidpunkt var solen så ett par telestolpar gjorde så att det blev skugga.
3 gissar jag på, men kan inte förklara?

Permalänk
Medlem
Skrivet av glemmy:

UDP-sockets kanske kan vara något? Verkar ganska enkelt:

För PHP: http://www.binarytides.com/udp-socket-programming-in-php/
För Python: http://wiki.python.org/moin/UdpCommunication

Det där ser mycket lovande ut! Ska se om jag hinner prova lite kod nästa vecka! Då kan man med olika knappar fråga efter olika uppgifter, som att ta en bild, nuvarande temperatur etc....

Endless of possibilities!! =D

EDIT:
Motsvarande med TCP istället: http://www.binarytides.com/php-socket-programming-tutorial/

Edit 2:
Nu har jag lyckats skicka "hello world" från Web-servern till Pi!

Ska se om jag får till att den svarar också!

Edit 3:
Nu kan jag kommunicera åt bägge hållen. Ny trycker jag på en knapp på Web-servern. Då skickas kommandot till Pi som tar en bild och skickar den med ftp till Web-servern.

Bilden på hemsidan uppdateras!

Ska lägga upp koden när jag kan, det är inte optimalt än, men funkar. Behöver snygga upp sidan på serversidan.

Mvh
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem

Då var det dags att lägga upp lite mer kod:

Det fungerar helt ok nu, har provkört det några dagar så det är inte helt ostabilt i alla fall. Grundfukntionaliteten är där men det går helt klart att slipa lite på lösningen. Det är framförallt på serversidan det kan presenteras lite snyggare.... men det fungerar.

Nu måste man skriva sitt kommando, trycka på Skicka. Då anropas php-skriptet som visar information på skärmen. Sedan måste man gå tillbaka manuellt till föregående sida och manuellt uppdatera bilden. Det fungerar men inte snyggt som sagt.

På Pi:n fungerar det utmärkt, den kollar vad man skickade och om man skrev "photo" så tar den en bild och lägger upp på webservern.

Python programmet startas med sudo och nohup för att den ska fungera även efter att jag har stängt terminalen.

Det blev lite kod så jag lägger en spoiler för att det inte ska bli så lååååångt...

Pi Python:

# Import required libraries import ftplib,os,sys,time,socket from subprocess import call import RPi.GPIO as GPIO class netCam(): def __init__(self): self.file='test2.jpg' # Initialize LEDs try: self.initGPIO() except: raise sys.exit("ERROR: Could not initiate GPIO!") # This LED is ON for LED in self.LedSeq: GPIO.output(LED, True) time.sleep(0.2) GPIO.output(11, True) GPIO.output(9, True) # Create a TCP/IP socket self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Bind the socket to the port server_address = ('', 10002) print >>sys.stderr, 'starting up on %s port %s' % server_address self.sock.bind(server_address) # Listen for incoming connections self.sock.listen(1) # -------------------------------------------------------------------------------- def initGPIO(self): try: # Tell GPIO library to use GPIO references GPIO.setmode(GPIO.BCM) # Set Switch GPIO as input GPIO.setup(7 , GPIO.IN) # List of LED GPIO numbers self.LedSeq = [4,17,22,10,9,11] # Set up the GPIO pins as outputs and set False print "Setup Outputs" for x in range(6): GPIO.setup(self.LedSeq[x], GPIO.OUT) GPIO.output(self.LedSeq[x], False) except: print " ERROR: There was a problem with initaion of the GPIOs" raise # -------------------------------------------------------------------------------- def takeImage(self): try: GPIO.output(22, True) GPIO.output(4, False) # Remove the old file if present if os.path.isfile(self.file): os.remove(self.file) # Take the photo call(['/usr/bin/raspistill','-o',self.file,'-t','10','-f','-q','10']) except: print " ERROR: There was a problem with taking the image" GPIO.output(22, False) GPIO.output(4, True) #raise # -------------------------------------------------------------------------------- def sendFile(self): try: GPIO.output(10, True) GPIO.output(17, False) sftp=ftplib.FTP_TLS() print " Connecting,", sftp.connect('192.168.10.5',21,10) print "-Done \n Setup secure control connection,", sftp.auth() print "-Done \n Setup secure data connection,", sftp.prot_p() print "-Done \n Login,", sftp.login('x','x') print "-Done" #sftp.retrlines('LIST') sftp.cwd('www') #sftp.retrlines('LIST') sftp.sendcmd("TYPE I") fileHandle=open(self.file) sftp.storbinary('STOR %s' %self.file,fileHandle) sftp.close() except: print " ERROR: There was a problem with uploading the image" GPIO.output(10, False) GPIO.output(17, True) #raise # -------------------------------------------------------------------------------- def waitForConnection(self): def connection(): # Wait for a connection print >>sys.stderr, 'waiting for a connection' connection, client_address = self.sock.accept() try: print >>sys.stderr, 'connection from', client_address # Receive the command, only accept ONE message of 1024 bytes data = connection.recv(1024) print >>sys.stderr, 'received "%s"' % data if data=='photo': connection.sendall('Pi is taking a photo') takePhoto=True elif data: print >>sys.stderr, 'sending data back to the client' data='Greeings from PI, You sent: %s' %data connection.sendall(data) takePhoto=False except: takePhoto=False finally: # Clean up the connection connection.close() return takePhoto while True: if connection(): break else: pass # -------------------------------------------------------------------------------- # M A I N # -------------------------------------------------------------------------------- try: cB=netCam() # Initialize LEDs print "Initialize LEDs" try: cB.initGPIO() except: sys.exit("ERROR: Could not initiate!") time.sleep(0.5) GPIO.output(11, True) GPIO.output(9, True) # Loop until users quits with CTRL-C print "Ready to take image" while True: # if GPIO.input(7): cB.waitForConnection() cB.takeImage() cB.sendFile() print " -Done" GPIO.output(22, False) GPIO.output(10, False) except KeyboardInterrupt: print " You pressed Ctrl-C" except: print "ERROR: An error occured" raise finally: # Reset GPIO settings GPIO.cleanup()

På webservern kör jag med php som sagt, i conf.php måste du aktivera sockets, annars kan du inte använda dig av det i koden.
Web-server php:

<html> <head> </head> <body> <?php $message=$_POST['message']; echo "<html>"; print("<br>Start php-script <br>"); echo "</html>"; // The recieved message echo "Typed message: $message"; // Socket error handeling if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Couldn't create socket: [$errorcode] $errormsg \n"); } echo "<html>"; print("<br>Socket created <br>"); echo "</html>"; // Establish a connection if(!socket_connect($sock , '192.168.10.11' , 10002)) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); echo "<html>"; print("Connection to Pi could not be established <br>"); echo "</html>"; die("Could not connect: [$errorcode] $errormsg \n"); } echo "<html>"; print("Connection established <br>"); echo "</html>"; //Send the message to the server if( ! socket_send ( $sock , $message , strlen($message) , 0)) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Could not send data: [$errorcode] $errormsg \n"); } echo "<html>"; print("Message send successfully <br> Waiting for response <br>"); echo "</html>"; //Now receive reply from server if(socket_recv ( $sock , $buf , 2045 , MSG_WAITALL ) === FALSE) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Could not receive data: [$errorcode] $errormsg \n"); } //print the received message echo "Recieved message: $buf <br>"; echo "<html>"; print("End php-script <br>"); echo "</html>"; ?> </body> </html>

Denna koden anropas av en html-sida:

<html> <head> <title>Take a bite of Pi</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <p> </p> <p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>Send a message to my Pi:</strong></font></p> <form name ="resultat" method="POST" action="index.php"> <div align="left"> <p><font face="Verdana, Arial, Helvetica, sans-serif">Enter message:</font> <input type="text" name="message" size="14"> <input type="submit" value="Send msg"> </p> <br> <font face="Verdana, Arial, Helvetica, sans-serif"><p align=left><img src="test2.jpg" width="400" height="300"></font> </div> </form> </body> </html>

Dold text

Som sagt det funkar men på serversidan finns garanterat utrymme för förbättring!

Hej hopp!
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av zonar:

Då var det dags att lägga upp lite mer kod:

Det fungerar helt ok nu, har provkört det några dagar så det är inte helt ostabilt i alla fall. Grundfukntionaliteten är där men det går helt klart att slipa lite på lösningen. Det är framförallt på serversidan det kan presenteras lite snyggare.... men det fungerar.

Nu måste man skriva sitt kommando, trycka på Skicka. Då anropas php-skriptet som visar information på skärmen. Sedan måste man gå tillbaka manuellt till föregående sida och manuellt uppdatera bilden. Det fungerar men inte snyggt som sagt.

På Pi:n fungerar det utmärkt, den kollar vad man skickade och om man skrev "photo" så tar den en bild och lägger upp på webservern.

Python programmet startas med sudo och nohup för att den ska fungera även efter att jag har stängt terminalen.

Det blev lite kod så jag lägger en spoiler för att det inte ska bli så lååååångt...

Pi Python:

# Import required libraries import ftplib,os,sys,time,socket from subprocess import call import RPi.GPIO as GPIO class netCam(): def __init__(self): self.file='test2.jpg' # Initialize LEDs try: self.initGPIO() except: raise sys.exit("ERROR: Could not initiate GPIO!") # This LED is ON for LED in self.LedSeq: GPIO.output(LED, True) time.sleep(0.2) GPIO.output(11, True) GPIO.output(9, True) # Create a TCP/IP socket self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Bind the socket to the port server_address = ('', 10002) print >>sys.stderr, 'starting up on %s port %s' % server_address self.sock.bind(server_address) # Listen for incoming connections self.sock.listen(1) # -------------------------------------------------------------------------------- def initGPIO(self): try: # Tell GPIO library to use GPIO references GPIO.setmode(GPIO.BCM) # Set Switch GPIO as input GPIO.setup(7 , GPIO.IN) # List of LED GPIO numbers self.LedSeq = [4,17,22,10,9,11] # Set up the GPIO pins as outputs and set False print "Setup Outputs" for x in range(6): GPIO.setup(self.LedSeq[x], GPIO.OUT) GPIO.output(self.LedSeq[x], False) except: print " ERROR: There was a problem with initaion of the GPIOs" raise # -------------------------------------------------------------------------------- def takeImage(self): try: GPIO.output(22, True) GPIO.output(4, False) # Remove the old file if present if os.path.isfile(self.file): os.remove(self.file) # Take the photo call(['/usr/bin/raspistill','-o',self.file,'-t','10','-f','-q','10']) except: print " ERROR: There was a problem with taking the image" GPIO.output(22, False) GPIO.output(4, True) #raise # -------------------------------------------------------------------------------- def sendFile(self): try: GPIO.output(10, True) GPIO.output(17, False) sftp=ftplib.FTP_TLS() print " Connecting,", sftp.connect('192.168.10.5',21,10) print "-Done \n Setup secure control connection,", sftp.auth() print "-Done \n Setup secure data connection,", sftp.prot_p() print "-Done \n Login,", sftp.login('x','x') print "-Done" #sftp.retrlines('LIST') sftp.cwd('www') #sftp.retrlines('LIST') sftp.sendcmd("TYPE I") fileHandle=open(self.file) sftp.storbinary('STOR %s' %self.file,fileHandle) sftp.close() except: print " ERROR: There was a problem with uploading the image" GPIO.output(10, False) GPIO.output(17, True) #raise # -------------------------------------------------------------------------------- def waitForConnection(self): def connection(): # Wait for a connection print >>sys.stderr, 'waiting for a connection' connection, client_address = self.sock.accept() try: print >>sys.stderr, 'connection from', client_address # Receive the command, only accept ONE message of 1024 bytes data = connection.recv(1024) print >>sys.stderr, 'received "%s"' % data if data=='photo': connection.sendall('Pi is taking a photo') takePhoto=True elif data: print >>sys.stderr, 'sending data back to the client' data='Greeings from PI, You sent: %s' %data connection.sendall(data) takePhoto=False except: takePhoto=False finally: # Clean up the connection connection.close() return takePhoto while True: if connection(): break else: pass # -------------------------------------------------------------------------------- # M A I N # -------------------------------------------------------------------------------- try: cB=netCam() # Initialize LEDs print "Initialize LEDs" try: cB.initGPIO() except: sys.exit("ERROR: Could not initiate!") time.sleep(0.5) GPIO.output(11, True) GPIO.output(9, True) # Loop until users quits with CTRL-C print "Ready to take image" while True: # if GPIO.input(7): cB.waitForConnection() cB.takeImage() cB.sendFile() print " -Done" GPIO.output(22, False) GPIO.output(10, False) except KeyboardInterrupt: print " You pressed Ctrl-C" except: print "ERROR: An error occured" raise finally: # Reset GPIO settings GPIO.cleanup()

På webservern kör jag med php som sagt, i conf.php måste du aktivera sockets, annars kan du inte använda dig av det i koden.
Web-server php:

<html> <head> </head> <body> <?php $message=$_POST['message']; echo "<html>"; print("<br>Start php-script <br>"); echo "</html>"; // The recieved message echo "Typed message: $message"; // Socket error handeling if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Couldn't create socket: [$errorcode] $errormsg \n"); } echo "<html>"; print("<br>Socket created <br>"); echo "</html>"; // Establish a connection if(!socket_connect($sock , '192.168.10.11' , 10002)) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); echo "<html>"; print("Connection to Pi could not be established <br>"); echo "</html>"; die("Could not connect: [$errorcode] $errormsg \n"); } echo "<html>"; print("Connection established <br>"); echo "</html>"; //Send the message to the server if( ! socket_send ( $sock , $message , strlen($message) , 0)) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Could not send data: [$errorcode] $errormsg \n"); } echo "<html>"; print("Message send successfully <br> Waiting for response <br>"); echo "</html>"; //Now receive reply from server if(socket_recv ( $sock , $buf , 2045 , MSG_WAITALL ) === FALSE) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Could not receive data: [$errorcode] $errormsg \n"); } //print the received message echo "Recieved message: $buf <br>"; echo "<html>"; print("End php-script <br>"); echo "</html>"; ?> </body> </html>

Denna koden anropas av en html-sida:

<html> <head> <title>Take a bite of Pi</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <p> </p> <p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>Send a message to my Pi:</strong></font></p> <form name ="resultat" method="POST" action="index.php"> <div align="left"> <p><font face="Verdana, Arial, Helvetica, sans-serif">Enter message:</font> <input type="text" name="message" size="14"> <input type="submit" value="Send msg"> </p> <br> <font face="Verdana, Arial, Helvetica, sans-serif"><p align=left><img src="test2.jpg" width="400" height="300"></font> </div> </form> </body> </html>

Dold text

Som sagt det funkar men på serversidan finns garanterat utrymme för förbättring!

Hej hopp!
/z

Oj, det var inte lite kod. Om det funkar för dig är det ju bra, men borde det inte gå att göra enklare? Jag har ett par rader javascript, ett par rader php och sedan ett python-script på pajen. Man trycker på knappen, pajen tar ett kort och uppdaterar sidan automatiskt. Å andra sidan vet jag inte hur säkert det är, så ditt sätt kanske är bättre ändå.

Kan du förklara lite hur koden funkar? Har inte programmerat med sockets något.

Visa signatur

Mb: MSI Z77A-G43 ATX | Ram: Crucial Ballistix Sport 8GB 1600Mhz | CPU: Intel Core i5 3450 3,1Ghz (Ivy Bridge) | Chassi: Cooler Master Elite 430 Svart | Psu: Fractal Design Integra 500W | Grafikkort: PowerColor Radeon HD7970 | Hdd: 1TB Seagate Barracuda | SSD: Samsung EVO Basic 256gb | Monitor: HP Compaq LA2306x 23'' & (random) Acer 19''
Diverse projekt

Permalänk
Medlem
Skrivet av Zhirgoyt:

Oj, det var inte lite kod. Om det funkar för dig är det ju bra, men borde det inte gå att göra enklare? Jag har ett par rader javascript, ett par rader php och sedan ett python-script på pajen. Man trycker på knappen, pajen tar ett kort och uppdaterar sidan automatiskt. Å andra sidan vet jag inte hur säkert det är, så ditt sätt kanske är bättre ändå.

Kan du förklara lite hur koden funkar? Har inte programmerat med sockets något.

Japp det ska jag försöka göra.

Python-koden går helt klart att kondensera lite. Det är med lite blinkade lysdioder som statusmeddelande. Det är ju inte helt nödvändigt kanske.
Dock tror jag inte att jag kan minska koden så mycket på web-servern. Det jag kan skala bort är en bekräftelse från Pi att den tänker göra något.

Det blir lite stressigt nu över midsommar såklart men jag ska försöka återkomma med en barskrapad Python-kod som bara gör det absolut nödvändiga.

Sockets, tja jag är inte någon expert på den själv heller men tänk så här kanske:

# Skapa en instance, AF_INET betyder att det ska vara en IP v4 och SOCK_STREAM att den ska vara av typen TCP
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind the socket to the port
server_address = ('', 10002)
Startar upp servern och låt den binda till alla ip-adresser ' ' = alla, 127.0.0.1=local host endast, 192.168.1.2=en specifik adapter
self.sock.bind(server_address)
# Lyssna efter inkommande anslutningar. Acceptera att 1 anslutning köas
self.sock.listen(1)
# Sitt och vänta på att någon ansluter
connection, client_address = self.sock.accept()
# När någon ansluter, läs de 1024 första bitarna i nätverksadapterns cashe-minne, strunta i resten... för mina meddelanden är korta
data = connection.recv(1024)
# Kolla vad som tas emot och om det är strängen 'photo' så ska funktionen retunera värdet True i slutändan
if data=='photo':
# Skicka tillbaka till php-servern att Pi gör något. lite varning för sendall(), om du får ett fel så vet du inte hur mycket du har skickat om du behöver sända om datat
connection.sendall('Pi is taking a photo')
# Stäng anslutningen
connection.close()

Mer än så behövs faktiskt inte för två-vägs kommunikation!

mvh
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av Zhirgoyt:

Oj, det var inte lite kod. Om det funkar för dig är det ju bra, men borde det inte gå att göra enklare? Jag har ett par rader javascript, ett par rader php och sedan ett python-script på pajen. Man trycker på knappen, pajen tar ett kort och uppdaterar sidan automatiskt. Å andra sidan vet jag inte hur säkert det är, så ditt sätt kanske är bättre ändå.

Kan du förklara lite hur koden funkar? Har inte programmerat med sockets något.

Här kommer en kortare version av koden utan lysdioder och GPIO. Ska göra en edit lite senare där jag går igenom koden.

mvh
zonar

# Import required libraries import ftplib,os,sys,time,socket from subprocess import call class netCam(): def __init__(self): self.file='test2.jpg' # Create a TCP/IP socket self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Bind the socket to the port server_address = ('', 10001) print >>sys.stderr, 'starting up on %s port %s' % server_address self.sock.bind(server_address) # Listen for incoming connections self.sock.listen(1) # -------------------------------------------------------------------------------- def takeImage(self): try: # Remove the old file if present if os.path.isfile(self.file): os.remove(self.file) # Take the photo call(['/usr/bin/raspistill','-o',self.file,'-t','10','-f']) except: print " ERROR: There was a problem with taking the image" # -------------------------------------------------------------------------------- def sendFile(self): try: sftp=ftplib.FTP_TLS() print " Connecting,", sftp.connect('192.168.10.5',21,10) print "-Done \n Setup secure control connection,", sftp.auth() print "-Done \n Setup secure data connection,", sftp.prot_p() print "-Done \n Login,", sftp.login('test','test') print "-Done" #sftp.retrlines('LIST') sftp.cwd('www') #sftp.retrlines('LIST') sftp.sendcmd("TYPE I") fileHandle=open(self.file) sftp.storbinary('STOR %s' %self.file,fileHandle) sftp.close() except: print " ERROR: There was a problem with uploading the image" # -------------------------------------------------------------------------------- def waitForConnection(self): def connection(): # Wait for a connection print >>sys.stderr, 'waiting for a connection' connection, client_address = self.sock.accept() try: takePhoto=False print >>sys.stderr, 'connection from', client_address # Receive the command, only accept ONE message of 1024 bytes data = connection.recv(1024) print >>sys.stderr, 'received "%s"' % data if data=='photo': connection.sendall('Pi is taking a photo') takePhoto=True else: print >>sys.stderr, 'sending data back to the client' data='Greeings from PI, You sent: %s' %data connection.sendall(data) takePhoto=False finally: # Clean up the connection connection.close() return takePhoto while True: if connection(): break else: pass # -------------------------------------------------------------------------------- # M A I N # -------------------------------------------------------------------------------- try: cB=netCam() # Loop until users quits with CTRL-C print "Ready to take image" while True: cB.waitForConnection() cB.takeImage() cB.sendFile() print " -Done" except KeyboardInterrupt: print " You pressed Ctrl-C" except: print "ERROR: An error occured" raise finally: pass

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]