基於樹莓派的門禁系統
阿新 • • 發佈:2019-01-03
這幾天黑客鬆比賽, 在大神的帶領下穩穩地落幕了, 雖然是第二次參加這個活動了, 但是這一次才是我盡全力的去做自己的東西, 這裡也感謝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()
對了,還有一個指紋識別模組的,但是大牛說要搞什麼除錯, 時間會來不及,於是就沒做了。 然後,還有一個大坑是我們比賽的時候, 大牛忘記開另外一個模組, 導致我們後來的演示不是很成功,我也是醉了,不過看到自己努力的成果,還是挺開心的。