信息化 频道

实现以RFID卡仿真磁卡的模块设计

    4 磁卡的磁道及ABA编码

    根据ISO有关标准规定,磁卡或存折上的磁条划分为3个磁道.第2道数据标准最初由ABA规定,第2磁道上记录信息包含SS、PAN、FS、ADATA、ES和LRC等6项内容.其中,SS为起始标志,其代码0BH;PAN为主帐号;FS为域分隔符0DH;ADATA为附加数据;ES为结束标志,其代码0FH;LRC为纵向冗余校验字符,低4位分别是从SS到ES各字符的值按位异或操作的结果.具体应用时可根据实际情况做些修改,在本模块中用RFID卡的序列号取代PAN,无需FS域和ADATA域.在SS之前及LRC之后都增加若干同步时钟.

    ISO有关标准还规定了该磁道编码字符集(表1).

    表1 第2道数据编码字符集

    
    
    表1中各字符编码由BCD码(4位二进制数)另加1位奇校验表示,即用P、B3、B2、B1、B0表示1个十进制位或控制/标志符,且P+ B3+B2+B1+B0=1.如ES(结束标志)的代码是0FH,加了校验的BCD码则为1FH,对应的字符是‘?’.

    刷卡时按上述规定解码磁卡信息,各字符的装配顺序由低位到高位.这需要磁头、放大整形电路、时钟与数据分离解码电路(可用专门电路或软件解码),解码后由3根信号线CLK、DATA和/CLD 把信息传递给有关处理单元进行解释处理.本模块并不需要解码磁卡信息,但是要求仿真ABA磁卡信息,并由CLK、DATA、/CLD信号线输出.3根信号线的用途如下.(1)CLK(CLOCK)同步时钟信号,1个周期对应1位二进制.(2)DATA数据输出端,在各CLK周期中间位置之前,确定其输出电平.若发送“0”,则DATA置为高;反之,发送“1”则DATA置为低.(3)/CLD(CARD LOAD),有效(低电平)时表示已检测到磁卡,正在刷卡.接收处理单元应做好接收准备.它必须比CLK、DATA先有效,后撤消.

    手工刷卡速度范围一般是10—120 cm·s-1,对应的CLK周期变化范围很大.为了便于后续处理,仿真输出可取一个稳定的较大值,满足绝大多数应用系统的要求,因此,本模块设定为3 ms.

    5 模块的软件设计

    参照图1,U2270B接收114001的信息,并通过U2270B的Output脚把解调的数据输出给AT89C2051 进行解码.AT89C2051除了对H4001卡信息解码,还需进行二进制到十进制数据转换,仿真ABA编码格式输出数据等.本文介绍AT89C2051软件核心部分的设计思路和程序流程.

    5.1 H4001输出的64位数据的解码

    参照图2的Manchester编码,其解码方法如下:在每个位时钟周期的中间位置检测电平的变化情况,如果检测到电平由低变高则该位解码为“0”;反之,电平由高变低则解码为“1”.若未发生变化则视为信号异常进行出错处理.

    这里存在如何检测、界定时钟周期的起始位置、中间位置问题,各种卡的做法并不一致.H4001没有专门的硬同步信号,不能检测特殊信号作为起始标志,而是规定64位数据位的前9位固定为全“1”,最后1位设定为“0”,作为起始和结束标志或设定为同步信息.分析连续的若干位“1”和连续若干位“0”,其波形非常相似,所以实际解码时,应该先检测到1位“0”,再接着检测连续的9位“1”,那么可以肯定,后续的54 个信息位便是40位真正的数据和14位相关的奇偶校验位,有关数据排列顺序见文献[4].可以想象,这里不应该实际上也不可能再次出现1位“0”后跟随连续的9位“1”.接下来是最后1位,必须是“0”,如此继续下一循环,否则便是出错.为了提高效率,可以在循环内边检测校验,边解码保存H4001卡的信息,其程序流程如图4所示

    

    图4未对解码得到的40位二进制(BIN)数据进一步分解.其中前8位是客户标识代码,用于区别不同的系或客户;后32位表示该卡的序列号,一般需要转换为l0 位的十进制数.例如,在该模块上检测到某卡的64位二进制数据串如下:111111111 00011 10001 00000 00000 10010 10100 00000 10111 10010 0001l 1001 0.其中最先出现的是起始标志9位“1”,然后l0组5位的数据,各组的最后1位是本组的偶校验码(从实际解码得到的数据看,它们都是正确的),接着的1组4位数据“1001”是这l0组数据的纵向冗余校验码(LRC)或偶校验码,最后1组是1位的结束标志“0”.第1组、第2组数据“0001”、“1000”(剔除校验码,下同)代表客户编号或版本号,第3组到第1O组数据是以二进制表示的本卡号:0000 0000 1001 1010 0000 1011 1001 0001(高位在先),转换成十进制,得到的序列号是0010095505.再分别计算这l0组第1,2,3,4位的偶校验码,应该分别是1,0,0,1,正好是解码得到的LRC.所以,这64位数据串是正确读出的0010095505号H4001 RFID卡上数据.

    5.2 仿真ABA格式磁卡的解码输出

    在得到l0位十进制的序列号后再仿真ABA磁卡格式数据输出.先把每1位十进制数位以BCD码再加1位奇校验码表示(统称字符),输出时在这些表示序列号的字符前后还需增加其他附加字符或代码,用作同步信号、起止标志、校验码.典型的输出卡号的程序流程如图5所示.

    

    无数据输出时,/CLD信号应一直为高电平,检测到正确卡号后准备发送数据时把它置低,并维持到发送过程结束;CLK信号线在延时3—5 ms后开始以设定的频率发出占空比为50% 的方波(时钟),直到全部发送完毕;DATA在具体数据的前后,要发送5位以上“0”,作为同步信号,起始标志0BH(加校验位,发送顺序ll010),数据之后发送结束标志0FH(加校验位,发送顺序11 1 11),5位LRC,还有5位以上“0”.⋯0’的表示方法是在CLK上半周结束前,把DATA线置高,一直维持到下一CLK周期;“1”则是在CLK上半周结束前,把DATA线置低,一直维持到下一CLK周期.

    6 结束语

    根据上述方案设计的模块能较好地读取H4001的信息并仿真ABA磁卡格式输出数据(卡号).在调试过程中发现,即使卡片没有进人模块发送与接收的有效区域,或者说模块未真正收到H4001的信息,在U2270B的OUTPUT端也偶有信号输出,但是没什么规律;在卡片进人有效区后,信号渐渐变得有规律,信号周期接近标准的512信号.在判断“O1”信号时一定要确认其周期在512左右,如果不合则应舍去,继续等待,直到检测出满足符合周期要求的“O1”才开始接着往下解码,提取数据.

    另外,不排除在接收过程中由于干扰等因素造成错误.由于H4001不断循环发送64位卡内信息,因此,可以直接放弃本循环的解码与转换,而等待下一轮(相隔约33 ms)再进行解码与转换.这样牺牲33 ms时间换取低误码率、漏码率,整体性能远超出磁卡阅读器.这种模块实现方案性能可靠,具有高性价比,完全满足应用需求.

0
相关文章