基于Linux串口的非接触式IC卡开发应用
文章出处:http://www.nexussmartsolutions.com 作者:姜远 高岭 杨建锋 人气: 发表时间:2011年09月23日
0 引 言
随着信息技术的快速发展,个人数据将成为未来信息的主要角色。IC卡作为卡基应用系统中的一种卡型,利用安装在卡中的集成电路(IC)来记录和传递信息,是一种将个人信息有效地送人信息网络并获得所需结果的有效办法。IC卡芯片具有写入数据和存储数据的能力,IC卡存储器中的内容根据需要可以有条件地供外部读取,或供内部信息处理和判定之用。作为IC卡与读写设备数据交换的一种方式,非接触式IC卡是通过无线电波或电磁场感应的方式,将卡中集成电路内的数据与外部设备接口设备通信,卡片不用直接接触接口设备的电极就可以进行数据读写。通信距离可以从几厘米至几十米远。其主要优点是环境适应性强、可全天候、无接触地完成自动识别、跟踪与管理。
1 Linux中的串口通信设备模块
1.1 Linux设备文件
在Linux中硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。这些设备文件提供了到大多数物理设备的接口,它们分为字符设备、块设备和网络设备。
(1)字符设备:在存取时没有缓存的设备,不使用系统缓冲,对设备文件的操作直接反映到硬件上,串口就属于字符设备。
(2)块设备:读写都有缓存的支持,并且能够随机存取。主要包括软盘设备、CD—ROM等。
(3)网络设备:任何网络设备都要经过一个网络接151即一个能够和其它主机交换数据的设备,通常接口是个硬件设备但也可能是个纯软件设备。
1.2 串口通信的设置
对串口硬件设备进行操作,有两种方法:一是利用Linux内核自带的串口驱动程序;另外一种方法就是直接渎写串口硬件端口,在这里只使用第一种方法。要设置串口属性,首先应在程序中包含termios.h的头文件,这个头文件包含终端控制结构和控制函数。
其中有一个非常重要的数据结构struct temfios,这个数据结构包含了所有的串口参数,如波特率、数据位、输入输出方式等。设置串口属性就是对这个数据结构赋值。可以通过termios.h中的函数tssetattr()设置串口的termios参数;通过函数tsgetattr()获取串口的termios参数。该数据结构的各成员的属性值以及参数含义可以参考文献[1]。
设置完通信参数后就可用read从串口读取数据和write向串口写数据了,其实质就是对串口文件进行读写。运行程序时要注意用户是否有对要操作的串口文件进行读写的权力,可以用chmod命令进行文件权限修改。
2 非接触式IC卡简介
Mifare 1 IC智能(射频)卡的核心是Philips公司的Mifare 1 IC $50。内建有高速的CMOS EEPROMMCU等。卡片上除了IC微晶片及一副高效率天线外无任何其他元件,无源(无任何电池),工作时的电源能量由卡片读写器天线发送无线电载波信号耦合到卡片上天线而产生电能,一般可达2V以上供卡片上IC工作工作频率13.56Mttz。
Mifare 1 IC卡上具有先进的数据通信加密并双向验证密码系统;且具有防重叠功能,能在同一时间处理重叠在卡片读写器天线的有效工作距离内的多张重叠的卡片。其通讯原理如图1所示。
图1 Mifare 1 IC卡读写流程图
3 IC卡设备在Linux下的开发实现
采取通用的Mifare S50卡为例,详细描述其在校园机房的使用。
3.1 建立相应的数据结构
在头文件AcctData.h中,定义结构体AcctItem,用于反映机器的使用状态,头文件ICCard.h中,定义类ICCard用于反映IC卡的使用状态。确定在驱动模块程序中应用的数据结构的最终目的是读取和写入卡数据处理,所以规范整齐的数据结构是必须的。
通讯模式及率
};
这样,就定义了全部的卡处理数据结构定义以及设备操作映射函数结构,综上所述,就实现了IC卡设备的打开、读写和监控函数 。
3.2 模块初始化函数的实现
模块初始化函数是模块开发过程中必不可少的处理函数,用于实现设备的初始化,中断初始化及处理设备等。
在上面类中首先应用GetCardData(char*,CardData&)实现了卡数据的初始化;然后定义了队列数据,再进行了上机处理以及下机处理,故障恢复处理;最后实现了恢复故障处理。
3.3 中断处理
模块采用了定时器中断,在每个定时器中断发生时对刷卡状况进行检测,如果在天线范围内检测到刷卡,根据使用标记进行判断,未使用则进行读卡操作;使用中则进行写卡操作,同时更新IC卡的状态数据。
程序中的中断处理采用了信号量机制来实现中断的后续处理,其处理流程为:
3.4 注销模块处理
用于模块卸载时进行资源的释放,在关闭串口前,需要通过tcsetattr(fd,TCSANOW,&oldtio);将串口参数恢复为原来的设置,最后通过close系统调用关闭串口,如下所述:
3.5 设备的读、写和配置函数
主要是通过实现IC卡的各种操作,在先前的类ICCard中已经介绍,根据Mirare 1 IC的通讯原理,实现卡的初始化操作。
综上所述,卡驱动模块的基本实现原理是:当有刷卡操作发生时,由使用标记引发中断或进行读卡操作;或进行写卡操作,同时进行相应数据处理。从而实现有卡操作发生时马上进行卡数据的更新[ 。
4 模块的编译调试
编写相应的makefile文件:
chown root$(BINDIR)/pubacct
chown u+s$(BINDIR)/pubacct
clean:
rm-f*.o pubaect
执行几个make命令,便可以实现驱动模块的动态编译。
5 结束语
文中笔者创新点:介绍了非接触式IC卡的概况和发展前景。有助于有一定IC卡经验、技术及具有一定的计算机软缎件技术的研发者设计出诸多应用场合的产品。这里只是截取了IC卡应用的一个方向,以及简单的设计开发。在其它的高级应用中还可以加入密钥保护等措施。
基金项目:陕西省自然科学基金项目(2005f36)
作者简介;姜远(1978--),男,陕西西安人,西北大学信息学院,硕士研究生,研究方向 为网络管理;高岭,教授,西北大学信息学院,研究方向为网络测量和网络管理。杨建锋,西北大学现代技术教育中心
参考文献:
[1] 刘峥嵘,张智超,许振山.嵌入式Linux应用开发详解[M].北京:机械工业出版社,2005.
[2] 尤晋元.UNIX环境高级编程[M].北京:机械工业出版社,2004.
[3] Sweet M R.Se蒯Programing Guide for FOSIX Operating Systems[M].[s.I.]:O’Reilly& Associates,2002.
[4] BaumannPH.SerialProgrammingHOWTO[M].[S.1.]:O’Reiuy& Associates,20o0.
[5] 龙飞,李晓帆,蔡志开,等.一个利用多线程及重叠I/O实现的串口通信类[J].微机发展,2004,14(3):51—53.