树莓派实现二维码门禁系统,支持预约管理

   日期:2024-01-22     浏览:49    评论:0    
核心提示:来自 leafspace 的投稿,感谢~ 本文使用树莓派DIV搭建一个二维码门禁预约管理系统。起源是学校里需要对活动室进行人员管理,保护学校固定资产。原先学校的活动室安装的门禁系统是IC卡片式的,由于时间较长,管理不当,相当一部分的IC卡丢失,导致活动室被迫只能强制每天直接开放。所以,经过学校教工会商量,由学生外包开发基于二维码的门禁预约系统,而我是项目经理。

来自 leafspace 的投稿,感谢~
本文使用树莓派DIV搭建一个二维码门禁预约管理系统。起源是学校里需要对活动室进行人员管理,保护学校固定资产。原先学校的活动室安装的门禁系统是IC卡片式的,由于时间较长,管理不当,相当一部分的IC卡丢失,导致活动室被迫只能强制每天直接开放。所以,经过学校教工会商量,由学生外包开发基于二维码的门禁预约系统,而我是项目经理。

接手项目后,我将工程分为三个模块,微信模块(老师要求的)、网站预约模块、硬件控制模块。用户通过微信或浏览器进入网站,在网站上预约有关于使用某个活动室的情况,将信息保存进入数据库并提供给用户一个二维码。到了预约的时间范围之内,用户携带二维码到活动室控制前,扫描二维码,硬件控制模块读取二维码内容,如果二维码是本系统的,则到数据库中查询相关预约,如果当前时间与预约的时间符合,则开门。

在开始之前需要准备这样几个东西:树莓派开发板一个、电源箱一个(输出12V)、电磁锁一个(12V 220MA)、继电器一个(5V驱动)、树莓派官方摄像头一个(NoIRCamera)、装有树莓派原装系统SD卡一张、面包板(建议使用焊锡直接将线焊起来)、线若干。

先放上Github地址:https://github.com/leafspace/CSLG-Access-Reservation-System

首先我们需要一个数据库,这个数据库用于保存有关于预约方面的信息。我在这个工程中使用的是SQL Server,原因是与学校的数据库兼容。表结构如下:

CREATE TABLE [dbo].[Users](
    [user_id] [int] NOT NULL,
    [userName] [varchar](20) NOT NULL,
    [password] [varchar](16) NOT NULL,
    [wechat_id] [varchar](16) NULL,
    [phone_number] [varchar](13) NULL,
    [identity_number] [varchar](9) NULL,
    [is_temporary] [bit] NULL,
    [is_manager] [bit] NULL,
    [information] [varchar](max) NULL
)
CREATE TABLE [dbo].[Reservations](
    [reservation_Id] [int] NOT NULL,
    [user_id] [int] NULL,
    [room_id] [int] NULL,
    [valid] [bit] NOT NULL,
    [lock] [bit] NOT NULL,
    [year] [int] NULL,
    [month] [int] NULL,
    [day] [int] NULL,
    [start] [int] NULL,
    [finish] [int] NULL,
    [qr_location] [varchar](50) NULL,
    [information] [varchar](max) NULL
)
CREATE TABLE [dbo].[ActivityRooms](
    [room_Id] [int] NOT NULL,
    [information] [varchar](max) NULL
)

其中Reservations表中的year、month、day、start、finish就表示了用户某个预约的预约时间,(start和finish都为三位数或四位数,例如开始时间14:30,则start为1430)。用户每进行一次预约就在Reservations表中新增一条记录。然后将其reservation_Id添加一段密钥生成二维码,生成二维码使用的是zxing库。下载地址:http://www.oschina.net/p/zxing/。

然后就是搭建部署预约网站,这个在此不多讲,因为当前开发方案有很多,网站烂大街了,我这边使用的是JSP/Servlet的形式开发的。

然后就是组装硬件,先将摄像头穿过亚克力板插进树莓派(蓝色部分朝网络接口)。如下图(来自网络):

插入摄像头后还无法直接使用,需要在系统内进行配置。以树莓派原装系统为例:

    1. 进入命令行窗口,输入$sudo raspi-config
    1. 按动键盘上下键到“Enable Camera”,按回车键,将其设为Enable。
    1. 使用$sudo raspistill -o image.jpg来拍照测试

如下图(来自网络):

摄像头安装完成之后开始组装门禁控制系列其他硬件,先用一张原理图来说明接线结构,如下图:

这张图上,从左至右,从上至下分别为:树莓派3b,继电器,树莓派风扇,电磁锁,电源。
树莓派总共使用了三个引脚,电源脚、地线脚、GPIO1号脚,其中,电源脚与地线脚同时为风扇,继电器供电。(注:图中有稍许错误,继电器的GND脚(3号)应该与树莓派的地线脚相连)。GPIO1号脚与继电器的PIN(5号)相连,这条线用于输出控制信号,绝对不能弄错。
继电器使用了五个针脚(共6根),DOM脚连电子锁的负极,NO脚接交流电的负极。
电磁锁的正级与电源的正级相连。
我在实际操作的时候将由树莓派提供电源部分的线焊接起来了,所以没有用面包板。见下图:

这是继电器与树莓派相连的部分, 下面这个是继电器与其余模块相连的部分:


然后就可以开始编写程序控制。
这里我是使用java编写的程序,使用java对树莓派针脚控制就需要使用PI4J库,下载地址:http://pi4j.com/。
程序逻辑如下:
1)设置GPIO1号门为持续高电平:

final GpioController gpioController = GpioFactory.getInstance();
        final GpioPinDigitalOutput doorController = gpioController.provisionDigitalOutputPin(RaspiPin.GPIO_01, "MyControl", PinState.HIGH);
        doorController.setShutdownOptions(true, PinState.LOW);

2)拍照,将照片保存在一个固定的文件夹下:

private static String path = "/home/pi/qrCode/image.jpg";
    private static String[] cmdOrder = {"sh", "-c", "raspistill -w 500 -h 500 -o " + path};

    public static boolean TakePhoto() {
        try {
            Process process = Runtime.getRuntime().exec(cmdOrder);
            process.waitFor();
            InputStream inputStream = process.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String line = null;
            while((line = bufferedReader.readLine()) != null) {
                System.out.println("Information : (Take photo) " + line);
            }
        } catch (InterruptedException exception) {
            return false;
        } catch (IOException exception) {
            return false;
        }
        return true;
    }

3)使用ZXing库解析二维码,如果成功则跳转到3
4)开门,设置GPIO1号脚的电平为低电平(让电磁铁断电,失去磁性),系统等待3秒,3秒后自动设置回高电平(关门)

public static void OpenDoor(GpioPinDigitalOutput doorController) {
        doorController.setState(PinState.LOW);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException exception) {
            exception.printStackTrace();
        } finally {
            doorController.setState(PinState.HIGH);
        }
    }

最后来张部署后的全家福:

视频演示(实验室小编按:电蚊香液这样的使用角度是不正确的):

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服