IC 卡公交收费机设计(三) —— MIFARE 1 卡读写软件设计
description
Transcript of IC 卡公交收费机设计(三) —— MIFARE 1 卡读写软件设计
SmartCardSmartCard
IC 卡公交收费机设计(三)
——MIFARE 1 卡读写软件设计电子与信息工程学院
SmartCardSmartCard
课 程 目 标
非接触式 IC 卡读写控制
MIFARE 1 卡读写控制功能的实现
SmartCardSmartCard
项目开发—— IC 卡公交收费系统
系统需求分析:1. 具备小额电子钱包功能,定额方式收费2. 操作方便快捷3. 工作距离 <50cm4. 具备显示余额、异常报警(非法卡或余额不足)5. 可将当班收款额上传总站数据库6. 公交公司可调整定额额度7. 卡遗失可挂失8. 抗干扰能力强
SmartCardSmartCard
项目设计之三——软件设计读写器与 M1 卡交换数据的过程:1 )由读写器 MCU (微控制器)发送指令给 MCM ,
2 ) MCM 执行指令并将其转换为射频信号发送给卡;
3 )卡接收到来自 MCM 的指令后,按指令完成其内部的各种处理,并回送应答信号 / 数据给 MCM ;
4 ) MCM 接收卡回送的射频信号并将其转换为数字信号输出给 MCU ,读写器 MCU 读取 MCM 接收到的应答/ 数据,即可完成与 M1 卡的数据交换。
SmartCardSmartCard
SOR/LOAD KEY
REQUEST
ANTICOLLISION
READ/WRITE/INC/DEC
HALT
MIFARE 1MIFARE 1 卡操作步卡操作步骤骤
AUTHENTICATION
SELECT
卡应答: TAGTYPE ( 2B )卡应答: SN ( 4B ) + 校验码( 1B )
卡应答: SIZE ( 1B )
卡应答: AE 位
SmartCardSmartCard
MIFARE 1 卡的读写操作步骤 激活 MCM MCM 软复位 向 MCM 下载密码( LOAD KEY ),校验传输密码正
确后可向 MCM 的 KEY-RAM 写入用户自己设定的密码,以上操作与卡无关。
请求应答( ANSWER TO REQUEST ):寻卡 防冲突( ANTICOLLISION ):选择唯一一张卡 选择标记( SELECT ):激活所选择的卡 认证 ( AUTHENTICATION ):安全性 读写操作(读、写、加值、减值):交换数据 ( REA
D/WRITE/INCREAMENT/DECREMENT ) 停止( HALT ):置卡为停止模式,防止重复操作。
SmartCardSmartCard
#include <string.h>#include <intrins.h>#include <stdio.h>
#include <MFA.h>#include <mfreg632.h>#include <PcdUtils.h>#include <PcdShare.h>#include <MfErrNo.h>#include <TG12864.h>#include <MAIN.h>
#define uchar unsigned char#define uint unsigned int#define ulong unsigned long
//----- external control-----------#define LED P3_4#define BP P3_5
//========function declare=========void rc500_init(void);void init(void);void delay10us(void);void delay100us(void);void delay10ms(void);void delay100ms(void);
MIFARE 1 卡读写范例程序
SmartCardSmartCard
main(void){ uchar blockdata[16] ; 块数据 uchar TagType[2] ; 卡类型号 TagType uchar SN[4] ; 卡序列号 SN
uchar sak1 ; 卡容量字节 Size uchar cmd=1; uchar i=0; uchar Status; rc500_init(); //RC500 INIT M500PcdConfig(); // config mifare init(); //SYSTEM INIT InitLCD()
SmartCardSmartCard
while(1){ Status = M500PiccRequest(PICC_REQSTD, &TagType[2]) ; 寻卡,卡应答 TagType if(Status==MI_OK) { Status = M500PiccAnticoll(0, &SN) ; 防冲突,卡应答 SN } if(Status==MI_OK) { memcpy(card_snr,&SN,4); // store serial number in globle var } if(Status==MI_OK) { Status = M500PiccSelect(&SN, &sak1) ; 选择应用,卡应答 Size }
SmartCardSmartCard
if(Status==MI_OK) { Status=M500PiccAuthE2(PICC_AUTHENT1A,card_snr,0,3) ; 密码认证 } if(Status==MI_OK) { Status=M500PiccRead(3, blockdata) ; 读块(读余额) blockdata[5]=blockdata[5]-0x05 ; 修改块数据 } if(Status==MI_OK) { Status= M500PiccWrite(4,blockdata) ; 写块(扣款) } if(Status==MI_OK) { Status = M500PiccHalt() ; 暂停,与 REQUEST STD 组合使用,防止重复操作 } }}
SmartCardSmartCard
Answer to Request (请求应答)操作 Request 指令将通知 MCM 在天线有效的工作
范围(距离)内寻找 MIFARE 1 卡。函数 : char M500PiccRequest(unsigned char req_code,
// request code REQ_ALL = 0x52 or REQ_STD = 0x26
unsigned char *atq) // answer to request
命令码: 52H 或 26H 。 卡应答: TAGTYPE ( 2 个字节)
SmartCardSmartCard
With a “request std” instruction only cards which are not set into a “HALT-mode” will respond to this request,or it may be expanded to all cards in the field with a “request all” option.The first option is needed to prevent the MCM from selecting one card several times.
Difference between “request std” & “request all”
SmartCardSmartCard
初始化与防冲突 ( AntiCollion )如果有 2 张或 2 张以上的 IC 卡进入读写器的工作
范围,称之为冲突(或碰撞 Collion ),此时就需要解决如何对多张 IC 卡逐一处理的问题——防冲突 AntiCollion 。
防冲突方案:
位帧防冲突( Bit AntiCollision )
动态时隙 -ALOHA 法( Slotted-ALOHA 法)
SmartCardSmartCard
AntiCollision 防冲突 如果有多于一张的 Mifare 1 卡处在 MCM 天线的有效工作范围(距
离)内,则发生了冲突。 AntiCollision 操作使 MCM 能在多张 Mifare
1 卡中选择某一张卡。
AntiCollision 操作由一个 AntiCollision Loop (防冲突循环,内部处理)来实现。MCM发送 AntiCollision 命令( 93H+20H ),每张天线范围内的MIFARE 1 卡接收 AntiCollision 命令后,都将回送自己的SN 作为应答。
由于每张卡的 SN 各不相同, MCM 接收到的信息(即 SN )至少有1 位即是 0又是 1 (即该位的前、后半部都有负载波调制),防冲突循环找到第 1 个冲突位将其置 1 (排除该位为 0 的卡),然后查第 2
个,依次排除,最后不再有冲突的 SN 即为最后读取的 SN 。
SmartCardSmartCard
MIFARE 1 卡防冲突特性利用每张卡全球唯一的 SN实现二进制树状搜索防冲突算法。
例:SN1 : 420A7E00
SN2 : 420A7E01
SN3 : 421A7E01
冲突 1选择 SN2 、 SN3
冲突 2选择 SN3
SmartCardSmartCard
POWER OFF状态
IDLE状态
READY状态
ACTIVE状态
HALT状态
RESET
REQUEST 命令
ANTICOLLISION 命令启动防冲突循环读取卡回送的 UID ( SN )
HALT 命令
SELECT UID 命令应用: AUTENTICATION/READ/WRITE/INC/DEC 命令
WAKE UP
命令
MIFARE MIFARE 卡卡
防冲突流程防冲突流程
SmartCardSmartCard
防冲突( AntiCollision )操作Anticollision 命令启动防冲突循环 , 卡收到
命令后回送 SN 作为应答 , 防冲突循环将在收到的所有 SN 中选择某一个 SN 作为应答。
函数char M500PiccAnticoll (unsigned char bcnt,
unsigned char *snr)块地址: bcnt=0卡应答: SN ( 4B )
SmartCardSmartCard
选择应用( Select )操作Select 命令将选中的 SN 发送给卡,与之相同 SN 的卡被选择,进入 ACTIVE状态,而其他卡留在 IDLE状态。
函数char M500PiccSelect(unsigned char *snr,
unsigned char *sak)入口参数: SN卡应答: Size ( 1B )
SmartCardSmartCard
认证( Authentication )操作 MCM 中设有专用的密码存储器,用于存储 3 个密码集 KEYSET0 , KEY
SET1 , KEYSET2 ,每一个 KEYSET又包含了各个扇区的 KEY A 及 KEY B 。 Authentication 操作就是将密码存储器中的密码与卡中对应的密码进行三次相互认证。
函数 char M500PiccAuthE2( unsigned char auth_mode, // KEYA, KEYB
unsigned char *snr, // 4 bytes card serial number
unsigned char key_sector, // key address in reader storage,
// 0 <= key_sector <= 15 unsigned char block) // block number which should be authenticated
// 0 <= block <= 256
卡应答:以 AE 位给出; AE=1/0 ,密码出错 / 正确,未能通过 / 通过认证; 用状态 STATUS表示
SmartCardSmartCard
READ/WRITE 操作READ/WRITE均需整块操作。READ : char M500PiccRead( unsigned char addr,
// 0 <= blockaddr <= 256 unsigned char *_data //return block data)WRITE : char M500PiccWrite( unsigned char addr,
// 0 <= blockaddr <= 256 unsigned char *_data //data that will be written into EEPROM)
SmartCardSmartCard
Value Operate 值操作MIFARE卡专门为公交 /地铁等行业的定额收费系统设有值操作命令,包括 INCREAMENT/DECREAMENT/
TRANSFER/RESTORE对某块进行值操作的前提是该块已被初始
“ ”化为 值块 ( Value Block)并且 Access Bits “ ”允许值操作。初始化 值块 的方法是用WRITE操作按规定的“ ”值块 格式写入初始数据。
SmartCardSmartCard
Increment/Decrement/TransferIncrement:
adds the specified value to the memory value
Decrement: subtracts the specified value from the memory value
Transfer: Each Increment or Decrement instruction manipulating a
standard value block has to be followed by a Transfer intruction which actually stores the calculated result in the card memory. Until then, the result is kept in an internal value buffer resgister.
SmartCardSmartCard
Increment/Decrement/Transfer函数 char M500PiccValue(unsigned char dd_mode, unsigned char addr, unsigned char *value, unsigned char trans_addr)//dd_mode : Inc,Dec command code// addr : 0 <= blockaddr <= 256
// value : 4B value// trans_addr : 0 <= blockaddr <= 256
SmartCardSmartCard
HALT 操作set card into “HALT-mode”, to prevent the
MCM from selecting one card several times.
函数 char M500PiccHalt(void)
SmartCardSmartCard
实训 非接触式 IC 卡读写控制程序设计与调试
第一阶段:用 WRITE形式扣款,调试程序,设置断点,查看操作流程中各操作步骤的卡应答。
第二阶段:防冲突与防止重复扣款的编程实现与调试。 然后将该数据块中的数据读出并存入读写器 MCU 的片内RAM 中。
第三阶段:修改程序,实现用 DECTEMENT形式扣款。
SmartCardSmartCard
实训步骤 用非接触式 IC 卡读写软件 SZPTReader 向 MCM 中下载密码,读出并记录 2 张
MIFARE1 卡的 TAGTYPE 、 SN 、 SIZE ,在卡中某数据块(如扇区 1 块 0 )分别写入公交卡金额(模拟充值)。
取出非接触式 IC 卡开发板上的 MCU芯片,将仿真头插入 MCU 的 IC座。 设置断点运行实训程序,分别对 1# 、 2# 卡进行读写操作,查看并记录操作流程
中各操作步骤的卡应答 。 将 2 张卡同时置入天线工作范围内,设置断点循环运行实训程序,查看并记录操
作流程中各操作步骤的卡应答 。 修改程序,实现DECREMENT形式的扣款。