基于树莓派的门禁系统

这几天黑客松比赛, 在大神的带领下稳稳地落幕了, 虽然是第二次参加这个活动了, 但是这一次才是我尽全力的去做自己的东西, 这里也感谢xx大牛的指导 。

也不废话了, 直接上图吧基于树莓派的门禁系统_第1张图片




大致的一个流程就是以树莓派作为中间人, 利用各个模块的特性去实现开门。 这里其实还是有很多坑的。 比如一开始的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()

对了,还有一个指纹识别模块的,但是大牛说要搞什么调试, 时间会来不及,于是就没做了。 然后,还有一个大坑是我们比赛的时候, 大牛忘记开另外一个模块, 导致我们后来的演示不是很成功,我也是醉了,不过看到自己努力的成果,还是挺开心的。



你可能感兴趣的:(树莓派)