V1.02
1、通信协议描述
1.1 协议概述
该协议是上位机与读写器之间的通讯协议。通讯的格式是:1位起始位,1位长度标志位,若干数据位,1位异或校验位,1位结束位。通讯的最大长度为字节。
1.2 字符定义
字符 STX LEN DATA BCC ETX 数值 0x02 - - - 0x03 定义 通讯开始 数据长度 数据 异或校验 通讯结束 1.3 通讯过程示意图
上位机(发送)STXLENINFO(0)INFO(N)BCCETX读写器(接收)发送结束上位机(接收)读写器(发送)STXLENINFO(0)INFO(N)BCCETX接收结束
1.4 数据格式
Command(2 bytes) Data[0]……Data[m]
2、指令集 2.1 指令一览表
指令码 0xC001 0xC005 0xC006 0xC007 0xC008 0xC009 0xC00A 0xC00B 0xC00C 0x3224 0x3225 0x3241 0x3243 0x3244 0x3245 0x3246 0x3247 0x3248 0x324B 0x324C 功能 寻卡(ISO/IEC15693) 读取某一块的信息(ISO/IEC15693) 将信息写入某一块(ISO/IEC15693) 将某一块锁定(ISO/IEC15693) 写入AFI(ISO/IEC15693) 锁定AFI(ISO/IEC15693) 写入DSFID(ISO/IEC15693) 锁定DSFID(ISO/IEC15693) 获取系统信息(ISO/IEC15693) 寻卡(ISO/IEC14443A存储卡) 休眠卡片(ISO/IEC14443A存储卡) 激活卡片(ISO/IEC14443A存储卡) 读取某一块的信息(ISO/IEC14443A存储卡) 将信息写入某一块(ISO/IEC14443A存储卡) 读余额(ISO/IEC14443A存储卡) 写入余额(ISO/IEC14443A存储卡) 余额加值(ISO/IEC14443A存储卡) 余额减值(ISO/IEC14443A存储卡) 卡片复位(ISO/IEC14443A智能卡) 发送应用命令(ISO/IEC14443A智能卡) 2.2 状态返回值
返回值 0x0000 0xFFFF
意义 操作成功 操作失败 3、二次开发接口函数说明
3.1 适用于符合ISO/IEC14443A标准的存储卡的接口函数
3.1.1 Mifare S50/S70卡片特性
S50具有1K字节的EEPROM,S70具有4K字节的EEPROM
S50分为16个扇区,每个扇区包括4块,每块16个字节,以块为存取单位 S70分为40个扇区,共256个块,每块16个字节,以块为存取单位 用户可自定义每个存储块的访问条件 每张卡有唯一序列号,为32位 具有防冲突机制,支持多卡操作 非接触传送数据和无源 至少10年数据保存期 至少10万次擦写
读写距离在100mm内 工作频率为13.56MHz
3.1.2 函数使用注意事项
该二次开发接口函数库提供用于下发命令至读写器的函数,这些函数能够控制读写器对卡片进行寻卡及读写操作。
在对卡片进行操作前必须先寻卡,寻卡成功后才能对卡片进行后续操作。卡片的读写操作是以块为单位,每块为16个字节。不同扇区可以用不同的密钥进行认证,每个扇区又可以使用A密钥或B密钥进行认证。
3.1.3 函数说明 (1)寻卡
int find_14443(BYTE* type, BYTE* card_uid );
////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能: 寻卡 //
//入口参数: //
//出口参数: type,指示寻卡成功的卡片为A类卡或是B类卡
// card_uid,指示用于存放UID的起始地址 //
//返回值: 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败 //
//说明: 获取卡片UID
//////////////////////////////////////////////////////////////////////////////////////////////////////
(2)HALT卡
int set_halt();
////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能: 使卡片休眠 //
//入口参数: //
//出口参数: //
//返回值: 返回-2,尚未寻卡 // 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败 //
//说明: 在HALT卡前必须已经寻卡成功
//////////////////////////////////////////////////////////////////////////////////////////////////////
(3)激活卡片
int set_active();
////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能: 激活卡片 //
//入口参数: //
//出口参数: //
//返回值: 返回-2,尚未寻卡 // 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败
//
//说明: 可以令处于休眠状态的卡片处于激活状态
//////////////////////////////////////////////////////////////////////////////////////////////////////
(4)读块
int read_block(int page,int block,unsigned char pswtype,unsigned char *psw,unsigned char *des_data,int* des_len);
////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能: 读取一个块的值 //
//入口参数: page,指定要读取的块所在的扇区 // block,指定要读取的块的块号
// pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b // psw,指示用于认证的密钥的值的起始地址 //
//出口参数: des_data,指示用于存放读取的数据的起始地址
// des_len,指示用于存放返回读取数据长度的起始地址 //
//返回值: 返回-2,尚未寻卡 // 返回-1,传入参数错误 // 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败 //
//说明: pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必 // 须为0x0a,对应B密钥pswtype必须为0x0b。
//////////////////////////////////////////////////////////////////////////////////////////////////////
(5)写块
int write_block(int block,int page,unsigned char pswtype,unsigned char *psw,unsigned char *src_data,int src_len)
////////////////////////////////////////////////////////////////////////////////////////////////////// //功能: 往一个块写入指定的值 //
//入口参数: page,指定要写入的块所在的扇区 // block,指定要写入的块的块号
// pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b // psw,指示用于认证的密钥的值的起始地址
// src_data,指示用于存放要写入的数据的起始地址 // src_len,指示用于存放返回写入数据的长度
//
//出口参数: //
//返回值: 返回-2,尚未寻卡 // 返回-1,传入参数错误 // 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败 //
//说明: pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必 // 须为0x0a,对应B密钥pswtype必须为0x0b。
//////////////////////////////////////////////////////////////////////////////////////////////////////
(6)读余额
int read_account(int page,int block,unsigned char pswtype,unsigned char *psw,LONG* account) ////////////////////////////////////////////////////////////////////////////////////////////////////// //功能: 从指定的块里读取钱包的余额(在调用该函数前必须确保钱包已初始化) //
//入口参数: page,指定钱包所在的扇区
// block,指定钱包所在的块的块号
// pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b // psw,指示用于认证的密钥的值的起始地址 //
//出口参数: account,指示用于存放要读取的余额的起始地址 //
//返回值: 返回-2,尚未寻卡 // 返回-1,传入参数错误 // 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败 //
//说明: pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必 // 须为0x0a,对应B密钥pswtype必须为0x0b。
// 读余额前必须确保参数指定的扇区和块已初始化为钱包,否则可以通过调 // 用write_account()函数来初始化为钱包
//////////////////////////////////////////////////////////////////////////////////////////////////////
(7)写余额(初始化)
int write_account(int page,int block,unsigned char pswtype,unsigned char *psw,LONG account) ////////////////////////////////////////////////////////////////////////////////////////////////////// //功能: 往钱包写入指定的值
//
//入口参数: page,指定钱包所在的扇区
// block,指定钱包所在的块的块号
// pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b // psw,指示用于认证的密钥的值的起始地址 // account,指示用于要写入的值 //
//出口参数: //
//返回值: 返回-2,尚未寻卡 // 返回-1,传入参数错误 // 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败 //
//说明: pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必 // 须为0x0a,对应B密钥pswtype必须为0x0b。
//////////////////////////////////////////////////////////////////////////////////////////////////////
(8)加余额
int add_account(int page,int block,unsigned char pswtype,unsigned char *psw,long addAccount) ////////////////////////////////////////////////////////////////////////////////////////////////////// //功能: 往钱包加上指定的值 //
//入口参数: page,指定钱包所在的扇区
// block,指定钱包所在的块的块号
// pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b // psw,指示用于认证的密钥的值的起始地址 // addAccount,指示用于要往钱包加上的值 //
//出口参数: //
//返回值: 返回-2,尚未寻卡 // 返回-1,传入参数错误 // 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败 //
//说明: pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必 // 须为0x0a,对应B密钥pswtype必须为0x0b。
//////////////////////////////////////////////////////////////////////////////////////////////////////
(9)减余额
int sub_account(int page,int block,unsigned char pswtype,unsigned char *psw,long subAccount) ////////////////////////////////////////////////////////////////////////////////////////////////////// //功能: 往钱包减去指定的值 //
//入口参数: page,指定钱包所在的扇区
// block,指定钱包所在的块的块号
// pswtype,指定用于认证的密钥的类型,其值可为0x0a或者0x0b // psw,指示用于认证的密钥的值的起始地址 // subAccount,指示用于要减去的值 //
//出口参数: //
//返回值: 返回-2,尚未寻卡 // 返回-1,传入参数错误 // 返回0,通信失败 // 返回1,操作成功 // 返回0xff,操作失败 //
//说明: pswtype用于指于认证密钥为A密钥或为B密钥,对应A密钥pswtype必 // 须为0x0a,对应B密钥pswtype必须为0x0b。
//////////////////////////////////////////////////////////////////////////////////////////////////////
3.2 适用于符合ISO/IEC14443A标准的CPU卡的接口函数
3.2.1 CPU卡片特性
符合ISO/IEC14443A标准 工作频率为13.56MHz
内置MCU与COS(chip operating system) 支持DES/3DES算法,高安全性
存在文件系统,支持多种格式的存储 交易流程规范化
3.2.2 函数使用注意事项
该二次开发接口提供函数的功能为:下发命令至读写器,再由读写器转发相应的命令至CPU卡,由CPU卡进行相应的处理,并将处理结果通过读写器上传至上位机程序。在卡片进行操作之前,必须进行复位,使卡片处于激活状态。交易结束后,使用DESELECT命令使卡片处于HALT状态。
3.2.3 函数说明 (1)复位
bool card_reset()
////////////////////////////////////////////////////////////////////////////////////////////////////// //功能: 对CPU卡进行复位,完成寻卡、防冲突和选卡功能,操作成功后卡片处于 // 激活状态 //
//入口参数: //
//出口参数: //
//返回值: 返回-1,传入参数错误 // 返回0,操作或通信失败 // 返回1,操作成功 //
//说明: 在对卡片发送应用命令前,必须先进行复位,复位成功后才能进行后续操 // 作。复位操作的前提是卡片处于非激活状态。
//////////////////////////////////////////////////////////////////////////////////////////////////////
(2)发送应用命令
bool app_command(int comm_len, unsigned char *comm, int *resp_len, unsigned char *resp) ////////////////////////////////////////////////////////////////////////////////////////////////////// //功能: 传输应用命令至卡片,由卡片的COS处理后返回数据 //
//入口参数: comm._len,指示传输的应用命令的长度
// comm,指示要传输的应用命令数据存放的起始地址 //
//出口参数: resp_len,指示存放返回数据的地址
// resp,指示用于存放返回数据的起始地址 //
//返回值: 返回0,通信失败 // 返回1,操作成功 //
//说明: 在发送应用命令前,应确保卡片复位成功并处于激活状态。COS接收到应 // 用命令后,进行相应的处理,并返回数据。若COS在正确执行应用命令后, // 在返回数据的最后会附上”0x9000”的状态码;若执行出错,则返回错误状 // 态码。
//////////////////////////////////////////////////////////////////////////////////////////////////////
因篇幅问题不能全部显示,请点此查看更多更全内容