這幾天黑客鬆比賽, 在大神的帶領下穩穩地落幕了, 雖然是第二次參加這個活動了, 但是這一次纔是我盡全力的去做自己的東西, 這裏也感謝xx大牛的指導 。
也不廢話了, 直接上圖吧
大致的一個流程就是以樹莓派作爲中間人, 利用各個模塊的特性去實現開門。 這裏其實還是有很多坑的。 比如一開始的nfc模塊, 我把所有的庫都裝完了,但是不管怎麼樣都報錯, 然後就在這裏花了很長的時間, 後來發現, nfc模塊後面有一個i2c 和spi 的開關,而我們一直開的是spi模塊的,然後撥了下開關就好了。
另外就是樹莓派的源了吧, 好慢的說。其他的攝像頭模塊,還有燈都沒有什麼難度,之前就有接觸過。總的來說這次還是準備不充分吧, 有好多東西其實可以在前一天就準備好的, 不然也不用那麼手忙腳亂了,好好吸取教訓 。 另外,這次買模塊是在是讓大牛破費了,不過還好可以報銷的。 其他的也沒有說明好說的的啦
上代碼吧,對了,我們還有一個是web app模塊, 但是代碼什麼我就不放上來了。
#!/usr/bin/env python
#coding=utf-8
import web
from datetime import *
from os import *
import httplib
urls=('/(.*)','index')
app=web.application(urls,globals())
def take_photo():
dt=datetime.now()
s= dt.strftime('%Y%m%d%H%M%S')
mypath=s+'.jpg'
system('raspistill -o '+mypath+' -t 100')
system('mv '+mypath+' /usr/share/nginx/www/'+mypath)
return mypath
class index:
def GET(self,path):
web.header('Access-Control-Allow-Origin', '*')
web.header('Access-Control-Allow-Credentials', 'true')
mypath=take_photo()
return mypath
if __name__=="__main__":
app.run()
#!/usr/bin/env python
#coding=utf-8
import RPi.GPIO as GPIO
import subprocess
from time import sleep
import re
import threading
from os import popen,system
from datetime import *
import httplib
import urllib
url='http://192.168.100.127:8080/open'
url2='http://192.168.100.127:8080/close'
url3='http://192.168.100.127:8080/uid'
pins=25
def check_user(usrid):
fp=open('user.txt','r')
d=fp.readlines()
i=0
for user in d:
if usrid == user[:-2]:
i=1
img=take_photo()
open_door()
sendMessage(usrid,img)
print 'take photo ok and open door ok'
if i==0 :
print 'you have no permission'
def open_door():
GPIO.output(pins,GPIO.HIGH)
sleep(3)
GPIO.output(pins , GPIO.LOW)
def sendMessage(usrid,img):
urlt=url3
params = urllib.urlencode({'uid': usrid,'img':img})
headers = {"Content-type": "application/x-www-form-urlencoded"
, "Accept": "text/plain"}
conn= httplib.HTTPConnection('192.168.100.127',8080)
conn.request('POST', urlt,params,headers)
conn.close()
print 'send user ok'
def check_data(data):
if not data:
return
else:
mystr='NFCID'
dizhi=data.find(mystr)
newstr=data[dizhi+8:dizhi+24]
d=re.split(r' ',newstr)
s=''.join(d[0:8])
check_user(s)
def take_photo():
dt=datetime.now()
s= dt.strftime('%Y%m%d%H%M%S')
mypath=s+'.jpg'
system('raspistill -o '+mypath+' -t 100')
system('mv '+mypath+' /usr/share/nginx/www/'+mypath)
return mypath
def read_nfc():
while True:
data=subprocess.Popen('nfc-poll' ,shell=True,stdout=subprocess.PIPE)
(stdoutput,errout)=data.communicate()
check_data(stdoutput)
def read_server():
while True:
conn= httplib.HTTPConnection('192.168.100.127',8080)
conn.request(method='GET', url=url)
reponse = conn.getresponse()
res = reponse.read()
if res[0]=='1':
print 'door open'
conn.request(method='GET' ,url=url2)
conn.close()
sleep(1)
def read_finger():
print ' this is your finger'
sleep(20)
def nfc_start():
system('nfc-list')
sleep(1)
def main():
global url,url2,url3,pins
GPIO.setmode(GPIO.BCM)
GPIO.setup(pins,GPIO.OUT)
nfc_start()
sleep(1)
t1=threading.Thread(target=read_nfc).start()
t2=threading.Thread(target=read_server).start()
#t3=threading.Thread(target=read_finger).start()
if __name__ == '__main__':
main()
對了,還有一個指紋識別模塊的,但是大牛說要搞什麼調試, 時間會來不及,於是就沒做了。 然後,還有一個大坑是我們比賽的時候, 大牛忘記開另外一個模塊, 導致我們後來的演示不是很成功,我也是醉了,不過看到自己努力的成果,還是挺開心的。