毕业设计—多功能门禁系统设计与实现

        大四开始就应该开始准备毕业设计作品了。最开始的毕业设计思路是使用S5pv210芯片的X210开发板,通过移植Qt以及MTK7601无线网卡驱动后设计Qt人机交互界面进行与门禁系统硬件部分的交互。

        先将门禁的硬件部分进行了设计,使用STM32F103C8T6最小系统板作为硬件平台进行门禁硬件部分的开发,该最小系统板具有3个串口可供使用,将串口1分作调试口,串口2最为AS608的通讯串口,串口3作为ESP-01S的通信串口,刚好将3个串口完全分配。ESP-01S可以烧录专对于MQTT的驱动,但由于种种原因,只烧录进去一次且不稳定,最终放弃了物联网驱动的烧录,改用默认AP指令对MQTT平台进行通信。

        硬件设计部分没什么好聊的,但所使用的MQTT可以聊一聊。邮箱到邮箱的方式进行信息接收与发送。本次设计使用的是阿里云MQTT平台,先比EXQ等平台而言,不会串线这一点就更适合本课题的通讯部分的开发。而且阿里云的这个MQTT平台,还有一个信息裁剪转发功能—云产品流转。该产品不但可以对接收到的信息按照自行编写的脚本进行信息裁剪,而且能够将信息转发到不同的设备上,默认情况下MQTT信息的转发是从A的post邮箱到A的set邮箱,但可通过云产品流转,实现从A的post邮箱转发到B的set邮箱。

        为什么要从A邮箱转发到B邮箱呢,按照原本的计划,使用X210开发板移植Qt,进行人机交互,是只需要使用到一组A设备的post/set和一组A的update/get邮箱(阿里云MQTT默认提供两组邮箱),但是由于九鼎官方移植的内核版本太低,没法适用于5.12.9的高版本Qt以及5.12.9的QtMQTT组件,所以最终在开发到最后一部分移植Qt时,不得不将原计划进行改变。

        新计划变为,门禁硬件部分+微信小程序+Qt(PC)端。门禁部分功能不变,但现在微信小程序成为了人机交互的主要战场,为什么还要一个Qt的pc部分呢,原本的X210Qt部分是设计有人机交互部分+database部分的,但微信小程序其本身是一个网页,若要使用数据库还需要连接部署在服务器的MYSQL一类数据库。但是细想一下,用不上这一类专业数据库,而且一个门禁系统,我希望的是将数据保存在用户自己的电脑内,难道需要帮每个用户去其自己的电脑或者服务器搭建MYSQL吗?这不现实。

        所以最终,选择将原本的X210Qt人机交互部分拆分为微信小程序+Qt(SQLite),这样一方面是实现了目的,另一方面是简化了移植的难度。

       为什么要使用云产品流转,实现消息裁剪?原因是,阿里云在做信息流转时,会加入该信息的相关信息,例如时间、发送方等,内容如下。

        使用STM32F103C8T6进行串口信息接收一般使用U8类型的数组进行接收,但是U8类型数组的上限是255,也就是说U8类型数组最多能申请大小为U8 a[256] = {0};观察上述信息发现数据字符数没达到256,但或许忽略了一个东西的存在,那就是转义字符。每当接收一个引号时,接收的内容为 \+" ,就像门禁发送一个条消息时候一样,都有这个转义字符的存在。

我们希望使用STM32发送的内容为:{'params':{'lock':1}}
实际上我们需要将内容写为以下内容进行发送:{\"params\":{\"lock\":1}}

        还有一点,就算我们采用脚本对信息进行裁剪,STM32部分的串口接收部分还有着一些幺蛾子。就比如cJson,在发送和接收过程中,内容均遵守Json格式,所以理所应当的,就使用cJson进行解析,按照网上的方法对cJson进行STM32的移植,并更改malloc块大小,但是在C8T6平台不能使用。

        其原因是内存不够,在编译文件时内存分配就不足以申请malloc的的空间(MEM_MAX_SIZE            16*1024),改为(MEM_MAX_SIZE 10*1024)可以运行,但就算能运行,由于使用中断进行消息接收,考虑到长时间进入中断程序会使程序死机,所以最后在门禁部分还用了笨办法进行进行JSON串的解析。

for(int i=0; i<100; i++)
    {
        if(rxbuf[i] == 'l'&& rxbuf[i+1] == 'o' && rxbuf[i+2] == 'c' && rxbuf[i+6] == '1') {
            locksta=1;
            strsta=0;
            break;
        }
				if(rxbuf[i] == 'l'&& rxbuf[i+1] == 'o' && rxbuf[i+2] == 'c' && rxbuf[i+6] == '2') {
            locksta=2;
            strsta=0;
            break;
        }
				if(rxbuf[i] == 'w'&& rxbuf[i+1] == 'a' && rxbuf[i+2] == 'r' && rxbuf[i+9] == '1') {
             warningsta=1;
             strsta=0;
             break;
         }
    }

        办法笨,但是管用,不用反复申请释放内存。当然cJSON方法也设计了出来,为了避免长时间占用中断,那么我们就可以通过标志位方式进行JSON串的处理,当接受完一组JSON串,那么就设置标志位为1,在主程序中检测到该标志位为1就对保存在U8类型数组中的JSON串按照cJSON的方式进行解析。

        下面来说一下,本课题的在门禁系统部分的一些思考。首先是密码部分,一般老小区都有门禁,而且都支持密码输入,但密码校验在本地,不太安全。使用本课题采用了门禁部分密码输入,将输入的密码通过MQTT转发到微信小程序进行核对,且记录在微信小程序的密码通过MD5加密为32位,将输入的密码也通过MD5加密后与记录的密码进行校验,密码正确则返回开锁指令。

        密码分为两种,一种是主密码,一种是访客密码,访客密码可在微信小程序点击生成按钮随机生成,使用一次之后即刻销毁,小程序将会生成新的访客密码,而且访客密码只能用于开锁,无法进入到门禁设置界面;主密码是门禁的主要密码,一般由房主自行保管,遇到朋友或者保洁来家时,提供访客密码即可,而且输入主密码通过核对后,门禁部分将会提供1.录入新指纹,2.二次开锁(密码核对正确后会进行一次开锁),3.重置主密码的功能,以上三点功能是访客密码核对后所不具备的。

        门禁部分支持开锁支持密码开锁、指纹开锁、以及远程开锁。指纹开锁不必多说(网上一大堆),远程开锁就算使用微信小程序点击开锁按钮进行开锁,并设有童锁程序,用于模拟室内反锁状态(防止病人、小孩、宠物开门走失)。

        还设有对外求助功能,通过蜂鸣器和led灯泡进行模拟,对外可发出光声信号,帮助特殊情况下救援人员快速锁定位置。

        设有MQ-2传感器,获取传感器数值,判定是否存在楼道火情,保障生命财产安全。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值