900M门禁考勤软件设计与实现报告byZK.docx
《900M门禁考勤软件设计与实现报告byZK.docx》由会员分享,可在线阅读,更多相关《900M门禁考勤软件设计与实现报告byZK.docx(40页珍藏版)》请在冰豆网上搜索。
900M门禁考勤软件设计与实现报告byZK
沈阳航空航天大学
课程设计报告
课程设计名称:
物联网综合课程设计
课程设计题目:
900MHz门禁考勤软件设计与实现
院(系):
计算机学院
专业:
计算机科学与技术(物联网技术)
班级:
24010107
学号:
XXXXXXXXXXXXX
姓名:
ByZ.堃
指导教师:
施国君
完成日期:
2016年1月15日
此处为课设任务书~~
【备注】:
*900MHz门禁管理软件项目文件(QT工程文件/BG)链接请转至报告最后~~~
第1章总体设计方案
1.1设计原理
RFID技术,简单的说它是一种非接触的自动识别技术。
该技术的原理主要是利用射频信号和空间耦合的传输属性,能够对贴有RFID标签的物体进行自动识别。
所以RFID技术可以使用在门禁考勤上,这是因为RFID系统可以将用户的信息全部存贮在一起,每一个RFID卡有一个特定的卡号,并且这些信息能够通过跟卡号关联而被系统快速识别。
所以基于RFID技术的门禁考勤系统,可以将用户信息与RFID卡相关联,通过相对应的读卡器和一定的软件程序实现门禁考勤的功能。
RFID系统主要由电子标签、RFID读写器和天线三部分构成。
每个用户的RFID卡都是唯一的电子标签,其内部用EEPROM进行存储用户的各项信息;而RFID读写器由RFID控制器和RFID天线构成,读写器主要用来读取和写入RFID标签信息;而天线的作用就是用来传递RFID读写器和RFID标签之间的信息信号,本次课设中所使用到的频率为900MHz。
本课设题目名称为900MHz门禁考勤软件设计与实现,当前一些企业的人员管理考勤制度正在逐步的朝着信息化方向改进,以前通过人力去统计的方式已经显得落后和浪费资源,也极为不便。
因此企业人力管理信息化、便捷化、智能化的需求,便可以通过RFID技术来得以解决。
正是在这一背景下,本课设设计了一套基于900MHzRFID技术的门禁考勤系统软件。
1.2设计思路
采用900MHz的读卡器和900MHz具有唯一ID的射频卡作为系统的基础组成,使用QTCreator编写门禁考勤软件;读卡器对射频卡具有读写数据的功能,射频卡中具有存储信息的部分,利用程序连接读卡器从射频卡中读取或写入特定的信息用来识别。
在本次课设中,需要实现考勤刷卡、用户管理(添加、修改、删除用户)以及考勤日志记录的功能;因此先要设计考勤数据库,数据库包含用户表和考勤日志表,之后:
(1)当开启读卡器检测到卡时,获取到卡的ID,在数据库中查找该ID是否存在,如果存在则向考勤日志表中添加一条考勤记录,否则提示不存在该用户。
(2)在添加用户时,先刷一张新卡通过读卡器向其中写入用户信息并保存到用户数据表;修改用户时从用户列表中选择一条记录进行信息修改并保存;删除用户时,直接在用户列表中选一条用户信息的记录进行删除即可;
(3)查看考勤日志记录时,点击日志刷新按键,从数据库中读取考勤信息到日志列表;
1.3设计环境
1、软件环境:
QTCreator:
QtCreator是跨平台的QtIDE,QtCreator是Qt被Nokia收购后推出的一款新的轻量级集成开发环境(IDE)。
此IDE能够跨平台运行,支持的系统包括Linux(32位及64位)、MacOSX以及Windows。
QtCreator的设计目标是使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务。
2、硬件平台:
物联网多网技术综合教学开发平台B版(以下简称实验箱),重在研究不同网络在物联网中的各种应用,包含RFID技术、Zigbee、BlueTooth、Wifi、GPRS等各种数据通信方式,可应用于物联网专业教学、项目开发等方向。
功能特点:
实验箱提供了全面的开发工具和配套资料,最大程度的激发学生兴趣,巩固学习效果,方便了学习和应用。
该平台的特色是:
实验箱将模拟电子、数字电子、电路设计、信号处理、传感器原理与检测、单片机技术、RFID技术、BlueTooth技术、Wifi技术、Zigbee通信、GPRS通信、嵌入式技术等相关知识融会贯通,涵盖了当前物联网行业最热门最尖端的技术,实现了多网融合,让学生可以灵活应用各科知识,发挥创新能力。
实验箱为高校老师和学生们提供当前最受欢迎的嵌入式技术。
学生通过实践能够熟悉嵌入式开发的流程,掌握相关软件和调试工具的使用方法。
采用源码开放的Linux操作系统采用源代码开放的Linux操作系统。
老师和学生不仅可以阅读Linux系统的源码,而且可以自己配置和修改部分代码,定制个性操作系统。
由于Linux相关的网络资料、书本资料很丰富,因此在学习或开发过程中如果遇到问题,就可以在相关论坛得到帮助,缩短技术攻关的时间,提高学习或工作效率。
实验箱具有一键还原功能,通过该功能在做完实验后,可将实验箱恢复到初始状态,方便管理节约检查配置时间。
第2章详细设计方案
2.1顶层方案图的设计与实现
顶层方案图实现门禁考勤软件的逻辑功能,设计方案采用自上而下的设计方法。
根据900MHz门禁考勤软件的设计原理和设计思路,可以将本门禁考勤软件按功能分为以下3个主要部分:
考勤刷卡、用户管理、考勤日志。
(1)考勤刷卡:
采用900MHz读卡器读取卡的信息,对用户甄别进行考勤记录;
(2)用户管理:
可以添加新卡用户、删除用户信息、编辑用户信息;
(3)考勤日志:
可以对用户考勤日志信息进行查看;
门禁考勤软件系统功能结构框图如图2.1所示:
图2.1门禁考勤软件系统功能结构框图
利用QTCreator编写程序,绘制功能界面,并实现各部分功能程序。
程序调试结束后,编译下载到物联网综合实验平台进行运行检测。
2.2功能模块的设计与实现
本900MHz门禁考勤软件由考勤刷卡、用户管理和考勤日志三个模块组成。
考勤刷卡模块可以将卡的ID读取之后,在数据库中的用户信息进行比对,如果用户存在,则显示用户信息并对用户进行考勤记录,向考勤日志中添加一条记录;
用户管理模块可以实现读卡添加新卡用户、编辑用户的信息以及删除用户信息;
考勤日志模块可以对所记录的所有用户考勤日志信息进行查看。
下面是各功能模块的实现:
2.2.1考勤刷卡功能的实现
考勤刷卡功能:
采用900MHz的通信模块,读卡器读取其读卡范围内的卡的ID,程序在用户数据库中查询所获得的ID是否存在,如果存在显示该卡所对应的用户,并向数据库考勤表中添加一条该用户的考勤记录;否则,ID不存在,显示不存在该用户;
(1)使用QT定义构建考勤刷卡界面,刷卡界面由日期显示、卡号及用户名三部分组成,如下图2.2所示:
图2.2考勤刷卡界面图
(2)实现过程:
当开启读卡程序,通过读卡器通讯程序获得卡ID,调用数据库查询用户函数:
findName(constQString&cardid),获得的ID作为参数查询用户名;数据库会返回一个QString类型的结果,判断返回的结果,如果不是空字符串则表示数据库中有该用户,将用户姓名显示在Name文本框中,并调用数据库日志添加函数:
addLog(constQString&cardid)向数据库考勤日志表中添加一条考勤记录;否则在Name文本框中显示“NoSuchPerson!
”。
2.2.2用户管理功能的实现
用户管理功能:
有三个子功能分别是:
添加、删除、修改用户;
主要操作:
添加用户时,点击Add按钮弹出添加界面,刷一次新卡获得ID,输入用户名后点击确定进行保存;删除用户时,从用户列表选择一条用户信息记录再点击Delete按钮删除;修改用户信息时,选择一条记录点击Modify就可以修改用户的姓名,点击确认进行修改。
(1)使用QT构建用户管理的界面,如下图2.3所示
图2.3用户管理界面
(2)实现过程
添加用户:
点击Add按钮,调用UserAdd界面;刷一下卡获取到卡的ID,利用虚拟键盘输入用户名后,点击OK确定。
程序会调用用户添加函数:
addCard(constQString&cardid,constQString&name),ID和用户姓名作为参数,将新用户记录插入数据库的用户表中;
删除用户:
在用户管理界面的用户列表中点击选择一条用户信息,点击Delete按钮,程序判断是否选择了一条记录,如果选择了则调用用户删除函数:
delCard(constQString&cardid),ID作为参数,将对应卡的用户信息从用户表中删除;
修改用户信息:
在用户列表中选择一条记录后点击Modify按钮,程序调用UserModify界面将选择的用户信息显示出来,可以对用户的姓名进行修改,修改完成之后点击确认,调用用户修改函数:
updateName(constQString&cardid,constQString&newname),ID和新的用户姓名作为参数,更新数据库中的用户信息。
通过调用数据库操作函数和数据通信函数实现用户的添加、删除、修改等管理操作。
2.2.3考勤日志功能的实现
考勤日志功能:
用户在考勤刷卡界面刷卡之后,会在数据库中存入一条考勤的记录,在考勤日志界面点击刷新按钮可以查看数据库中的考勤记录;
(1)使用QT构建考勤日志界面,如下图2.4所示。
图2.4考勤日志界面
(2)实现过程
管理者点击Refresh按钮进行刷新时,程序调用日志刷新函数:
updateLogTable(),从数据库考勤日志表中提取考勤记录,按先后顺序显示在考勤日志界面的列表中;当有新的考勤刷卡时,只需点击Refresh就可以对考勤日志进行刷新显示。
第3章编程下载与硬件测试
3.1编程下载
在Linux系统下的Qt软件中将本软件代码编译,再将编译好的文件从Linux中复制到Windows系统下。
使用Windows系统自带的“超级终端”工具,在超级终端中设定好开发板的IP地址,在文件资源管理器中打开对应的路径,将编译好的程序下载到该IP地址对应的文件夹中,即完成了程序下载过程。
3.2硬件测试及结果分析
1、在超级终端中执行添加权限的命令,为DrugSaleManageSystem文件增加可执行权限并运行,如图3.1所示:
图3.1添加权限并运行DrugSaleManageSystem程序
2、运行程序后,首先可以在LCD上看到门禁考勤软件的主界面,如图3.2所示:
图3.2门禁考勤软件主界面
上图中若右上角显示为“已关闭”时,表示系统未工作,此时界面内的所有功能均不可操作,右上角显示“已打开”时可以进行操作。
3、添加新用户,点击Manage进入用户管理界面,点击添加弹出信息录入窗体,刷卡获得卡ID后,进行用户名输入,测试如图3.3所示:
图3.3添加新用户
点击OK保存新的用户信息。
4、编辑用户信息,选择一条用户记录点击Modify,弹出编辑窗体;测试如图3.4所示:
图3.4修改用户信息
5、删除用户,在用户列表中选择一条记录,点击Delete按钮删除一名用户,测试结果如图3.5所示:
图3.5删除用户信息
6、考勤刷卡,刷一张卡有两种可能的结果,一种是注册过的卡,一种是没有注册过的卡,测试两种类别的卡结果如图3.6所示
图3.6考勤刷卡结果
7、考勤日志显示,在日志显示界面点击刷新按钮,测试结果如图3.7所示:
图3.7考勤日志显示
参考文献
[1]单承赣.射频识别(RFID)原理与应用[M].北京:
电子工业出版社,2012
[2]物联网多网技术综合开发平台实验指导书[M].北京:
凌阳科技有限公司,2013
[3]多网综合开发平台B版使用说明书[M].北京:
凌阳科技有限公司,2013
[4]周华.射频识别RFID技术原理与应用实例[M].北京:
人民邮政出版社,2008(12)[5]董卫.图书馆RFID应用标准化方案分析[J]现代计算机技术,2013(06)
[6]康鹏.射频识别RFID技术与典型应用[M]北京:
人民邮政出版社,2010(06)
[7]韩广峰.智能化图书馆RFID技术的研究[J].图书馆工作与研究,2007
(1):
66-68
[8]孙一钢.图书馆RFID技术标准化问题分析[J].中国图书馆报,2007(4):
106-108
附录(关键部分程序清单)
一、考勤软件主界面代码:
#include"DrugSaleManageSystemMainWidget.h"
#include"ui_DrugSaleManageSystemMainWidget.h"
#include"DBControl.h"
#include"ioportManager.h"
#include
DrugSaleManageSystemMainWidget:
:
DrugSaleManageSystemMainWidget(QWidget*parent):
QWidget(parent),
ui(newUi:
:
DrugSaleManageSystemMainWidget),
commPort(NULL),
isNormalPackage(true)
{
trans=newQTranslator(this);
trans->load(":
/zh_CN.qm");
qApp->installTranslator(trans);
DBControl:
:
Create();
ui->setupUi(this);
IOPortManager:
:
setMode(Mode900M);
connect(this,SIGNAL(recvPackage(UHF900MPackage*)),this,SLOT(onRecvedPackage(UHF900MPackage*)));
connect(this,SIGNAL(cardDetected(int,QString)),this,SLOT(onCardDetected(int,QString)));
on_openCloseBtn_clicked(false);
}
DrugSaleManageSystemMainWidget:
:
~DrugSaleManageSystemMainWidget()
{
DBControl:
:
Destroy();
deleteui;
}
boolDrugSaleManageSystemMainWidget:
:
start(constQString&port)
{
if(commPort!
=NULL)
returnfalse;
commPort=newQextSerialPort(port,QextSerialPort:
:
EventDriven);
commPort->setBaudRate(BAUD9600);
commPort->setFlowControl(FLOW_OFF);
commPort->setParity(PAR_NONE);
commPort->setDataBits(DATA_8);
commPort->setStopBits(STOP_1);
if(commPort->open(QIODevice:
:
ReadWrite)==true){
connect(commPort,SIGNAL(readyRead()),this,SLOT(onPortDataReady()));
onApplySettingBtnClicked();
returntrue;
}
else{
qDebug()<<"devicefailedtoopen:
"<errorString();
deletecommPort;
commPort=NULL;
returnfalse;
}
}
boolDrugSaleManageSystemMainWidget:
:
stop()
{
if(commPort!
=NULL)
{
commPort->close();
deletecommPort;
}
commPort=NULL;
returntrue;
}
voidDrugSaleManageSystemMainWidget:
:
onPortDataReady()
{
QByteArraybytes;
inta=commPort->bytesAvailable();
bytes.resize(a);
quint8*p=(quint8*)bytes.data();
intlen=bytes.size();
commPort->read((char*)p,len);
while(len--)
{
boolfullPackage=false;
lastRecvedPackage.append(*p);
switch(lastRecvedPackage.size())
{
case1:
if(*p==0x00)
isNormalPackage=false;
else
isNormalPackage=true;
break;
case2:
break;
default:
if(isNormalPackage)
{
if(lastRecvedPackage.size()==(lastRecvedPackage.at
(1)+2))
{
fullPackage=true;
}
}
else
{
if(lastRecvedPackage.size()==17)
{
fullPackage=true;
}
}
break;
}
if(fullPackage)
{
UHF900MPackage*pkg=newUHF900MPackage(lastRecvedPackage);
if(pkg->isValid())
emitthis->recvPackage(pkg);
lastRecvedPackage.clear();
}
p++;
}
}
//
voidDrugSaleManageSystemMainWidget:
:
onRecvedPackage(UHF900MPackage*pkg)
{
//TODO:
switchpackagetype
if(pkg->isValid())
{
if(pkg->isNormalPackage())
{
switch(pkg->command())
{
caseUHF900MPackage:
:
IdentifyEPC:
if(pkg->data().size()==13)
{
emitcardDetected(int(pkg->data().at(0)),pkg->data().mid
(1).toHex());
//ui->uhf900mCardScanTab->appendScanDataText(
//QString(tr("Radio%1:
%2"))
//.arg((int)(pkg->data().at(0)))
//.arg(QString(pkg->data().mid
(1).toHex()))
//);
}
//else
//ui->uhf900mCardScanTab->appendScanDataText(tr("Cardnotfound"));
break;
caseUHF900MPackage:
:
WriteSetting:
switch(settingStatus)
{
caseGetScanMode:
{
settingStatus=GetMode;
QByteArrayregData;
regData.append((char)0x00);
regData.append((char)0x70);
regData.append((char)2);//1forC/S,2fortimer,3fortrigger
//regData.append((char)ui->uhf900mSettingTab->mode());
UHF900MPackagepkg(UHF900MPackage:
:
CommandPkg,UHF900MPackage:
:
WriteSetting,0,regData);
sendData(pkg);
}
break;
caseGetMode:
{
settingStatus=GetTimeDelay;
QByteArrayregData;
regData.append((char)0x00);
regData.append((char)0x71);
regData.append((char)15);
//regData.append((char)ui->uhf900mSettingTab->delay());
UHF900MPackagepkg(UHF900MPackage:
:
CommandPkg,UHF900MPackage:
:
WriteSetting,0,regData);
sendData(pkg);
}
break;
caseGetTimeDelay:
{
settingStatus=GetCommIf;
QByteArrayregData;
regData.append((char)0x00);
regData.append((char)0x72);
regData.append((char)1);//1forRS485,2forWiegand,3forRS232
//regData.append((char)ui->uhf900mSettingTab->commIf());
UHF900MPackagepkg(UHF900MPackage:
:
CommandPkg,UHF900MPackage:
:
WriteSetting,0,regData);
sendData(pkg);
}
break;
caseGetCommIf:
{
settingStatus=Idle;
sendData(UHF900MPackage(UHF900MPackage:
:
CommandPkg,UHF900MPackage:
:
ResetDevice,0));
}
break;
caseIdle:
break;
}
break;
}
}
else
{
emitcardDetected(int(pkg->data().right
(1).at(0)),pkg->data().left(12).toHex());
//ui->uhf900mCardScanTab->appendScanDataText(
//QString