基于RFID移动支付终端的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
摘要: (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、特性和功能框图 (9)
3.4、读写器硬件电路 (10)
4、嵌入式系统 (12)
4.1、嵌入式系统和物联网 (12)
4.2、S3C2440A的简介 (13)
4.3、S3C2440A硬件电路 (13)
4.4、开源Linux的移植 (14)
4.5、SPI驱动和wifi移植 (14)
5、系统软件设计 (15)
5.1、系统的软件流程 (15)
5.2、读写器的操作程序 (16)
5.2.1、数据传输指令 (16)
5.2.2、验证指令 (17)
5.2.3、读写块操作 (17)
5.3、服务端程序 (18)
5.4、客户端程序 (19)
5.4.1、读卡操作演示 (21)
5.4.2、充值操作演示 (22)
5.4.3、扣费操作演示 (24)
6、总结 (25)
致谢 (25)
参考文献 (26)
附录 (28)
基于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、移动支付的现状及前景
移动支付作为支付手段的一种具有很多的优点,比如消费者可以不必携带巨额资金去消费,不用担心资金丢失被盗等安全性问题。
既满足方便了消费着也可以扩大内需。
它的应用已经涉及到我们生活的方方面面,是我国通向信息化时代的一个必不可少的工具。
移动支付终端种类日益丰富,但与此同时也带来了诸多的问题,比如联网质量差、带宽低,处理能力差,续航时间短等突出问题。
未来移动支付终端会随着国内移动互联网的发展,以及经济技术的进步,朝着多元化的方向发展,比如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卡的电器特性
MF1卡的16个扇区共有64个块,扇区各有4个块(块0~块3),其中第0扇区的块0已经固化有芯片商、卡片商和卡片序列号码。
扇区的前3个块(块0~块2)为数据块用来存贮用户数据;每一个扇区都有自己的控制属性,这个属性由扇区中的块3决定。
扇区控制块有16字节,前6个字节为密码A,紧接着是4个字节(32bit)的存取控制条件,之后的6个字节是密码B,每个扇区的控制块3结构都是一样的,如下表2所示。
表2 扇区控制块结构
2.3、MF1卡的控制属性
彼此独立的扇区的密码和存取控制条件可以做相应的修改,因为每个扇区都是独立的[7]。
任意一个扇区的数据块和控制块的读写条件,取决于该扇区的存取控制
条件区域中的3bits控制位[8]。
这3个比特位用“Cxy”表示,其中x表示任意扇区中的某块的块号,y表示某块的第几个控制位,对于任意一个扇区而言有表3和表4所示的关系。
表3 控制位定义Cxy
表4 存取控制字节中的控制位
任意一个扇区的数据块(0扇区的块0除外)的存取控制权限,取决于块3中的3个控制位,以及对应的3个取反的控制位。
当用户需要访问某个块时,会依据3个控制位的设置决定是否需要密码A或者密码B,亦或者不可以操作。
下面通过表5介绍访问权限,表中的KEYA|B 表示密码A或B,NEVER表示不可以操作,其中3个控制位为000的是出厂默认设置。
表5 数据块的存取控制权限
上面讲述了任意扇区中数据块的访问权限,下面表6列举了控制块块3的存取控制权限[9]。
对于块3的操作要小心谨慎,以免扇区被锁死!
表6 控制块的存取控制权限
下面以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存取控制位的默认值
从表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
脚)
驱动天线电源
还有其他一些引脚不提及。
本课题使用的是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、读写器硬件电路
利浦公司的射频芯片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 的方形接地的焊盘,不要遗漏了。
M F RC522的收发模块的天线,是在PCB 板上画的若干个首尾相连的线圈构成,形成一个电感。
这里我们的线圈面积近似4x4cm ,圈数为4圈。
发送端是通过TX1和TX2经过一些电感和电容连接到天线上的。
RX 引脚接收来自MF1卡的载波信号。
VMID 为内部参考电压。
天线模块的电路图参见图6所示。
47pF
47pF
10pF 10pF 2.2u H
2.2u H
5.1K
820R
0.1uF
T X 1
T V S S
T X 2
R X
V M I D
天线
180pF 180pF 15pF
15pF
图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研究和学习,让我们充分地认识到这门技术对于我们的生活、工作和娱乐有着非同寻常的影响。
随着
的嵌入式技术视角来看,更容易理解物联网的本质和内涵[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 模块的接口电路独立取出来,示。
图中有四根引线GPE13、GPE11和GPG10分别对应的是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.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内部定时器,Array如果在指定的时间内都没有收到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卡的某个块的读写操作。
读写操作的两个函数
如下:
面讲解。
读写块成功返回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指令,使其处于空闲状态,以节约功耗。
为了便于操作和传输,服务端和客户端之间传输的数据是一个简单的数据结构体,结构体如下:
图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这个数据,则该数据在块中的存储格式如下:
点后面的三位数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所示。