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

来自 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);
        }
    }

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

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

这是一篇发布于 7年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


15 评论

  1. 成本500员以下,所需要的配件:电源箱一个(输出12V)、电磁锁一个(12V 220MA)、继电器一个(5V驱动)、树莓派官方摄像头一个(NoIRCamera)、装有树莓派原装系统SD卡一张、面包板(建议使用焊锡直接将线焊起来)、线若干。
    其中
    电源箱-100元
    电磁锁- 60元
    继电器- 3元
    摄像头-120元
    树莓派-200元
    SD卡 – 40元
    总计 520元
    其中树莓派+SD卡是标配,绝对少不了的,所以额外金额是300元以内。如果嫌电源箱太贵,可以自己动手组装供电模块,供电板+电源线大约30元上下

  2. 有个问题,这套系统的摄像头是直接连在树莓派主板上的,也就是说你不能像传统门禁的读头那样放在门外,而只能整套系统都要放在门外。如果是这样,那一旦破坏整个装置,门禁就会被破坏。不知道有没有考虑这个问题,或者已有解决方案?

  3. 统一回复:
    胡伟2017年9月3日 / 17:33
    有个问题,这套系统的摄像头是直接连在树莓派主板上的,也就是说你不能像传统门禁的读头那样放在门外,而只能整套系统都要放在门外。如果是这样,那一旦破坏整个装置,门禁就会被破坏。不知道有没有考虑这个问题,或者已有解决方案?
    答:目前没有存在的解决方案,目前的构想是把摄像头换成二维码扫描仪直接传数据回去。这样就分开了,用usb接。
    ——————————————————————————————————————–
    傅2017年11月25日 / 06:38
    您好,我想做一个毕业设计的论文参照您的系统可以吗?
    答:可以的,欢迎
    ——————————————————————————————————————–
    ABCLEI2018年4月28日 / 12:42
    你好,你的那个代码是怎么放到树莓派中运行的?打war包还是直接复制过去运行的?
    答:对的,直接jar包里运行
    ——————————————————————————————————————–

  4. 统一回复:
    个人不会常来看帖子,有问题的可以联系我:
    邮箱:leafspace_zhang@163.com
    QQ:1141610886
    微信:1141610886JI

  5. 看了评论其实摄像头是排线在门上开个口设备放门内即可。整套设备加个铁盒焊接上锁防止破坏均可。

发表评论

你的邮件地址不会公开


*