摘 要:随着高校招生规模的不断扩大,各学校原有的消费和管理模式已不能适应新的发展要求,先进的校园一卡通系统的出现带来了管理工作的革命。论文介绍了校园一卡通的组成和应用,对非接触IC 卡、串口通信、多线程等技术进行了研究,提出了使用多线程、串口等技术开发基于PC 控制的非接触IC 卡读卡器系统作为校园一卡通系统的一个重要子系统,建立非接触IC 卡子系统模型,并给出了程序的测试结果。
随着高校招生规模不断扩大,学生人数逐渐增多,用传统的方法进行管理工作已经不能快速高效地解决学生提出的学习、生活、消费的需求问题。校园一卡通系统就是使用先进的非接触IC 卡技术以及网络通讯技术,针对学校的综合管理而开发设计的。一卡通系统以非接触IC 卡作为载体,结合电子技术、非接触IC 卡技术、计算机网络技术以及数据库技术等,使其具有身份识别和电子钱包的功能,可替代校园日常生活所需各种证件和现金交易,达到证件、考勤、消费娱乐、餐饮等收费的全电子化和智能化。结束了传统校园生活中证件、卡片和票据满天飞的情况,将多种管理系统集成为一体,以一卡通的形式进行诸如签到考勤、身份证明、借阅图书、校园消费等多种活动,使用方便快捷,安全可靠,做到“一卡在手,走遍校园”。
1 校园一卡通系统简介
构建校园一卡通系统是为了利用已有的校园网络和普及的PC 机建成一个用于综合管理的系统,它主要由数据库服务器、PC 机、非接触IC 卡、读卡器和通讯网络及其所需软件组成。系统的设计原则为安全、快捷、一卡通用性和可扩展性,网络结构采用业界流行的Client/Server 体系结构,数据库服务器采用目前流行的SQL Server 构建数据库,其基本表包括学生信息表,教师信息表,课程安排信息表,电子钱包剩余金额信息表等,随系统扩展可加入更多的基本表。数据库进行字段加密,
只能通过服务器端程序手动或者自动访问,避免直接对数据库进行不安全的访问。作为客户端的PC 机上运行客户端程序,控制读卡器运作并与服务器端程序进行数据通信。用户持非接触IC 卡,可在各种读卡器上进行相应的操作,或在客户端PC机上做许可范围内的查询。读卡器程序与非接触IC 卡进行相互通信和系统数据库进行操作管理,是整个一卡通系统的控制程序。读卡器程序的开发,是实现一卡通系统的关键。一卡通系统结构框图如图1 所示。
2 非接触IC 卡子系统
非接触IC 卡子系统由读卡器、非接触IC 卡、PC 机以及运行在PC 上的控制程序组成。读卡器和非接触IC 卡之间使用射频技术进行通信。
2.1 射频技术及MIFARE 非接触IC 卡介绍
射频识别技术是利用射频方式进行非接触双向通信,以达到识别目的并交换数据。它与同期或早期的接触式识别技术不同。RFID 系统的射频卡和读写器之间不用接触就可完成识别,因此它可在更广泛的场合中应用。其工作原理如图2 所示。
MIFARE 非接触式IC 卡由IC 芯片,感应天线组成,并完全密封在一个标准PVC 卡片中,无外露部分。读写过程通常由非接触型IC 卡与读写器之间通过无线电波来完成读写操作。
卡本身是无源体,当读写器对卡进行读写操作时,读写器发出的信号由两部分叠加组成:一部分是电源信号,该信号由卡接收后,与其本身的L/C 产生谐振,产生一个瞬间能量来供给芯片工作。另一部分则是结合数据信号,指挥芯片完成数据的读取、修改、存储等,并返回给读写器。由非接触式IC 卡所形成的读写系统,无论是硬件结构,还是操作过程都得到了很大的简化,同时借助于先进的管理软件,可脱机的操作方式,都使数据读写过程更为简单。
2.2 ZLG500B 读卡模块数据传输协议
ZLG500B 是一个简单的串行读写模块,包括一个PCB 天线,提供一个UART 接口(CMOS 电平)。UART 接口一帧的数据格式为1 个起始位,8 个数据位,无奇偶校验位,1 个停止位,自动波特率探测。ZLG500B 上电后,将RC500 内的EERPOM中地址为0×7F 单元的内容读出,取其低2 位来初始化自己的波特率。在接收主机发出的STX 的同时,测量波特率,若一致,则继续通信;若不一致,则修改自己的波特率与主机一致,存入0×7F 单元,准备接收下一个STX。STX 为开始符,值为0×20;ETX 为终止符,值为0x03;应答ACK 和无应答NAK 的值分别为0×06、0- 15。
开始通信前,主机和ZLG500B 斗处于就绪状态,主机首先发出STX,然后等待ZLG500B 的响应ACK。若在10ms 内未检测到此响应,或收到NAK,则再次发送STX,若三次均未收到正确应答,则退出本次传输,将错误代码返回主程序,由主程序进行错误处理。若收到正确响应ACK,则发送数据块,最后发送终止符ETX 结束本次发送。
2.3 基于串口通信的读卡器开发
2.3.1 程序界面开发
系统采用对话框形式作为界面,包括主界面、设置界面、读写操作界面和网络操作界面共四个界面,主界面用按钮连接到其他三个界面。主界面使用一个按钮来提供自动签到和手动操作,由单击按钮在签到和操作之间切换。签到系统为自动控制,屏蔽除退出以外的其他按钮,读卡器每读到一张属于本系统的卡,就自动将所读到的学号、读卡器号和当前时间记录到本地数据库,以便于统计查询。选取操作则可使用从服务器数据库调用详细资料、修改卡中数据等需要手动操作的其他服务,例如电子钱包消费或初始化向卡写入数据。设置界面由主界面“设置”按钮打开,提供串口和波特率设置。读写操作界面由“读写卡”按钮打开,能读写卡中特定允许地址的数据。网络操作界面由“网络操作”按钮打开,提供对远程数据库的读写和更新。
2.3.2 基于多线程的串口通信
串行端口的本质功能是作为CPU 和串行设备间的编码转换器。当数据从CPU 经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。在Windows 环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。在MFC 下32 位串口通信程序可以用以下三种方法实现:
利用VC++的标准通信函数_inp 和_outp 可实现串口通信,利用ActiveX 控件和使用API 通信函数。VC++6.0 的标准通信函数用类似i=inp(PORT+5)&& 0xfe,outp(PORT+5,i)的形式操作串口。VC++6.0 提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能,编程时只需将控件对话中的MSComm 控件拖至你的应用对话框中,在主对话框的.h 文件中为新创建的通信控件定义成员对象(CMSComm m_Comm),通过该对象便可以设置操作MSComm控件的27 个属性,格式为“m_Comm.属性”。控件虽然简单易用,但由于必须拿到对话框中使用,在一些需要在线程中实现通信的应用场合下,控件的使用显得捉襟见肘。API 是附带在Windows 内部的一个极其重要的组成部分,Windows 的32 位API 主要是一系列很复杂的函数和消息集合。它可以看作是Windows 系统为在其下运行的各种开发系统提供的开放式通用功能增强接口。
ZLG500B 开发板使用VC++标准通信函数封装了一些底层和高层库函数,使用这些库函数可以简化开发工作。首先将库函数文件放入工作目录中,在.CPP 中包含zlg500B.h 头文件,然后将zlg500B.lib 加入到工程文件中。这样在程序中,就可以象调用VC 库函数一样调用这些函数了。
程序采用多线程技术,解决串口输入的瓶颈问题,当读卡工作线程运行的时候,程序可以做一些其他的事情,比如操作服务器数据库等。而用户界面始终可以继续操作,一个永远有反应的UI 是很重要的。除由进程产生的主线程外,程序产生三个工作线程,分别用于卡的检测、卡的操作和socket 通信。由主程序创建检测卡的工作线程:
pCheckThread=AfxBeginThread(ThreadFunc,this,0,THREAD_PRIORITY_NORMAL,CREATE_SUSPENDED)
其中最后一个参数表示创建线程的同时挂起线程,在程序中由设置按钮的响应函数在设置端口和波特率后恢复线程运行。主线程由按钮事件驱动控制整个程序流程,产生需要的工作线程。程序入口之前声明一些全局变量,包括读卡所需的数据、缓冲区、序列号等的全局结构datas 和全局标志量等,用于各线程之间数据通信。程序流程结构图如图3 所示。
无接触IC 卡本身是无源体,由读卡器发出的信号提供工作能量,所以读卡器工作线程采用主动轮循检测卡,在关闭软件之前,它将一直运行。读卡线程设置一静态变量用于每次结束后储存卡的序列号,初始化读卡模块,然后开始检测有效范围是否有卡,发现卡后获得序列号存入局部变量,装载密码防冲撞选择,选择卡进行认证,成功后驱动蜂鸣器并比较获得的序列号的局部变量和存上次的序列号的静态变量,不同则更新静态变量的序列号并检测运行状态:为签到状态就读入特定地址需要的数据,写入到本地数据库,为操作状态就设置标志量,完成所有步骤或者某一步不能通过都返回循环开始处继续查找。程序提供一个全局二维链表,首节点保存当天日期,其他节点保存已签到卡号,每次读卡后在链表中查找卡号,为新卡则增加节点将卡号写入,再将所需数据写入数据库,以此来保证不重复签到。操作状态下由读写操作按钮事件建立读写操作线程,扇区和块选择由读写操作界面上用户输入然后传递给线程函数。每一次读写、增加或减少数据之前必须首先请求应答与卡建立第一步联系、防冲撞在多张卡片中选定一张、select 卡片选择明确可对卡进行下一步操作,上述的三个步骤确认已经选择了一张卡片,还必须对卡片上已经设置的密码进行认证,如果匹配,则允许进一步的读写等操作。
对卡的密码验证的三遍认证过程:由Mifare 卡片向读写器发送一个随机数据RB;由读写器收到RB 后向Mifare 卡片发送一个令牌数据TOKENAB,其中包含了读写器发出的一个随机数据RA;Mifare 卡片收到TOKEN AB 后,对TOKEN AB 的加密的部分进行解密,并校验第一次由Mifare 卡片发出去的随机数RB 是否与环中接收到的TOKEN AB 中的RA 相一致;如果校验是正确的,则Mifare 卡片向读写器发送令牌TOKEN BA 给读写器;读写器收到令牌TOKEN BA 后,读写器将对令牌TOKEN BA 中的RB 进行解密;并校验第一次由读写器发出去的随机数RA 是否与接收到的TOKEN BA 中的RB 相一致;如果上述的每一步都为“真”,都能正确通过验证,则整个的认证过程将成功。读写器将能对刚刚认证通过的卡片上的这个扇区可以进入下一步的操作(READ/WRITE 等操作)。卡片中的其他扇区由于有其各自的密码,因此不能对其进行进一步的操作。如想对其他扇区进行操作,必须完成上述的认证过程。认证过程中的任何一环出现差错,整个认证将告失败,必须从新开始。MIFARE 卡片上有16 个扇区,每个扇区都可分别设置各自的密码,互不干涉。因此每个扇区可独立地应用于一个应用场合,满足一卡多用的需要。
程序里放置了一个身份验证模块来维护系统安全,确保用户不能越权使用。用户在对卡数据或数据库进行操作的时候会要求输入密码。不同的用户输入不同的个人密码将拥有不同的权限,密码是与卡相对应的,刷卡相当于输入用户名。不输入任何密码只能基本的签到功能,输入用户密码可以查询个人资料,通过键盘输入密码,允许持卡人输入三次密码,如果三次输的都不对,卡就会被锁住,只有PIN 码对了,用户才能对卡进行操作。高级系统管理员才有权限修改用户卡和数据库资料和让锁住的卡重新投入使用,保证整个系统安全使用。程序在运行过程中检测到串口上下行数据为:
【Write 数据:】20 主机首先发送
【Read 数据:】06 收到ZLG500B 的正确响应
【Write 数据:】00 52 00 AD 03 主机发送打开串口的命
令03 作为终止符
【Write 数据:】20
【Read 数据:】06
【Write 数据:】00 41 01 00 BF 03 主机发送request 命令
【Read 数据:】20
【Write 数据:】06
【Read 数据:】00 00 02 04 00 F9 03 request 命令成功返回
【Write 数据:】20 20 20 主机收不到响应的情况,将
连发三次后返回
通过长达100h 的单机测试,程序运行良好,完全能达到设计的要求。
3 结束语
基于PC 开发读卡器程序,是实现校园一卡通系统的关键,利用现有普及的PC 机,能缩减构建系统的成本,提高资源利用率,简化校园管理,方便学生的校园生活。随着不断深入研究完善校园一卡通系统,系统将能应用到更多领域,有着广阔的前景