资源描述
中南民族大学毕业论文
目录
摘要: 1
Abstract 1
1、引言 2
1.1、移动支付的现状及前景 2
1.2、课题研究的意义 2
1.3、系统结构框图 2
2、Mifare 1 S50卡 3
2.1、Mifare 1 S50卡工作原理 3
2.2、MF1卡的特性和存储结构 3
2.3、MF1卡的控制属性 4
3、读写器的设计 7
3.1、MF RC522概述 7
3.2、引脚说明 7
3.3、特性和功能框图 8
3.4、读写器硬件电路 10
4、嵌入式系统 11
4.1、嵌入式系统和物联网 11
4.2、S3C2440A的简介 12
4.3、S3C2440A硬件电路 12
4.4、开源Linux的移植 13
4.5、SPI驱动和wifi移植 13
5、系统软件设计 14
5.1、系统的软件流程 14
5.2、读写器的操作程序 15
5.2.1、数据传输指令 15
5.2.2、验证指令 15
5.2.3、读写块操作 16
5.3、服务端程序 16
5.4、客户端程序 18
5.4.1、读卡操作演示 19
5.4.2、充值操作演示 21
5.4.3、扣费操作演示 22
6、总结 23
致谢 24
参考文献 25
附录 26
III
基于RFID移动支付终端的设计与实现
陈福林
摘要:本设计将ARM、linux的嵌入式技术与RFID技术相结合,对于实现移动支付终端的低功耗、便携式和网络化具有特别的意义。首先是采用MF RC522芯片设计与制作读写器,实现对Mifare卡的读写操作;其次是使用S3C2440A芯片和linux搭建嵌入式系统,作为各模块沟通和处理的枢纽;最后是运用开发软件编写服务端和MFC、Qt界面客户端的程序,使得各模块通过SPI和wifi通信的方式协同工作。结合实物和软件的设计、制作与调试,实现了一个性能稳定和使用灵活的可移动终端系统。
关键词:移动支付;RFID;ARM;linux;wifi;Mifare
Design and implementation of mobile payment terminal
based on RFID
Abstract: This design combined RFID technology with embedded technology of ARM、Linux,that will have a special meaning in achieving low-power,portable and networking of the whole system. First, using the MF RC522 chip to design and making the reader, to realize the read-write operation for Mifare card; Second, using the S3C2440A chips and Linux kernel to construct the embedded systems, which serves as the communicating and the processing hub of every module. Finally, using the developed software to write the server and MFC、Qt interface client program makes every module working together by way of SPI, network and serial communication. Combining material object with software designing, producting and debugging, achieving a flexible and stable performance mobile payment terminal.
Key words: mobile payment; RFID; ARM; Linux; wifi; Mifare
1
1、 引言
1.1、 移动支付的现状及前景
移动支付作为支付手段的一种具有很多的优点,比如消费者可以不必携带巨额资金去消费,不用担心资金丢失被盗等安全性问题。既满足方便了消费着也可以扩大内需。它的应用已经涉及到我们生活的方方面面,是我国通向信息化时代的一个必不可少的工具。移动支付终端种类日益丰富,但与此同时也带来了诸多的问题,比如联网质量差、带宽低,处理能力差,续航时间短等突出问题。未来移动支付终端会随着国内移动互联网的发展,以及经济技术的进步,朝着多元化的方向发展,比如wifi、3G或4G通信,更为持久的续航和强大的处理能力等方向[1]。
1.2、 课题研究的意义
随着物联网和移动通信技术的发展,移动支付终端的应用市场潜力巨大[2]。目前移动支付终端的发展向着便携化、小型化、集成化、智能化和网络化等方向迈进。RFID和嵌入式作为移动支付终端的两个关键技术,势必也要适应这一趋势要求,即满足长时间的续航、处理和联网等能力,实现一个可以不依赖于场地和网络电缆铺设,以及需要设置多个支付点的应用场景。然而目前广大消费者使用的银行磁条卡容易被复制,存在很大的安全隐患,未来全国银行卡将推广芯片卡[3],本课题就选用了Mifare 1 S50芯片卡;再者多数的支付终端都是基于裸机程序的单片机充当的控制系统,无法实现复杂的智能化和网络化的功能。这些不足使其无法满足上述的发展要求。正是基于这些考虑,设计一个结合ARM和linux嵌入式技术与RFID技术的移动支付终端更具有现实意义[4]。
1.3、 系统结构框图
一个典型的移动支付终端是由射频标签(如Mifare 1 S50卡)、读写器和计算机系统构成。本设计中使用了Mifare 1 S50卡和MF RC522作为其射频标签和读写器部分,计算机系统可以包含嵌入式系统和PC机。系统结构框图如图1所示。嵌入式系统的核心构件是S3C2440A的ARM芯片和嵌入式linux,嵌入式系统与读写器和PC机之间的通信方式分别采用SPI、UART或wifi的通信方式。用户可以通过嵌入式系统上的触控屏操作QT客户端程序进行支付,也可以通过运行在PC机上的MFC客户端实现支付、充值等人机交互过程,如充值操作。
图1 系统结构框图
2、 Mifare 1 S50卡
2.1、 Mifare 1 S50卡工作原理
Philips的Mifare 1 S50卡(以下简称MF1卡)是射频标签的一种,内部集成有MCU、8K位的E2PROM和天线线圈[5]。MF1卡内部的LC串联谐振电路接近读写器识别区域时,可以接收来自读写器13.56MHz频率的电磁波,并在其激励下产生共振,使得谐振电容聚集电荷,电荷通过单向电子泵,送到存储电容中储存起来,存储电容中的电荷累积到2V以上后,就可以作为一个电源向MF1卡供电。这样MF1卡就可以完成一些基本的功能。
2.2、 MF1卡的特性和存储结构
MF1卡具有很多优秀的电器特性[6],参见表1所示。
表1 MF1卡的电器特性
特性
容量大小
8Kbit,即1K字节
扇区数量
16个扇区
块的数量
一个扇区4个块,一共64个块,其中第0块固化了卡片信息
访问控制
有密码和访问控制
卡序列号
序列号具有唯一性
防重叠
支持多卡片同时操作
工作温度
工作温度范围在-20℃~50℃
工作频率
工作频率为13.56MHz
通信速率
通信速率是106Kbps
读写距离
可达80mm
读写次数
写有105次,读次数不限
MF1卡的16个扇区共有64个块,扇区各有4个块(块0~块3),其中第0扇区的块0已经固化有芯片商、卡片商和卡片序列号码。。扇区的前3个块(块0~块2)为数据块用来存贮用户数据;每一个扇区都有自己的控制属性,这个属性由扇区中的块3决定。扇区控制块有16字节,前6个字节为密码A,紧接着是4个字节(32bit)的存取控制条件,之后的6个字节是密码B,每个扇区的控制块3结构都是一样的,如下表2所示。
表2 扇区控制块结构
各区控制块3 结构
字节号
0 1 2 3 4 5
6 7 8 9
10 11 12 13 14 15
控制值
FFFFFFFFFFFF
FF 07 80 69
FFFFFFFFFFFF
说明
密码A
存取控制
密码B
2.3、 MF1卡的控制属性
彼此独立的扇区的密码和存取控制条件可以做相应的修改,因为每个扇区都是独立的[7]。任意一个扇区的数据块和控制块的读写条件,取决于该扇区的存取控制条件区域中的3bits控制位 [8]。这3个比特位用“Cxy”表示,其中x表示任意扇区中的某块的块号,y表示某块的第几个控制位,对于任意一个扇区而言有表3和表4所示的关系。
表3 控制位定义Cxy
块0
C01
C02
C03
用户数据块,(0区0块除外)
块1
C11
C12
C13
用户数据块
块2
C21
C22
C23
用户数据块
块3
C31
C32
C33
密匙存取控制块
表4 存取控制字节中的控制位
位号
字节号
7
6
5
4
3
2
1
0
字节6
C32_b
C22_b
C12_b
C02_b
C31_b
C21_b
C11_b
C01_b
字节7
C31
C21
C11
C01
C33_b
C23_b
C13_b
C03_b
字节8
C33
C23
C13
C03
C32
C22
C12
C02
字节9
备用
所属块
块3控制位
块2控制位
块1控制位
块0控制位
块3控制位
块2控制位
块1控制位
块0控制位
注:"_b" 表示取反。
任意一个扇区的数据块(0扇区的块0除外)的存取控制权限,取决于块3中的3个控制位,以及对应的3个取反的控制位。当用户需要访问某个块时,会依据3个控制位的设置决定是否需要密码A或者密码B,亦或者不可以操作。下面通过表5介绍访问权限,表中的KEYA|B 表示密码A或B,NEVER表示不可以操作,其中3个控制位为000的是出厂默认设置。
表5 数据块的存取控制权限
Cxy
读
写
加值
减值,初始化
0 0 0
KEYA|B
KEYA|B
KEYA|B
KEYA|B
0 1 0
KEYA|B
NEVER
NEVER
NEVER
1 0 0
KEYA|B
KEYB
NEVER
NEVER
1 1 0
KEYA|B
KEYB
KEYB
KEYA|B
0 0 1
KEYA|B
NEVER
NEVER
KEYA|B
0 1 1
KEYB
KEYB
NEVER
NEVER
1 0 1
KEYB
NEVER
NEVER
NEVER
1 1 1
NEVER
NEVER
NEVER
NEVER
上面讲述了任意扇区中数据块的访问权限,下面表6列举了控制块块3的存取控制权限[9]。对于块3的操作要小心谨慎,以免扇区被锁死!
表6 控制块的存取控制权限
控制位设置值
密码A权限
存取控制权限
密码B权限
C31
C32
C33
读
写
读
写
读
写
0
0
0
NEVER
KEYA
KEYA
NEVER
KEYA
KEYA
0
1
0
NEVER
NEVER
KEYA
NEVER
KEYA
NEVER
1
0
0
NEVER
KEYB
KEYA|B
NEVER
NEVER
KEYB
1
1
0
NEVER
NEVER
KEYA|B
NEVER
NEVER
NEVER
0
0
1
NEVER
KEYA
KEYA
KEYA
KEYA
KEYA
0
1
1
NEVER
KEYB
KEYA|B
KEYB
NEVER
KEYB
1
0
1
NEVER
NEVER
KEYA|B
KEYB
NEVER
NEVER
1
1
1
NEVER
NEVER
KEYA|B
NEVER
NEVER
NEVER
下面以MF1卡的存取控制字的出厂默认值“FF078069”来分析其对数据块的读写的作用,用Cxy来表示:C01,C02,C03=000;C11,C12,C13=000;C21,C22,C23=000;C31,C32,C33=001,密码A和密码B的12个字节都是0xff。对应的表4中的具体实例就是表7所示的内容。
表7 块3存取控制位的默认值
Bit#
7
6
5
4
3
2
1
0
字节6
1-
1-
1-
1-
1-
1-
1-
1-
字节7
0
0
0
0
0-
1-
1-
1-
字节8
1
0
0
0
0
0
0
0
C3y
C2y
C1y
C0y
C3y
C2y
C1y
CXx0
注:“-”号表示取反。
从表7所示块0~块2,即控制块的3个控制位都是“000”,对照表5知,读写和值操作都是需要密码A或B的。但是块3,即控制块的3个控制位是“001”,对照表6所示,任何条件下都不能对密码A进行读操作,但是可以在验证密码A的条件下可以读写存储控制和密码B的字节。
3、 读写器的设计
3.1、 MF RC522概述
MF RC522是飞利浦公司开发出的一款能耗低、成本低和封装小的非接触式射频芯片[10]。满足ISO/IEC 14443 TYPEA的通信协议和多层应用,拥有的调制与解调技术稳定而高效,为了验证MF1系列产品提供了快速的CRYPT01加密算法,最高速率可以达到424Kbit/s,同时有很好的错误检测(奇偶校验和CRC校验)的能力。还提供了很多通用的接口,例如SPI、UART和I2C接口,实现了更为方便的操作和功能扩展。由于上述的这些优点,MF RC522广泛的适用于公交车和食堂刷卡收费,便携式 图2 MF RC522的引脚图
移动设备和 “三表”等应用场景。
3.2、 引脚说明
MF RC522的引脚参见图2。MF RC522共有32个引脚,可以分为若干
类。详情参见表8所示。
表8 引脚说明
引脚类型
引脚名
说明
电源类
引脚
TVDD,TVSS(12脚,10,14脚)
驱动天线电源
AVDD,AVSS(15脚,18脚)
模拟电路部分的电源
DVDD,DVSS(3脚,4脚)
数字电路部分的电源
VMID(16脚)
天线参考电压
天线类
引脚
TX1,TX2(11脚,13脚)
发送引脚。MF RC522通过TX1和TX2发送13.56MHz的能量载波
RX(17脚)
接收器引脚。
复位类
引脚
NRSTPD(8脚)
管脚为低电平时,切断内部电流,关闭振荡器,断开输入管脚与外部电路的连接。管脚的上升沿到来时内部复位
晶振引脚
OSCIN,OSCOUT(21脚,22脚)
振荡器引脚。MF RC522使用27.12MHz的晶振
数据和控制类引脚
I2C(1脚)
I2C使能
IRQ(23脚)
中断引脚
SDA(24脚)
串口时是串行数据线,I2C接口时是数据信号引脚, SPI接口时是时钟信号引脚
D1~D7(25~31脚)
不同接口的数据管脚包括测试断开、I2C,SPI和UART接口
EA(32脚)
外部地址。该管脚用来编码I2C地址
还有其他一些引脚不提及。本课题使用的是SPI接口。这里我们例举一个MF RC522的一个典型的电路图,如图3所示,本文也是按照这种典型的外围电路的连接方式,不过接口电路采用了SPI接。
图3 MF RC522电路图
3.3、 特性和功能框图
MF RC522内部集成有调制与解调电路,只需使用少量的器件就能构成一个外围的电路,具有64字节的收发FIFO缓冲区、可变的中断模式和可编程的定时器,支持ISO/IEC 14443 TYPEA 和Mifare®的通信协议,与MF1卡通信的距离最高可以达到80mm,有212Kbit/s或424Kbit/s的通信速率。可以进行classic和Mifare®的加密方式。它还支持10Mbit/s的SPI接口、快速(400Kbit/s)或高速(3400Kbit/s)模式的I2C接口和串行UART接口通信方式。由于有温度传感器,可在内部温度过高时自动停止内部天线驱动模块,即关闭RF场。它还具有符合ISO/IEC 14443 TYPEA和CCTITT 协议,16位长的CRC和奇偶校验的功能。2.5V和3.3V低电压低功耗的设计,同时还具备三种节电模式,分别是硬件掉电、软件掉电和发送器掉电。为了避免模块间的干扰,使用了相互独立的多组电源供电,从而提高了稳定性。内部振荡器连接27.120MHz的晶体,工作温度范围广(-30~+85℃)和超小体积的封装(5mm×5mm×0.85mm)。
图4为MF RC522的功能结构框图,图中MF RC522芯片内包含多种接口,如SPI、I2C和串行UART接口。本课题选用了SPI的接口,下文会重点讲解。由于它
图4 MF RC522功能结构框图
与MF1卡相互认证后的通信是经过加密的,为此提供了快速CRYPTO1加密算法的单元。状态寄存器可以反映其工作状态,并且通过控制寄存器来控制其工作。从图2知其具有7比特位的并行数据接口D1~D7,并/串行的转换功能实现其与MF1卡的比特流通信。它不光可以收发以字节为单位的数据,同时可以收发若干个比特位的数据,这仰仗于位计数器。MF RC522提供了强大的CRC和奇偶校验功能,以及对数据的加密和解密功能,模拟电路部分包含射频收发器,且无需独立增加有源电路就可以使天线工作。
3.4、 读写器硬件电路
RFID读写器模块的主芯片是飞利浦公司的射频芯片MF RC522,该芯片的SPI通信接口主要使用4条线:MISO、MISI、SCLK和NSS。除了通信线外,还有两条线,一条是IRQ,用于中断,使用可选;另一条是REST,用于复位。只需一种电源,即3.3V。正如我们在前面介绍MF RC522时所说的那样,这里它的电路基本上和MF RC522的datasheet提供的经典连接方法一样[11]。如图5所 图5 MF RC522电路
示的MF RC522图形略有简化,引脚序号没有给出,其中的“ ”为不需要连接,但是又为了规避软件的电器检查而添加的一个忽略此出检查的意思。由于MF RC522是PGA的封装形式,对于人工焊接这个芯片确实是一件不易的事情,所以有必要尽可能的把芯片的封装画的精确,以免本来间距就很小的引脚无法对齐。芯片底部有一个3x3mm的方形接地的焊盘,不要遗漏了。
MF RC522的收发模块的天线,是在PCB板上画的若干个首尾相连的线圈构成,形成一个电感。这里我们的线圈面积近似4x4cm,圈数为4圈。发送端是通过TX1和TX2经过一些电感和电容连接到天线上的。RX引脚接收来自MF1卡的载波信号。VMID为内部参考电压。天线模块的电路图参见图6所示。
图6 天线模块
晶振电路较为简单(如图7所示),晶振频率为27.120MHz,通过OSCOUT和OSCIN两个端口连接到MF RC522芯片上。
图7晶振电路
图8所示的电路同下面S3C2440A硬件电路中讲到的GPIO排针座相对应的是MF RC522的GPIO排母接口电路。GPIO排母两个孔径间间距是2mm。本课题涉及的硬件电路图见附录。
图8 排母电路
4、 嵌入式系统
4.1、 嵌入式系统和物联网
嵌入式系统就在我们身边,我们人手一部的smartphone就是一个嵌入式系统。可以说现在对于嵌入式系统的研究和学习浪潮已经席卷了校园,从一开始的接触的STC89C51和MSP430,以及对更为复杂的STM32和S3C2440A研究和学习,让我们充分地认识到这门技术对于我们的生活、工作和娱乐有着非同寻常的影响。随着电子和制造业市场需求的牵引,嵌入式系统也走向了一个更高的层面。近来google公司又推出了一些可穿戴的设备,如google眼镜和google手表,让人不禁瞎想今后的生活会是什么样的呢?未来就是一个物联网的世界。从作为物联网重要组成部分的嵌入式技术视角来看,更容易理解物联网的本质和内涵[12]。可见研究和学习嵌入式意义重大。在ARM体系架构的处理器和开源linux系统的嵌入式产品愈来愈流行的今天,所以本课题选用了以ARM和linux的嵌入式系统为移动支付终端的计算机系统的控制核心[13]。
4.2、 S3C2440A的简介
ARM体系架构的处理器种类繁多,例如苹果、三星和国内手机厂商的处理器基本上都是基于ARM体系架构的,例如,华为的手机使用了自主研发的基于ARM体系架构的海思处理器。ARM体系架构的微控制器重要的优点是功耗低、性能优异和成本低等。本课题选用的微控制器使用了三星的S3C2440A[14],其网上的资源丰富,特别适合初学者。它是以ARM920T为核心的,芯片内部集成有多个外围模块,如SPI控制、网络控制和串口控制模块等等。采用了MMU和AMBA总线架构。它的综合优点适合于对功耗和成本敏感的应用。
4.3、 S3C2440A硬件电路
S3C2440A微控制器集成的外围模块众多,为了便于讲解和查看,故将S3C2440A微控制器中的SPI控制模块的接口电路独立取出来,如图9所示。图中有四根引线GPE13、GPE12、GPE11和GPG10分别对应的是SPI的CLK、MISO、MOSI和NSS。S3C2440A芯片和NORflash和NANDflash等核 图9 SPI控制模块电路
心的芯片统一放置在核心板上,而底板则放置一些次要的器件,如串行UART的芯片RS232和串口接头和网络芯片DM9000和它的网络接头等。核心板与底板独立开来是为了便于在出现问题更换或者进行硬件升级的时候不至于相互影响。S3C2440A中的SPI的接口电路通过核心板插座引导到底板上的一个GPIO排针座上,参见图10所示。图中有些无关紧要的端口这里没有表示出来。
图10 GPIO排针座
4.4、 开源Linux的移植
嵌入式系统目前有linux、contiki和WinCE等,linux系统不仅可以移植到PC上亦可以移植到一些嵌入式设备上,它的显著优点就是它的开源和免费,以及丰富的网络资源。根据特定用途的计算机平台及其硬件特点,对linux内核系统进行一种修改和裁剪[15],使之能满足这个平台所需要的功能,称其为嵌入式linux。目前很多公司和组织支持linux项目,并向linux添加补丁,像IBM、摩托罗拉、英特尔。Google公司就开发出了基于linux的Android系统。再有三星就为它的S3C2410平台提交过linux的代码。本文使用的是S3C2440A,但是与S3C2410相近,可以对linux中支持的S3C2410代码进行修改和裁剪,以适应S3C2440的个性特点。
linux内核中并没有默认支持S3C2440A,而是默认支持S3C2410[16]。由于S3C2410和S3C2440A架构相差无几,因此需要根据S3C2440A的硬件特点,以linux支持的S3C2410模板选择性的对linux内核进行修改和裁剪,如果想具体了解相关的移植过程可以参考我的fulinux博客。linux成功的移植到S3C2440A控制平台上后,再添加我们需要的SPI和wifi网络驱动模块[17]。由于添加和修改的内容较多且杂,这里就选取SPI驱动模块来讲解。
4.5、 SPI驱动和wifi移植
驱动移植对于linux整个的移植而言是一个重要的内容,也是较为困难的一环,不光是要涉及硬件知识,也需要设计软件知识。通常linux内核中资源丰富,像有些典型的驱动是不需要用户重新编写,但是又不会直接使能这个驱动,而是根据用户实际的需要来添加和裁剪。然而并不是像图形界面那样将需要的选项加上,有时候硬件也是千变万化的,因此内核还需要进行差异性的修改[18],例如在内核的板级文件中添加设备的硬件信息。首先,在Linux内核中修改板级文件,添加SPI模块的硬件信息,在mach-smdk2440.c文件中,加入头文件,在适当的位置加入SPI的板级信息和数据结构,在smdk2440_devices[]设备数组中添加SPI设备,在smdk2440_machine_init设备初始化函数中加入代码;其次,修改arch/arm/plat-s3c24xx/KConfig文件,添加SPI设备总线的引脚选项;最后,执行make menuconfig配置,选中System Type和SPI support,执行make编译内核生成image镜像文件,并通过TFTP服务将编译好的镜像文件烧录到S3C2440A平台上。如果移植成功就可以在文件系统下看到/dev/spidevx.0设备节点[19]。
本设计方案中移动支付终端通过wifi通信的方式实现联网,使用的是rt2070上网卡,该卡类似于U盘,连接无线路由器,工作在2.4GHz频段上。首先在内核网络模块中添加支持无线的IEEE802.11协议和驱动[20],因为是通过USB连接到了嵌入式系统中,所以还需要添加rt2070的USB驱动;其次是下载它的固件,并添加相关的网络工具,例如wpa_supplican工具就是在wifi驱动和用户之间起到一个中转站的作用,再加上对协议和加密认证的支持。最后就是依次执行相关的脚本,实现wifi联网的功能[21]。
5、 系统软件设计
5.1、 系统的软件流程
移动支付终端的硬件环境已实现预期的设计目标。上文中在linux系统中添加了SPI的驱动模块,实现了嵌入式系统与读写器的通信基础,下面的工作就是通过这个基础实现嵌入式系统对读写器芯片MF RC522进行操作。读写器和MF1卡的通信过程需要有系统的初始化、寻卡、防重叠、身份验证、读写和值操作等。这里我们使用的开发环境是Ubuntu系统,vim编辑工具和交叉编译工具arm-linux-gcc等。编写完程序后,使用交叉编译方法生成可以在S3C2440A控制平台上运行的可执行文件,再通过tftp或者nfs等方式调试运行。如图11所示为单片机与MF RC522的通信过程的一般流程。 图11 通信流程图
软件开发难度在于MF RC522和MF1卡通信双方传输不同的数据得到的状态也不同。实现密码认证(MFAuthent)和数据传输(Ttanceive)的两个功能,基本上就能够完成MF RC522和MF1卡通信的全部功能,下面讲解这两个基本操作和读写块的操作。
5.2、 读写器的操作程序
软件的执行过程是否进入下一轮流程取决于上一个处理过程的结果是否成功。如何得知是否成功呢?软件会通过读取中断状态寄存器(ComIrqReg)、状态2寄存器(Status2Reg)或错误寄存器(ErrorReg)来判定。并且可以返回读取错误寄存器的错误字。
5.2.1、 数据传输指令
S3C2440A的SPI控制模块和MF RC522芯片都有一个FIFO用于数据收发。MF RC522芯片的FIFO中的数据经过其内部的单元模块,如CRYPTO1加密算法的单元和数据加密单元,通过TX1和TX2端口经由天线与MF1卡通信。如果MF1卡接收完数据后向读写器发送回应信号,读写器将接收到信号经过其内部的单元模块,如数据解密单元模块,并将数据存储到FIFO中。上述的过程为数据传输指令大体的执行流程。如图12所示为执行该指令的算法流程图。
图12 数据传输指令流程图
图12中,MF RC522发送数据后判定TxIRq标志是否置位,如果没有说明帧数据尚未发送完毕,发送完毕开启MF RC522内部定时器,如果在指定的时间内都没有收到MF1卡的应答信号,读写器就会发送IDLE指令以终止此次的通信,并且返回“卡无反应”的错误字。紧接着会判断有无错误发生,如果没有错误,则发送IDLE指令并返回“卡正确”,如果有错误,则判断是否有位错误,因为两个或以上的MF1卡同时发送数据时很可能会出现位错误。如果发现有位冲突,则读取CollReg寄存器,确定冲突的位置,否者返回相应的错误字,无论是否有冲突最后都会发送IDLE指令,以使MF RC522转入到空闲状态。
5.2.2、 验证指令
MF RC522的验证(MFAuthent)指令算法流程图同上面的图11相同。执行验证指令可以启动内部的加密认证单元模块,启动后读写器和MF1卡之间的通信数据会先经过加密,在通过收发模块传输给MF1卡。程序可以通过读取定时器和错误寄存器的状态来查看执行结果。读写器试图读取任意扇区中的某个块时,都要独立执行验证指令,执行前需要保证1个字节的认证模式、1个字节的块号、6个字节的密码和4个字节MF1卡的序列号等相关信息都处于FIFO中。
图13 读块操作流程图
5.2.3、 读写块操作
用户使用读写块函数实现对MF1卡的某个块的读写操作。读写操作的两个函数如下:
int block_read (struct mifare *message);
int block_write (struct mifare *message);
message为输入参数,该参数是一个struct mifare数据结构体,它的介绍放在后面讲解。读写块成功返回MI_OK(0x0H)。该函数内部的操作流程如图13所示。该函数读写块时首先会请求MF1卡的应答,已探明是否有卡片存在,如果没有就会持续发送请求应答,否则执行防重叠和获取序列号的工作。序列号的唯一性可以选中所需要的卡片,而使没有选中的卡片处于等待状态。如果选中一个卡片,进行读写器和MF1卡之间的三次相互认证操作。如果验证合法,就进行读写块的操作。没有选中或不合法,就会发送IDLE指令,使读写器处于空闲状态。
5.3、 服务端程序
服务端程序是运行于嵌入式linux环境中,实现读写器和客户端应用程序之间的联系。如图14所示为服务端的操作流程图[22],包括初始化SPI设备控制器,初始化MF RC522芯片,通过socket()函数为服务端建立一个socket套接字[23],对套接字地址结构进行设置,如设置服务端的IP地址和端口号,从而确定套接字的属性。bind()函数绑定socket套接字和套接字地址结构。listen()函数负责监听socket套接字。accept函数阻塞等待客户端的连接请求,如果有连接请求,就为该客户端创建一个线程负责接收客户端发送的相关请求,如果客户端断开连接请求,进程会回收和释放相应的资源。并且在此之前为创建一个次线程为所有客户端发送读卡片信息。空闲状态想读写器发送IDLE指令,使其处于空闲状态,以节约功耗。
为了便于操作和传输,服务端和客户端之间传输的数据是一个简单的数据结构体,结构体如下:
struct mifare
{
unsigned char flag;
unsigned char card_id[2];
unsigned char senu[4];
unsigned char sector_key_a[16];
unsigned char addr;
unsigned char block_buf[16];
};
图14 RFID服务器端流程图
5.4、 客户端程序
客户端程序是用Qt Creator和Microsoft Visual Studio 2010编写Qt和MFC界面软件。使用Qt开发软件编写的Q客户端,在使用交叉编译器,使其可以在嵌入式系统中运行[24]。MFC编程简单,网络资源也很丰富[25]。首先是创建一个对话框模板并修改其属性,其次在对话框中添加相应的控件,再其次是创建对话框类和添加控件的变量,最后是为相应的控件添加消息处理函数。如图15所示为客户端程序的流程图。
图15 客户端程序的流程图
该客户端打开后设置IP地址,端口号已经默认为一个常数,可无需设置。点击连接按钮后,默认情况下处于接收服务端发送的数据,并且将接收到的数据进行解析后显示出来,如显示卡片类型和序列号,与此同时会根据具有唯一性的卡片序列号显示处对应的用户名和头像。还有此时MF1卡中所具有的的数据,我们这里把它定义为余额。卡片还具有充值和扣费,以及将余额清0的功能。
首先,因为一个块的有16个字节,如何存储这里的余额呢?本设计采取的这样一个方案:每个字节数据的取值范围是0~9,其中前三个字节用于存储小数点后面的十分位、百分位和千分位的数。后面的13个字节用于存储小数点前面的整数部分。例如,如果余额是1234.567这个数据,则该数据在块中的存储格式如下:
0x07, 0x06, 0x05, 0x04,
0x03, 0x02, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
上面红色字体的就是1234.567这个数小数点前面的数字1234,紫色部分为小数点后面的三位数567。
5.4.1、 读卡操作演示
首先我们将其中一个MF1卡贴近读写器,此时服务端显示如下图16所示。
图16 服务端的读卡显示
上图显示了卡片的容量、卡片的类型、卡片的序列号和第5个块中的数据,根据上面数据的存储格式知,此时卡片余额是1。下图17是此时客户端显示的结果。
图17客户端的读卡情况
此时显示了卡片序列号所映射的用户名和头像,以及卡片类型和余额1。当我们贴近另一张卡片时客户端显示结果如下:
图18 客户端读另一张卡的显示
5.4.2、 充值操作演示
下面给其中一个MF1卡充值的操作演示,比如充值的数是1234567890.1235,加上之前的余额1,得到新的余额是1234567891.1235,小数点后面的第4位采用四舍五入的方法,所以最后得到的余额为1234567891.124。充值后客户端和服务端显示的结果分别如图19和图20所示。
图19客户端充值后的显示
图20服务端充值后的显示
MFC客户端的其他操作与上面的充值操作类似,不重复介绍,
5.4.3、 扣费操作演示
运行在嵌入式系统上的Qt客户端与MFC客户端一样也是通过服务端提供的统一接口,即通过socket套接字的方式连接服务端,不过Qt客户端是通过嵌入式系统中的lo回环设备进行连接的,lo设备是linux系统虚拟出来的设备,是类Unix的独特之处。下面演示运行在嵌入式系统上面的Qt客户端。演示的是扣费操作,如图21和图22所示。
图21 扣费后服务端显示情况
图22 扣费后客户端显示情况
本课题所涉及的软件源码笔者已打包放在开源中国的git服务器上,读者可以自行下载,下载地址见附录。
6、 总结
本方案注重从低功耗、便携式和网络化的要求出发,以适应市场对于移动支付终端的市场需求,创新性的将MF RC522、ARM和linux三者结合在一起,充分的发挥了各自的低成本,集成度高,低功耗和开源免费的优点,如有必要还可以实现3G通信。
本文还同时介绍了移动支付终端的应用前景和意义,提及整个移动支付
展开阅读全文