吴晶晶,唐彦冲,曾俊莹,路韵逸
(安阳工学院,河南 安阳 455000)
在21世纪初我国开始出现以Mifare1 卡(NXP Mifare1系列,以下简称M1 卡)为载体的自动收费系统,例如食堂饭卡系统、门禁系统、洗浴室使用的水卡系统等。它的出现解决了卡中无电源和不需要接触使用的难题,在电子器件领域内是一个重大突破。但近年来不断有各种新闻报道称各高校的水卡系统被破解,这反映出了过去普遍使用的旧的水卡系统相对而言更容易被破解。
对于M1 卡的防破解有很多种方法都可以实现,通过比较和结合实际情况,本设计使用加密且不易破解的国产CPU卡来代M1 卡作为水卡系统的载体。国产CPU 卡也叫作智能卡,卡内集成了微处理器CPU、存储单元、用户数据存储器EEPROM,以及芯片操作系统COS。CPU 卡内置的COS 系统具有严格的数据保护和卡片锁死功能,从根本上杜绝了被破解的弊端。另外在价格方面目前的CPU 卡已经和M1 卡相差无几,并且CPU 卡的读写设备和M1 卡的读写设备是互相兼容的,所以使用CPU 卡代替M1 防止水卡系统被破解是一个非常适合的选择。
另一方面,旧的水卡系统的注册和充值功能都需要专人在特定的地点使用特定的机器来完成,浪费人力、物力和时间,而本设计设计的自主充值功能使用户能在线上进行充值。只需要使用手机APP 上扫描充值设备上的二维码,就可以完成充值,这样不仅方便了用户,还节省了人力物力成本。
旧的水卡系统一般是使用的普通M1 卡作为信息的载体,由于自身存储设计的缺陷,使得M1 卡可以通过多种方式被破解,例如暴力破解法、克隆卡片法、密钥流窃听等等。
结合本校洗浴室的实际情况本设计决定采用CPU 卡方式完成水卡系统的防破解。使用CPU 卡代替M1 卡有很大的优势,其一是CPU 卡的读写设备和M1 卡的读写设备是兼容的,非接触的CPU 卡和M1 卡都符合ISO 14443 TypeA标准,两者的工作频率是一样的,使用CPU 卡只需要修改设备读写部分的软件代码就可以实现防破解的功能。其二是CPU 卡安全性高,具有超过最大错误次数锁死功能,并且用户卡和读卡系统之间需要多次的互相密码认证,提高了系统的安全性能,对于防止破解有很好的效果。
使用CPU 卡替代的方式可以在不改变洗浴室的硬件,只改变设备的软件代码完成设备的升级,这种方式是最方便和经济实惠的,所以最终本设计决定采用CPU 卡替代的方式实现水卡系统的防破解。
该系统首先要由系统管理员通过C#上位机对CPU 卡进行注册,软件将用户信息写入SQL Server 数据库中,并通过发卡设备完成CPU 卡的初始化,只有初始化过的CPU卡才可以在整个系统中使用,其他没有初始化过的CPU 卡内部没有对应的存储文件是无法使用的。在管理员那里完成注册后,用户可以通过手机号和初始密码6 个0 登录手机APP,登录手机APP 后显示当前卡片的余额和个人的信息,用户想要充值的时候只需要扫描充值设备上显示的二维码就可以完成充值。手机APP 和自助充值设备之间的通信,本系统是借助OneNET 云平台实现的。手机APP 和充值设备之间通过MQTT 协议连接到云平台,云平台将对应的信息转发到设备上完成整个充值设备之间的通信。
消费设备因为其工作环境的影响将其脱机处理,只有卡片和设备进行通信。当用户想要洗浴时只需要将CPU 卡放到读卡区域,然后点击按钮继电器就控制水流的电磁阀工作流出热水。水卡系统整体的结构框图如图1所示。
图1 系统整体的结构框图
发卡设备硬件并不复杂,需要实现的主要功能就是完成CPU 卡的读写,因此只需要一个单片机主控MCU 和RFID读写外设。根据设备的需求,主控这里选择STC8A8K,CPU 卡的读写芯片选择常见的MFRC522。发卡设备通过串口接收到C#上位机发来的命令后,根据这些命令,MFRC522 发送相应的初始化CPU 卡文件系统的详细命令,从而完成对CPU 卡的初始化。
自助充值设备需要实现的基本功能是和手机APP通信,并将充值的金额写入到CPU 卡中。这里需要用到LCD 显示屏、MFRC522 芯片以及无线通信的模组SIM800C。由于自助充值功能是需要二维码的,因此主控芯片的选择需要选择容量大一点的芯片,所以这里本设计选择了频率为72 MHz、512KFlash 的大容量芯片STM32F103ZET6。
整体设计是单片机利用SIM800C 通信模组完成和OneNET 云服务器的通信,再利用云服务器间接的完成和手机APP 之间的通信。完成通信后再利用射频模块实现手机读写CPU 卡中的信息,完成水卡的充值。由于充值设备不一定是唯一的,这时候本设计要利用二维码确定具体是的那一台充值设备和手机之间建立了通信。为了更好显示二维码和交互信息,本系统采用2.8 寸彩色液晶屏显示信息。液晶屏的使用能够更加显示更加丰富的信息,而且还能给用户更好的体验。
自助充值设备需要实现的基本功能是用户插入卡片能够使用水流进行洗浴,这个功能的实现也不复杂,这里选择和发卡设备一样的主控MCU(STC8A8K),显示部分使用0.96寸的小彩屏显示CPU 卡信息和当前设备运行状态。当用户插入卡片后,射频读写模块读取卡片的信息,屏幕自动亮起显示当前水卡的卡号、剩余金额等信息。想要用水时,需要按下取水按键,然后电磁阀会开启用户就能使用。系统的计费为了方便采用的是计时的方式,取水后每秒钟扣费0.01元。卡片离开或者卡内余额使用完,设备会自动关闭电磁阀。
CPU 卡是非接触智能卡,它符合ISO 14443 TypeA 标准。本设计使用的MFRC522 射频读写芯片是也符合CPU 卡的读写标准,是可以完成和CPU 卡的通信。MFRC522 芯片和单片机芯片之间的通信是使用是4 线SPI 的方式,在SPI的基本通信完成后本设计通过MCU 发命令给MFRC522 完成初始化和复位后就进行CPU 卡和RC522 的通信。RC522和CPU 卡通信的时候需要先进行寻卡操作,只有在寻找到CPU 卡后,在通过外部认证、建立文件、写入信息等操作完成CPU 卡的初始化,只有经过初始化的CPU 卡才能在系统中使用。
MFRC522 与CPU 卡通信的流程图如图2所示。
图2 MFRC522 与CPU 卡通信的流程图
C#上位机和发卡设备之间这里使用串口(UART)完成它们之间的通信。UART 是一种串行数据总线接口,它能够实现全双工通信,通常会在嵌入式设备中使用。本系统使用的UART 数据格式是1 个起始位,8 个数据位、0 个校验位、1 个停止位。通过UART 可以完成C#上位机和发卡设备之间的通信,在此基础上需要规定具体的通信协议命令,本设计使用两个数字加特殊字符的方式规定发卡命令。C#上位机根据用户的操作通过串口下发规定好的命令,发卡设备接收到命令就会执行相对应的命令,从而完成用户CPU 卡的注册。
要实现自助充值功能,就需要让手机APP 和单片机之间完成通信。经过多方的比较,本设计最终决定选择中国移动的OneNET 云平台。手机自带数据流量是可以直接和OneNET 云平台完成通信的,但是单片机本身是不可以接入互联网的,因此需要利用通信模组实现联网功能,因为系统本身的数据量并不大,所以本设计选择2G 信号的SIM800C通信模组完成和OneNET 的通信。
SIM800C 模组和MCU 之间是通过UART 完成通信的,其UART 的配置方式和上文的相同,不同的是SIM800C 的联网功能是通过AT 命令实现的。SIM800C 的使用是通过AT 进行设置,设置的步骤是SIM 卡先注册上网络,然后设置成透传模式,最后通过MQTT协议连接到OneNET云平台。
SIM800C 连接OneNET 云平台的流程图如图3所示。
图3 SIM800C 连接OneNET 云平台的流程图
二维码又称QR Code 一种是很流行的编码方式,它用黑白块的排列存储的信息,比普通的条形码能够存储更多的信息,同时也具有更好的抗干扰能力。本设计用二维码存储充值设备的信息和当前卡片的ID 号,然后手机APP 扫描获取到后,发送充值命令完成自助充值的功能。
系统生成二维码功能是移植了官方提供的C 语言标准库实现的,由于生成二维码的算法太过复杂这里不展开做详细的解释,只说明移植的步骤。单片机移植生成二维码的库并不复杂,只需要将库函数的.C 和.H 文件添加到工程中去,然后找到源码文件,并找到在文件中找到bool EncodeData()函数,这个函数就是生成二维码的核心函数,用法也很简单,只需把需要转换的字符作为参数传入即可得到生成的二维码数组,然后再根据数组的中的0 和1 显示对应的黑白方块就能实现显示二维码了。
生成充值二维码的流程图如图4所示。
图4 生成充值二维码的流程图
水卡注册需要C#上位机和发卡设备一起测试,在打开上位机软件后,上位机软件需要先和发卡设备建立好串口连接,然后将CPU 卡放到读卡器的位置,点击寻卡按钮成功寻到卡后,会在软件上显示当前的卡号,录入个人信息后点击注册就可以完成CPU 的初始化了。寻卡成功后的界面如图5所示。
图5 寻找到的CPU 卡
水卡注册需要手机APP 和自助充值设备一起测试。首先自助充值设备需要和OneNET 云平台建立连接,然后用户利用手机号和密码登录手机APP。用户使用CPU 靠近读卡区域,然后设备会自动寻找CPU卡,寻找到CPU卡后会显示,显示当前的卡片余额和卡号等重要信息。如果用户想要向水卡卡里充值,需要点击充值按钮,液晶屏幕上会自动显示充值二维码。这个时候我只要使用手机APP 扫描这个充值二维码,就能识别到要充值的CPU 卡,然后再点击充值,选择想要充值的金额,完成充值。当充值完成后,充值设备自动返回到显示信息界面。当充值设备没有CPU 卡时,手机APP 上的充值功能是不可以使用的。经过测试,自助充值各个步骤都可以实现,并运行稳定,说明自助充值功能能够实现。
显示充值二维码的界面如图6所示。
图6 显示的充值二维码的界面
水卡消费设备独立运行不需要联网,测试方式非常简单,卡片放到读卡区域,0.96 寸的液晶彩屏会自动显示当前卡片的余额、卡号等信息。当用户想要使用时,只需要按下取水按钮,控制水流的电磁阀就会开启,系统就会开始扣费。当CPU 卡离开时,电磁阀自动关闭,屏幕自动进入息屏状态。经过测试,消费模块的各个功能良好,能够完成正常的出水和扣费以及CPU 卡信息的显示。当用户将水卡放到消费模块上,液晶屏会自动亮起并显示当前卡片上的余额,按下按键1 电磁阀打开有水流水,同时开始每秒钟扣除0.01 元,当卡片移走时屏幕自动熄灭,电磁阀关闭。消费设备有水卡正在消费的界面如图7所示。
图7 水卡正在使用的界面
本文主要描述了基于RFID 的防破解水卡系统的研究意义、实现过程以及设计方法。本设计通过RFID 技术完成了水卡系统的升级,并通过使用CPU 替换M1 卡的方式确保了系统的安全,并在原来的基础上增加了自助充值功能,方便了用户和商家的使用。在未来发展前景中,计划将本文所研究的防破解水卡应用到各大高校中,并对其进行进一步的延伸,例如防破解门禁卡、防破解校园卡、购物卡等等。