Thursday, May 21, 2015

Rasberry-從Web控制GPIO

  1. Python和GPIO
  2. Python,FastCGI的和Web服務器
  3. HTML和Javascript

Python和GPIO

RPi.GPIO Python庫被捆綁了Linux的Raspbian,所以我們只使用現在讓事情變得簡單。以下Python代碼將配置的GPIO管腳7(GPIO4)輸出,然後打開它。這段代碼以root身份運行,所以你需要將它保存到一個文件,然後用運作它:

Python,FastCGI的和Web服務器

我們需要把樹莓派變成一個Web服務器,然後在其上創建一個小網站
安裝Web服務器並開始運作它使用:
sudo apt-get install lighttpd
sudo service lighttpd start
lighttpd用一個網站,在目錄/ var / WWW。我們可以建立我們自己的網站在那裡創建一個新的文件/var/www/index.html
<html>
  <head>
    <title>Hello from the Pi</title>
  </head>
  <body>
    <h1>Hello world from the Raspberry Pi</h1>
  </body>
</html>
現在,當我們點一個網頁瀏覽器在樹莓派的IP地址,如http://192.168.1.104/(替換你自己的IP地址到該網址),你應該得到的Hello World消息出現
為了我們的Python掛接到網絡服務器,我們需要安裝一個庫,與FastCGI協議幫助
sudo apt-get install python-flup
然後我們改變python腳本採從Flup而不是從它進行raw_input輸入()等,作為root用戶運行。將下面的腳本/var/www/doStuff.py,然後執行命令chmod 755這樣的網絡服務器可以執行它。 sudo chmod 755 doStuff.py
#!/usr/bin/pythonRoot
# bring in the libraries
import RPi.GPIO as G     
from flup.server.fcgi import WSGIServer 
import sys, urlparse
 
# set up our GPIO pins
G.setmode(G.BOARD)
G.setup(7, G.OUT)
 
# all of our code now lives within the app() function which is called for each http request we receive
def app(environ, start_response):
  # start our http response 
  start_response("200 OK", [("Content-Type", "text/html")])
  # look for inputs on the URL
  i = urlparse.parse_qs(environ["QUERY_STRING"])
  yield (' ') # flup expects a string to be returned from this function
  # if there's a url variable named 'q'
  if "q" in i:
    if i["q"][0] == "w": 
      G.output(7, True)   # Turn it on
    elif i["q"][0] == "s":
      G.output(7, False)  # Turn it off
 
#by default, Flup works out how to bind to the web server for us, so just call it with our app() function and let it get on with it
WSGIServer(app).run()
在/ usr / bin中/ Python的可執行文件運行的調用它的用戶。這很可能是任一“pi”用戶,如果你以交互方式使用它,或在“WWW的數據”用戶,如果是由web服務器上運行。易於配置的違反此安全的方法是將用戶的Linux的setuid的功能。這是一個潛在的危險的技術,所以需要一點心思縝密的,但很容易建立。
我們找出哪個版本的Python,然後做出一個副本命名的/ usr / bin中/ pythonRoot並使其運行setuid root的:
  pi@raspberrypi /var/www $ ls -l /usr/bin/python
  lrwxrwxrwx 1 root root 9 Jun  6  2012 /usr/bin/python -> python2.7
  pi@raspberrypi /var/www $ sudo cp /usr/bin/python2.7 /usr/bin/pythonRoot
  pi@raspberrypi /var/www $ sudo chmod u+s /usr/bin/pythonRoot
  pi@raspberrypi /var/www $ ls -l /usr/bin/pythonRoot
  -rwsr-xr-x 1 root root 2674528 Mar 17 18:16 /usr/bin/pythonRoot
最後一步是配置我們的Web服務器,它的FastCGI模塊,並告訴它在哪裡可以找到我們的Python腳本。編輯/etc/lighttpd/lighttpd.conf這樣做:
添加一行到server.modules=()的列表頂部:
"mod_fastcgi"
將下列代碼添加到該文件底部:
fastcgi.server = (
   ".py" => (
     "python-fcgi" => (
       "socket" => "/tmp/fastcgi.python.socket",
       "bin-path" => "/var/www/doStuff.py",
       "check-local" => "disable",
       "max-procs" => 1)
    )
 )
需重新啟動Web服務器
sudo service lighttpd restart 那麼你現在應該能夠把你的LED開啟和關閉通過調用像這樣的網址:http://192.168.1.104/doStuff.py?q=w和http://192.168.1.104/doStuff.py?q=s(記得替換成你的IP地址)

參考資料:
http://davstott.me.uk/index.php/2013/03/17/raspberry-pi-controlling-gpio-from-the-web/

No comments:

Post a Comment