MF-50N非接触式IC卡读写函数

更新时间:2024-06-08 02:34:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

非接触式IC卡读写器 使 用 手 册

目 录

1.非接触式IC卡读写器简介......................................2 1.1 概

述............................................................2 1.2 特

性............................................................2 1.3 设备接

口........................................................2 1.4 读写器装箱清

单..................................................2 1.5 程序安

装........................................................3 1.6 软

件............................................................3 1.7 技术指

标........................................................3 2.演示程序使用说

明......................................................4 2.1 MIFTEST演示程

序..................................................4 2.2 MIFDEMOS演示程

序.................................................4 3.库函数说

明............................................................7

3.1 驱动程序主要目录和文件..........................................7 3.2 函数使用说明....................................................7 3.3 库函数一览表....................................................7 3.4 C语言库函数....................................................7 3.5 Windows16位动态库..............................................15 3.6 Windows32位动态库..............................................24 3.7 FoxPro For Dos 库函数...........................................33 3.8 库函数使用范

例..................................................40 3.9 函数错误类型代

码................................................40

3.10 版本兼容

性......................................................40

附录1 二种Mifare射频卡的特性 .....................................40

1.非接触式IC卡读写器简介 1.1 概述

非接触式IC卡读写器是由主机、天线、串行接口等组成,通过RS232串行接口能实现同PC机的连接。随机提供的接口函数库可满足用户二次开发的需要;其完善、可靠的接口函数,支持访问射频卡的全部功能。目前该设备已广泛地应用于门禁、考勤及高速公路、油站、停车场、公交等收费系统中。 1.2 特性

适用于符合MIFARE标准的非接触卡? 支持MIFARE标准? - 工作频率13.56MHZ

- 以106kbit/s速率高速访问射频卡 - 数据加密和双向验证

- 防冲突,可同时读取多张射频卡 - 通信错误自动侦测

功能操作:读、写、初始化值、加值、减值、读值和装载密码等? 通讯接口:RS232串口,USB口?

? 波特率:9600?~115200 bit/s,自动侦测 操作距离:MF-50为50mm?

数码管显示:MF-50有4位数码管显示? ? 控制蜂鸣器鸣响功能

提供丰富的二次开发平台和应用范例? 1.3 设备接口

串口或USB MF-50 内置天

线

DC5V电源

RS232串口 控制盒

DC12V电源 MF-100T

RS232串行接口或USB用于与上位PC联机通讯;

MF-50的天线与主机一体;MF-100T的天线通过控制盒与主机相连。 1.4 读写器装箱清单

包装盒内配有:读写器,通讯线,5V电源,驱动软盘

1.5 程序安装 安装步骤:

a. 将通讯线一端接到读写器上,另一端接至计算机串口上; b. 将天线与控制盒连接,接通读写器电源;

c. 打开计算机,进入MS-DOS或WINDOWS3.X/95; d. 将驱动软盘插入驱动器A或B ; e. 键入A:或B:后按回车;

f. 键入INSTALL X:后按回车(X表示硬盘驱动器)

注:安装结束后,在根目录下创建一个MWRF的子目录,所有软件均在此目录下。 1.6 软件

读写器软件包括:演示程序、函数库和应用范例 a. 演示程序

提供DOS版Miftests.exe 和MF.exe 。 b. 函数库

C语言接口函数库

FOXPRO FOR DOS接口函数库 WINDOWS16位动态库

WINDOWS32位动态库 c. 应用范例

EXAMPLES目录下提供各种开发平台的应用范例,包括VB、DELPHI、VC等。 1.7 技术指标

支持MIFARE标准? - 发射频率:13.56MHz

- 访问卡速率:106Kbit/s ? 接口功能:RS232串行接口

波特率:9600~115200bit/s ,自动侦测?

工作电源:MF-50、MF-100T分别是DC? 5V±5%、DC 12V±5% 读写距离:MF-50、MF-100T分别是50mm、100mm? 最大功耗:MF-50? 、MF-100T分别是300mW、400mW

50°С? 环境温度:0°С? 95%? 相对湿度:30%?

重量:MF-50约? 200克;MF-100T约600克(不包括天线) 3.库函数说明

3.1 驱动程序主要目录和文件

驱动程序安装后下的目录和文件:

INSTALL.COM 安装程序

README.TXT 版本信息和驱动盘说明 MANUAL.DOC 本使用手册

C.DOS\\*.* Borland C/Turbor C函数库 C.DOS\\MWRF.H C语言库函数头文件 C.DOS\\MWRFT.LIB C微模式(TINY)函数库 C.DOS\\MWRFS.LIB C小模式(SMALL)函数库 C.DOS\\MWRFM.LIB C模式(MEDIUM)函数库

C.DOS\\MWRFC.LIB C紧凑模式(COMPACT)函数库 C.DOS\\MWRFL.LIB C大模式(LARGE)函数库 C.DOS\\MWRFH.LIB C巨模式(HUGE)函数库 windows\\MWRF16.DLL WINDOWS 16位动态库 \\MWRF16.H 16位动态库的头文件 \\MWRF16.LIB 16位动态库的输入库 windows\\MWRF32.DLL WINDOWS 32位动态库 \\MWRF32.H 32位动态库的头文件 \\MWRF32.LIB 32位动态库的输入库

FOXPRO.DOS\\MWRF.PLB FOXPRO FOR DOS 接口函数库

EXAMPLES\\*.* C,VB,DELPHI等各种平台的范例 DEMO\\* DOS下的操作演示软件

3.2 函数使用说明

函数调用应遵循如下规则:

(1) 程序开始,首先要调用rf_init( ) 函数初始化串口。

(2) 用rf_load_kdy()将卡中某一扇区密码输入到读写器中,一次只能改写一个扇区。 (3) 调用rf_card()函数(相当连续调用rf_request()、anticoll()、select()三个函数),成功可返回卡的序列号。

(4) 用rf_anthetication() 函数验证设备密码和卡中密码,一次只能验证一个扇区。

(5) 对已验证过的扇区可进行读、写、初始化值、加值、减值等功能操作。对其它扇区的读、写操作必须重复上述(3)、(4)过程。

(6) 由于高级函数集成了若干低级函数,所以调用前可不必运行(3)、(4)过程。

(7) 对某张卡操作完成后,应用rf_halt()函数中止对该卡的操作。

(8) 程序正常退出或因错误退出之前,要用rf_exit()函数关闭串口;否则再

次执行初始化串口时将出错。

(9) ML卡有专用的三个函数rf_init_ml()、rf_decrement_ml()和rf_readval_ml;减值以后,再次对卡操作(包括读值)时须重新寻卡。

(10) 有关调用各种函数库的具体方法,请参考MWRF\\Examples\\目录下的使用范例。

3.3 库函数一览表

序号 函数 说明 备注

1 rf_init () 初始化串口 2 rf_exit () 关闭串口 3 rf_card () 寻卡

4 rf_authentication () 验证卡中某一扇区密码 5 rf_halt () 中止卡操作 6 rf_read () 读数据(字符)

7 rf_read_hex () 读数据(十六进制) 8 rf_write () 写数据(字符)

9 rf_write_hex () 写数据(十六进制) 10 rf_intival () 初始化块值 11 rf_increment () 加值 12 rf_decrement () 减值 13 rf_readval () 读值

14 rf_restore () 将块数据传到卡的内部寄存器中 15 rf_transfer () 将寄存器的数据传到块中 16 rf_load_key () 向读写器下载授权密码

17 rf_load_key_hex () 向读写器下载授权密码(十六进制) C语言库中未提供此函数

18 rf_beep () 蜂鸣器鸣叫 19 rf_disp () 数码管显示数据

20 rf_request () 寻卡请求 FoxPro For Dos库中未提供此函数 21 rf_anticoll () 防止卡冲突 FoxPro For Dos库中未提供此函数

22 Rf_select () 选取一个给定序列号的卡 FoxPro For Dos库中未提供此函数 23 Rf_encrypt () DES加密算法 24 Rf_decrypt () DES解密算法

25 Rf_get_status () 读取读写器的版本号 26 Rf_reset () 射频头复位

27 Rf_initval () 高级初始化值

28 Rf_HL_decrement () 高级增值操作 29 Rf_HL_inctement () 高级减值操作 30 Rf_HL_write () 高级写 31 Rf_HL_read () 高级读

32 Rf_initval_ml () ML卡初始化值 33 Rf_decrement_ml () ML卡减值操作 34 Rf_readval_ml () ML卡读值操作

3.4 C语言库函数

(1) int rf_init(char *_Comstr, ...); 功 能:初始化串口

参 数:char * _Comstr:指向字符串的指针,取值为“COM1”~“COM4” char *BaudStr:为通讯波特率9600~115200;该参数可省略,缺省为115200

返 回:成功则返回 0 例:int st;

st=rf_init(\(2) void rf_exit(void); 功 能:恢复串口 参 数:无 返 回:无

例:rf_exit();

(3) int rf_card(unsigned char _Mode,unsigned long *_Snr); 功 能:寻卡,能返回在工作区域内某张卡的序列号 参 数:unsigned char _Mode:寻卡模式 取值如下:

0 — 选择IDLE模式

1 — 选择ALL模式,一次可选择多张卡 unsigned long *_Snr:返回卡的序列号地址 返 回:成功则返回 0 例:int st;

unsigned long snr; st=rf_card(0,&snr);

注:选择IDLE模式,在对卡进行读写操作后,必须执行rf_halt()指令中止卡操作。只有当该卡离开并再次进入操作区时,读写器才能够再次对它进行操作。 (4) int rf_authentication(unsigned char _Mode,unsigned char _SecNr); 功 能:验证某一扇区密码

参 数:unsigned char _Mode:验证密码的方式 取值如下:

0 — 用KEYSET0和KEYA验证 1 — 用KEYSET1和KEYA验证 2 — 用KEYSET2和KEYA验证 4 — 用KEYSET0和KEYB验证 5 — 用KEYSET1和KEYB验证 6 — 用KEYSET2和KEYB验证

unsigned char _SecNr:要验证密码的扇区号(0~15) 返 回:成功则返回 0 例:int st;

st=rf_authentication(0,0);

注:每张卡上有A密码和B密码,可根据实际需要确定是否使用B密码,这

由卡的存取

控制位来决定。此外,读写器中可以存放三套密码,可用rf_load_key()来分别装入,

只有装入后才能使用验证密码函数验证。

(5)int rf_halt(void); 功 能:中止卡操作 参 数:无

返 回:成功则返回0 例:int st;

st=rf_halt(); 注:使用rf_card()函数时,如果模式选择为 0, 则在对卡进行读写操作后,必须

执行rf_halt()。

(6) int rf_read(usigned char _Adr,unsigned char *_Data); 功 能:读数据,一次必须读一个块

参 数:unsigned char _Adr:块地址(0~63) unsigned char *_Data:读出数据 返 回:成功则返回 0 例:int st;

unsigned char data[16]; st=rf_read(0,data);

(7) int rf_read_hex(usigned char _Adr,unsigned char *_Data); 功 能:以十六进制读数据,一次必须读一个块 参 数:unsigned char _Adr:块地址(0~63)

unsigned char *_Data:读出数据,数据以16进制形式存放 返 回:成功则返回0; 例:int st;

unsigned char data[32]; st=rf_read_hex(0,data);

(8) int rf_write(unsingned char _Adr,unsigned char *_Data); 功 能:写数据,一次必须写一个块;

参 数:unsigned char _Adr:块地址(1~63) unsigned char *_Data:写入数据 返 回:成功则返回0; 例:int st;

unsigned char data[16]; st=rf_write(0,data);

(9) int rf_write_hex(unsigned char _Adr,unsigned char *_Data) 功 能:以十六进制写数据,一次必须写一个块; 参 数:unsigned char _Adr:块地址(1~63)

char *_Data:写入数据 返 回:成功则返回 0 例:int st;

char write_buf[17]=\ st=rf_write_hex(1,write_buf);

(10) int rf_initval(unsigned char _Adr,unsigned long _Value); 功 能:初始化块值

参 数:unsigned char _Adr:块地址(1~63) unsigned long _Value:初始值 返 回:成功则返回 0 例:int st;

unsigned long value;

value=1000; /* 给value赋值*/

st=rf_initval(1,value); /*将块1的值初始化为1000*/ 注:对块做数值操作时,必须先执行初始化值函数, 然后才可以读、减、加的操作。

(11) int rf_increment(unsigned char _Adr,unsigned long _Value); 功 能:块增值

参 数:unsigned char _Adr:块地址(1~63) unsigned long _Value:要增加的值 返 回:成功则返回 0; 例:int st;

unsigned long value; value=10;

st=rf_increment(1,value); /*将块1的值增加value*/ (12)int rf_decrment(unsigned char _Adr,unsigned long _Value); 功 能:块减值

参 数: unsigned char _Adr:块地址(1~63) unsigned long _Value:要减的值 返 回:成功则返回 0 例:int st;

unsigned long value;

value=10;

st=rf_decrement(1,value); /*将块1的值减少value*/ (13) rf_readval(unsigned char _Adr,unsigned long *_Value); 功 能:读值

参 数:unsigned char _Adr:块地址(0~63) unsigned long *_Value:读出值的地址 返 回:成功则返回 0 例:int st;

unsigned long value;

st=rf_readval(1,&value); /*读出块1的值,放入value*/ (14) int rf_restore(unsigned char _Adr); 功 能:回传函数,将某块内容传入卡的内部寄存器 参 数:unsigned char _Adr:要进行回传的块地址 返 回:成功返回0 例:int st;

st=rf_restore(1);

注:用此函数将某一块中的数值传入内部寄存器,然后用rf_transfer()函数将

寄存器中数据再传送到另一块中去,实现块与块之间数值传送。该函数仅在

increment、decrement和restore命令之后调用。

(15) int rf_transfer(unsigned char _Adr); 功 能:传送,将寄存器的内容传送到块中

参 数:unsigned char _Adr:要传送的地址(0~63) 返 回:成功返回0 例:int st;

st=rf_transfer(1);

注:见rf_restore()的说明。

(16) int rf_load_key(unsigned char _Mode,unsigned char SecNr,KEY _Nkey); 功 能:将密码装入读写模块RAM中

参 数:unsigned char _Mode:同 rf_authentication() unsigned char _SecNr:同 rf_authentication() KEY *_Nkey:写入RAM中的卡密码 返 回:成功则返回 0

例://key A and key B

KEY tk[2]= { {{0xa0,0xa1,0xa2,0xa3,0xa4,0xa5}}, {{0xb0,0xb1,0xb2,0xb3,0xb4,0xb5}} }; /* 装入1扇区的0套A密码 */

if((rf_load_key(0, 1,&tk[1]))!=0) { ; printf(\ rf_exit() exit(1); }

注:KEY的定义在头文件中可以找到;*_Nkey应与卡中的密码相对应。如果卡中密码非

缺省密码,验证密码之前必须用load_key指令重新装入卡的密码。 (17) int rf_get_status(unsigned char *_Status); 功 能:取得读写器的版本号,如“mwrf025_v2.0” 参 数:unsigned char *_Status:返回版本信息

返 回:成功则返回 0 例:int st;

unsigned char *version; st=rf_get_status(version);

(18) int rf_beep(unsigned int _Msec); 功 能:蜂鸣

参 数:unsigned int _Msec:蜂鸣时间的长短,单位是10毫秒 返 回:成功则返回 0 例:int st;

st=rf_beep(10); /*鸣叫100毫秒*/

(19) int rf_disp(unsigned char pt_mode,unsigned int digit); 功 能:在读写器的显示屏上显示数字

参 数:unsigned char pt_mode: 小数点显示模式 取值如下:

0 — 小数点熄灭

1 — 个位后的小数点位亮 2 — 十位后的小数点位亮 3 — 百位后的小数点位亮 4 — 千位后的小数点位亮 unsigned int digit:要显示的数 返 回:成功则返回 0 例:int st;

st=rf_disp(0,1234) /*显示整数1234*/

(20) int rf_request(unsigned char _Mode,unsigned int *TagType); 功 能:寻卡请求

参 数:unsigned char _Mode:寻卡模式,为0或1 Mode=0:IDLE模式,一次只选一张卡 Mode=1:ALL模式, 一次可选多张卡

unsigned int *Tagtype:指向返回的卡类型值 返 回:成功则返回 0 例:int st;

unsigned int *tagtype;

st=rf_request(IDLE,tagtype); 注:对卡操作前先执行寻卡指令

(21)int rf_anticoll(unsigned char _Bcnt,unsigned long *_Snr); 功 能:防止卡冲突;返回卡的序列号 参 数:unsigned char _Bcnt: 预选卡所用的位数,标准值为0(不考虑系列号) unsigned long *_Snr: 返回的卡序列号地址 返 回:成功则返回 0 例:int st;

unsigned long *snr;

st=rf_anticoll(0,snr);

注:request指令之后应立即调用anticoll,除非卡的序列号已知。 (22)int rf_select(unsigned long _Snr,unsigned char *_Size); 功 能:从多个卡中选取一个给定序列号的卡 参 数:unsigned long _Snr:卡序列号

unsigned char *_Size:指向返回的卡容量的数据 返 回:成功则返回 0 例: int st;

unsigned long snr=239474; unsigned char *size; st=rf_select(snr,size);

注:上述rf_card()函数包含了20~22三个低级函数。每次对卡重新操作时首先要调用

rf_card()函数(或连续调用20~22三个函数)。 (23) int rf_reset(unsigned int _Msec); 功 能:射频读写模块复位

参 数:unsigned int _Msec:复位时间,0~500毫秒有效 返 回:成功则返回 0 例:int st;

st=rf_reset(60)

(24) int rf_HL_initval(unsigned char _Mode,unsigned char _SecNr, unsigned long _Value,unsigned long *_Snr); 功 能:高级初始化值

参 数:unsigned char _Mode:寻卡模式

Mode=0:IDLE模式,一次只对一张卡操作 Mode=1:ALL模式,一次可对多张卡操作 Mode=2:只对序列号等于snr的卡操作 unsigned char _SecNr:扇区号(0~15) unsigned long _Value:初始值

unsigned long *_Snr:卡的序列号地址 返 回:成功则返回 0

例:if((rf_HL_initval(0x1,1,100L,&snr))!=0) { printf(\ }

printf(\ printf(\

注:下述五个高级函数为几个低级函数的组合,使用前可不必执行rf_card()和rf_authentication指令。

(25) int rf_HL_decrement(unsigned char _Mode,unsigned char _SecNr, unsigned long _Value,unsigned long _Snr,

unsigned long *_NValue, unsigned long *_NSnr);

功 能:高级减值操作

参 数:unsigned char _Mode:寻卡模式,参考HL_initval() unsigned char _SecNr:扇区地址(0~15) unsigned long _Value:要减的值 unsigned long _Snr:卡的序列号 unsigned long *_NValue:减后的值

unsigned long *_NSnr:返回卡的序列号地址 返 回:成功则返回 0

例: if((rf_HL_decrement(1,1,1L,snr,&Rvalue,&Rsnr))!=0) {

printf(\continue; }

printf(\

(26)int rf_HL_increment(unsigned char _Mode,unsigned char _SecNr, unsigned long _Value,unsigned long _Snr, unsigned long *_NValue,unsigned long *_NSnr); 功 能:高级增值操作

参 数:unsigned char _Mode:寻卡模式,参考HL_initval() unsigned char _SecNr:扇区地址(0~15) unsigned long _Value:要加的值 unsigned long _Snr:卡的序列号 unsigned long *_NValue:加后的值

unsigned long *_NSnr:返回卡的序列号地址 返 回:成功则返回 0

例: if((rf_HL_increment(1,1,1L,snr,&Rvalue,&Rsnr))!=0) {

printf(\continue; }

printf(\

(27)int rf_HL_write(unsigned char _Mode,unsigned char _Adr, unsigned long *_Snr,unsigned char *_Data); 功 能:高级写数据

参 数:unsigned char _Mode:寻卡模式

Mode=0:IDLE模式,一次只对一张卡操作 1:ALL模式,一次可对多张卡操作 2:只对序列号等于snr的卡操作 unsigned char _Adr:块地址(1~63) unsigned long *_Snr:卡的序列号地址 unsigned char *_Data:写入的数据 返 回:成功则返回 0

例: if((rf_HL_write(1,5,Snr,HLdata))!=0) { printf(\ }

(28) int rf_HL_read(unsigned char _Mode,unsigned char _Adr,unsigned long _Snr,

unsigned char *_Data, unsigned long *_NSnr); 功 能:高级读数据

参 数:unsigned char _Mode:寻卡模式,参考HL?write() unsigned char _Adr:块地址(0~63) unsigned long _Snr:卡的序列号 unsigned char *_Data:读出的数据 unsigned long *_NSnr:返回卡的序列号 返 回:成功则返回 0

例:if((rf_HL_read(1,5,snr,HLdata,&Rsnr))!=0) {

printf(\ }

(29) int rf_encrypt (char *key, char *ptrsource,unsigned int msglen , char * ptrdest) 功 能:DES算法加密函数

参 数:char *key:指向加密用的密钥

char *ptrsource:指向要加密码的原文

unsigned int msglen: 原文长度,必需为8的倍数 char *ptrdest: 指向加密后的密文 返回:成功返回0

例: char key[]=”12345678”;

char ptrsource[]=”abcdefghabcdefgh”; char*ptrdest;

st=ic_encrypt(dkey,ptrsource,16,ptrdest);

将长度为16的”abcdefghabcdefgh”用密码“12345678” 加密

(30) int rf_decrypt(char *key,char ptrsource,unsigned int msglen, char *ptrdest) 功能:DES算法解密函数

参数:char *key:加密的密钥 char ptrsource: 密文

unsigned int msglen: 原文长度必需为8的倍数 char *ptrdest: 原文 返回:成功返回0

例:略。使用过程与ic_encrypt相反。

(31) int rf_initval_ml(unsigned int _Value);

功 能:初始化值,仅适用于ML卡 参 数:unsigned int _Value:初始值 返 回:成功则返回 0 例:int st;

value=1000;

st=rf_initval(value); /*将ML卡电子钱包赋初值1000*/ 注:必须先赋初始化值, 然后才可以执行减值操作。

(32)int rf_decrment_ml(unsigned int _Value); 功 能:减值操作,仅适用于ML卡

参 数: unsigned int _Value:要减的值 返 回:成功则返回 0

例:int st;

st=rf_decrement(10); /*将ML卡钱包的值减少10 */ (33)int rf_readvl_ml(unsigned int *_Value); 功 能:读值操作,仅适用于ML卡

参 数: unsigned int * _Value:指向读出值的地址 返 回:成功则返回 0 例:int st;

unsigned int value;

st=rf_readvl_ml(&value); /*读出钱包的值*/

3.5 Windows 16位动态库

(1)int rf_init(int port,long baud); 功 能:初始化串口

参 数:int port:通讯口号(0~3)

long baud:通讯波特率(9600~57600),不可缺省 返 回:成功则返回设备描述符(≥0) 例:int icdev;

icdev=rf_init(1,57600); /*初始化com2口以波特率57600*/

(2)void rf_exit(int icdev); 功 能:关闭串口

参 数:int icdev:rf_init()返回的设备描述符 返 回:无

例:rf_exit(icdev);

(3) int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr); 功 能:寻卡,能返回在工作区域内某张卡的序列号 参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Mode:寻卡模式

Mode=0:IDLE模式,一次只选一张卡 Mode=1: ALL模式,一次可选多张卡

unsigned long *_Snr:返回卡的序列号地址 返 回:成功则返回 0 例:int st;

unsigned long snr;

st=rf_card(icdev,IDLE,&snr);

注:如果模式设为0,则在对卡操作完成后,须执行rf_halt()指令中止对卡的操作。

这样,只有该卡离开并重新进入操作区时,读写器才能对它再次操作。 (4)int rf_authentication(int icdev ,unsigned char _Mode,unsigned char _SecNr);

功 能:验证某一扇区密码

参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Mode:验证密码的方式 取值如下:

0 — 用KEYSET0和KEYA验证 1 — 用KEYSET1和KEYA验证 2 — 用KEYSET2和KEYA验证 4 — 用KEYSET0和KEYB验证 5 — 用KEYSET1和KEYB验证 6 — 用KEYSET2和KEYB验证

unsigned char _SecNr:要验证密码的扇区号(0~15) 返 回:成功则返回 0 例:int st;

st=rf_authentication(icdev,0,0);

注:每张卡上有A密码和B密码,可根据实际需要确定是否使用B密码,这由卡的存取

控制位来决定。此外,读写器中可以存放三套密码,用来校验具有不同密码的卡。

可用rf_load_key()来分别装入,只有装入后才能使用验证密码函数验证。

(5) int rf_halt(int icdev); 功 能:中止卡操作

参 数:int icdev:rf_init()返回的设备描述符 返 回:成功则返回 0 例:int st;

st=rf_halt(icdev);

注:使用rf_card()函数时,如果模式选择为 IDLE,则在对卡进行读写操作完毕后,

必须执行rf_halt(),且只能当该卡离开操作区域并再次进入时,读写器才能够

再次操作它。

(6)int rf_read(int icdev,usigned char _Adr,unsigned char *_Data); 功 能:读数据,一次必须读一个块

参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(0~63) unsigned char *_Data:读出的数据 返 回:成功则返回0 例:int st;

static unsigned char data[16] st=rf_read(icdev,0,data);

(7) int rf_read_hex(int icdev,usigned char _Adr, char *_Data); 功 能:以十六进制读数据,一次读一个块

参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(0~63)

char *_Data:读出的数据,数据以16进制形式存放 返 回:成功则返回0 例:int st;

unsigned char data[32]

st=rf_read_hex(icdev,0,data);

(8) int rf_write(int icdev,unsigned char _Adr,unsigned char *_Data); 功 能:写数据, 一次必须写一个块;

参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63)

unsigned char *_Data:写入数据,块长度为16 B 返 回:成功则返回 0 例:int st;

static unsigned char data[16]=”aaaaaaaabbbbbbbb”; st=rf_write(icdev,1,data); /*写入块1*/

(9) int rf_write_hex(int icdev,unsigned char _Adr,char *_Data) 功 能:以十六进制写数据,一次必须写一个块; 参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63) char *_Data:写入数据 返 回:成功则返回 0 例:int st; unsigned char write_buf[32]=\ st=rf_write_hex(icdev,1,write_buf);

(10)int rf_initval(int icdev,unsigned char _Adr,unsigned long _Value); 功 能:初始化块值

参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63) unsigned long _Value:初始值

返 回:成功则返回 0 例:int st

st=rf_initval(icdev,1,100); /*将块1的值初始化为1000*/ 注:作为数值处理的块,是以特殊格式存贮的,必须先初始化值,然后才可进行

读、减、加的处理。

(11)int rf_increment(int icdev,unsigned char _Adr,unsigned long _Value); 功 能:块增值操作

参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63) unsigned long _Value:要增加的值 返 回:成功则返回 0 例:int st;

st=rf_increment(icdev,1,10); /*将块1的值增加10*/ (12)int rf_decrement(int icdev,unsigned char _Adr,unsigned long _Value); 功 能:块减值操作

参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63) unsigned long _Value:要减少的值 返 回:成功则返回 0 例:int st;

st=rf_decrement(icdev,1,10); /*将块1的值减少10*/ (13)int rf_readval(int icdev,unsigned char _Adr,unsigned long *_Value); 功 能:读值

参 数:int icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(0~63)

unsigned long *_Value:返回读出值的地址 返 回:成功返回0 例:int st;

unsigned long value;

st=rf_readval(icdev,1,&value); /*读出块1的值,放入value*/

(14)int rf_restore(int icdev,unsigned char _Adr); 功 能:回传函数,将块内容传入卡的内部寄存器 参 数:int icdev:rf_init()返回的设备描述符

unsigned char *_Adr:要进行回传的地址(0~63) 返 回:成功返回0 例:int st;

st=rf_restore(icdev,1);

注:用此函数将某一块的数值传入内部寄存器,然后用rf_transfer()函数传送到

另一块中去,即实现了块与块之间的数值传送。

(15)int rf_transfer(int icdev,unsigned char _Adr); 功 能:将寄存器的内容传送到指定块中

参 数:int icdev:rf_init()返回的设备描述符

unsigned char _Adr:要传送的地址(0~63) 返 回:成功返回0 例:int st;

st=rf_transfer(icdev,1); 注:见rf_restore()的说明。

(16)int rf_load_key(int icdev,unsigned char _Mode,unsigned char SecNr, unsigned char *_Nkey); 功 能:向读写器RAM中装入密码

参 数:int icdev:rf_init()返回的设备描述符

unsigned char _Mode :同 rf_authentication() unsigned char _SecNr:同 rf_authentication() unsigned char *_Nkey:写入RAM中的卡密码 返 回:成功则返回 0

例://key A and key B

unsigned char tk[2][7]= {{0xa0,0xa1,0xa2,0xa3,0xa4,0xa5}, {0xb0,0xb1,0xb2,0xb3,0xb4,0xb5}}; /* 装入1扇区的0套A密码*/

if((rf_load_key(icdev,0, 1,tk[1]))!=0) { printf(\ rf_exit(); exit(1); }

注:*_Nkey是与卡中的密码相对应的密码。在验证密码之前,先要使用load?_key函数

将卡中的密码写入读写器的RAM中。

(17)int rf_load_key_hex(int icdev,unsigned char _Mode,unsigned char SecNr,

char *_Nkey); 功 能:向读写器RAM中装入十六进制密码 参 数:int icdev:设备描述符

unsigned char _Mode :同 rf_authentication() unsigned char _SecNr:同 rf_authentication() unsigned char *_Nkey:写入读写器中的卡密码 返 回:成功则返回 0

例:/* 装入1扇区的A密码|0套*/

if((rf_load_key_Hex(icdev,0, 1, \ { printf(\ rf_exit();

exit(1); }

注:*_Nkey是与卡中的密码相对应的密码。

(18)int rf_beep(int icdev,unsigned int _Msec); 功 能:蜂鸣

参 数:int icdev:设备描述符

unsigned int _Msec:蜂鸣时间的长短,单位是10毫秒 返 回:成功则返回 0 例:int st;

st=rf_beep(icdev,10); /*鸣叫100毫秒*/

(19)int rf_disp(int icdev,unsigned char pt_mode,unsigned int digit); 功 能:读写器的数码管显示数字

参 数:int icdev:rf_init()返回的设备描述符 unsigned char pt_mode: 小数点显示模式 取值如下:

0 — 小数点熄灭

1 — 个位后的小数点位亮 2 — 十位后的小数点位亮 3 — 百位后的小数点位亮 4 — 千位后的小数点位亮 unsigned int digit:要显示的数 返 回:成功则返回 0 例:int st;

st=rf_disp(icdev,0,1234) /*显示整数1234*/ (20) int rf_request(int icdev,unsigned char _Mode,

unsigned int *TagType); 功 能:寻卡请求

参 数: int icdev:设备描述符

unsigned char _Mode:寻卡模式,为0或1 Mode=0:IDLE模式,一次只选一张卡 Mode=1:ALL模式, 一次可选多张卡

unsigned int *Tagtype:指向返回的卡类型值 返 回:成功则返回 0 例:int st;

st=rf_request(icdev,IDLE,tagtype); 注:对卡操作前先执行寻卡指令

(21)int rf_anticoll(int icdev,unsigned char _Bcnt,unsigned long *_Snr); 功 能:防止卡冲突;返回卡的序列号 参 数:int icdev:设备描述符 unsigned char _Bcnt: 预选卡所用的位数,标准值为0(不考虑系列号) unsigned long *_Snr: 返回的卡序列号地址

返 回:成功则返回 0 例:int st;

st=rf_anticoll(0,snr);

注:request指令之后应立即调用anticoll,除非卡的序列号已知。

(22)int rf_select(int icdev,unsigned long _Snr,unsigned char *_Size); 功 能:从多个卡中选取一个给定序列号的卡 参 数:int icdev:设备描述符

unsigned long _Snr:卡序列号

unsigned char *_Size:指向返回的卡容量的数据 返 回:成功则返回 0 例: int st; snr=239474;

st=rf_select(snr,size); /* 返回239474卡的容量 */

注:上述rf_card()寻卡函数包含了20~22三个低级函数。每次对卡重新操作时首先要调用rf_card()函数(或连续调用20~22三个函数)。

(23)int rf_encrypt(char *key,char *ptrSource,unsigned int msgLen,char *ptrDest);

功 能:DES加密函数

参 数:char *key:指向加密用的密钥

char *ptrSource:指向要加密的原文 unsigned int msglen:原文的长度 char *ptrDest:指向加密后的密文 返 回:成功则返回 0 例:int st;

char dkey[]=\

char dptrSource[]=\ unsigned int dmsglen; char *dptrDest;

dmsglen=strlen(dptrSource);

st=rf_encrypt(dkey,dptrSource,dmsglen,dptrDest);

(24)int rf_decrypt(char *key,char *ptrSource,unsigned int msgLen,char *ptrDest);

功 能:DES解密函数

参 数:char *key:指向解密用的密钥

char *ptrSource:指向要解密的密文 unsigned int msglen:密文的数据长度 char *ptrDest:指向解密后的原文 返 回:成功则返回 0

例:略,过程与解密相反。

(25)int rf_get_status(int icdev,unsigned char *_Status); 功 能:取读写器的的版本号,如“mwrf025_v2.0”

参 数:int icdev:设备描述符

unsigned char *_Status:返回读写器版本号 返 回:成功则返回 0 例:int st;

unsigned char *version;

st=rf_get_status(icdev,version);

(26)int rf_reset(int icdev,unsigned int _Msec); 功 能:射频读写模块复位 参 数:int icdev设备描述符

unsigned int _Msec:复位时间,0~500毫秒有效 返 回:成功则返回 0

例:rf_reset(icdev,60);

(27)int rf_HL_initval(int icdev,unsigned char _Mode,unsigned char _SecNr,

unsigned long _Value,unsigned char *_Snr); 功 能:高级初始化值

参 数:int icdev:设备描述符

unsigned char _Mode :寻卡模式

Mode=0: IDLE模式,一次只操作一张卡 1:ALL模式,一次可操作多张卡 2:只对给定序列号的卡操作 unsigned char _SecNr:扇区号(0~15) unsigned long _Value:初始值

unsigned char *_Snr :卡的序列号的地址 返 回:成功则返回 0

例:st=rf_HL_initval(icdev,1,1000L,&Snr);

注:高级函数为几个低级函数的组合,对卡操作之前不必使用rf_card()函数。

(28)int rf_HL_decrement(int icdev,unsigned char _Mode,unsigned char _SecNr,

unsigned long _Value,unsigned long _Snr,

unsigned long *_NValue,unsigned long *_NSnr); 功 能:高级减值操作

参 数:int icdev:设备描述符

unsigned char _Mode:寻卡模式,同HL_initval(); unsigned char _SecNr:扇区号(0~15) unsigned long _Value:要减的值 unsigned long _Snr:卡的序列号

unsigned long *_NValue:减后的值的地址 unsigned long *_NSnr:返回卡的序列号地址 返 回:成功则返回 0

例:int st;

st=rf_HL_decrement(icdev,0,1,10,Snr,&Nvalue,&NSnr);

/*将扇区1的值减少10*/ (29)int rf_HL_increment(int icdev,unsigned char _Mode,unsigned char _SecNr,

unsigned long _Value,unsigned long _Snr,

unsigned long *_NValue,unsigned long *_NSnr); 功 能:高级增值函数

参 数:int icdev:设备描述符

unsigned char _Mode:寻卡模式,同HL_initval(); unsigned char _SecNr:扇区号(0~15) unsigned long _Value:要加的值 unsigned long _Snr:卡的序列号

unsigned long *_NValue:加后的值的地址 unsigned long *_NSnr:返回卡的序列号地址 返 回:成功则返回 0

例:int st;

st=rf_HL_increment(icdev,0,1,value,Snr,&Nvalue,&NSnr);

/*将扇区1的值加10*/ (30)int rf_HL_write(int icdev,unsigned char _Mode,unsigned char _Adr, unsigned long *_Snr,unsigned char *_Data); 功 能:高级写数据

参 数:int icdev:设备描述符

unsigned char _Mode:寻卡模式

Mode=0: IDLE模式,一次只操作一张卡 1:ALL模式,一次可操作多张卡 2:只对给定序列号的卡操作 unsigned char _Adr:块地址(1~63) unsigned long *_Snr:卡的序列号地址 unsigned long *_Date:写入的数据 返 回:成功则返回 0

例:st=rf_HL_write(icdev,0,3,&Snr,data);

(31)int rf_HL_read(int icdev,unsigned char _Mode,unsigned char _Adr, unsigned long _Snr,unsigned char *_Data,unsigned char *_NSnr);

功 能:高级读数据

参 数:int icdev:设备描述符

unsigned char _Mode:寻卡模式,同HL_write(); unsigned char _Adr:块地址(0~63) unsigned long _Snr:卡的序列号 unsigned long *_Date:读出的数据

unsigned char *_NSnr:返回卡的序列号地址

返 回:成功则返回 0

例:st=r_HL_read(icdev,0,3,Snr,data,&NSnr);

(32)int rf_initval_ml(int icdev ,unsigned int _Value); 功 能:初始化值,仅适用于ML卡

参 数:int icdev:rf_init()返回的设备描述符 unsigned int _Value:初始值 返 回:成功则返回 0 例:int st

st=rf_initval(icdev, 1000); /*将电子钱包的值初始化为1000*/

(33)int rf_decrement_ml(int icdev,unsigned int _Value); 功 能:减值操作,仅适用于ML卡

参 数:int icdev:rf_init()返回的设备描述符 unsigned int _Value:要减少的值 返 回:成功则返回 0 例:int st;

st=rf_decrement(icdev, 10); /*将钱包的值减少10*/ (34)int rf_readval_ml(int icdev ,unsigned int *_Value); 功 能:读值,仅适用于ML卡

参 数:int icdev:rf_init()返回的设备描述符 unsigned int *_Value:指向读出值的地址 返 回:成功则返回 0 例:int st

unsigned int value;

st=rf_readval_ml(icdev, &value); /*读出钱包的值*/

3.6 Windows 32位动态库

(1)HANDLE rf_init(__int16 port,long baud); 功 能:初始化串口

参 数:__int16 port:通讯口号(0~3)

long baud:通讯波特率(9600~115200) 返 回:成功则返回设备描述符(≥0) 例:HANDLE icdev;

icdev=rf_init(1,115200); /*初始化com2口以波特率115200*/

(2)__int16 rf_exit(HANDLE icdev); 功 能:关闭串口

参 数:HANDLE icdev:rf_init()返回的设备描述符 返 回:成功返回 0 例:rf_exit(icdev);

(3)__int16 rf_card(HANDLE icdev,unsigned char _Mode,unsigned long *_Snr);

功 能:寻卡,能返回在工作区域内某张卡的序列号 参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Mode:寻卡模式

Mode=0: IDLE模式,一次操作一张卡 Mode=1: ALL模式,一次操作多张卡 unsigned long *_Snr: 返回卡的序列号地址 返 回:成功则返回 0 例:__int16 st;

unsigned long snr;

st=rf_card(icdev,IDLE,&snr);

注:如果设为IDLE模式,则在对卡操作完成后,须执行rf_halt()指令中止对卡的操作。

这样,只有该卡离开并重新进入操作区时,读写器才能对它再次操作。 (4)__int16 rf_authentication(HANDLE icdev ,unsigned char _Mode, unsigned char _SecNr); 功 能:验证某一扇区密码

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Mode:验证密码的方式 取值如下:

0 — 用KEYSET0和KEYA验证 1 — 用KEYSET1和KEYA验证 2 — 用KEYSET2和KEYA验证 4 — 用KEYSET0和KEYB验证 5 — 用KEYSET1和KEYB验证 6 — 用KEYSET2和KEYB验证

unsigned char _SecNr:要验证密码的扇区号(0~15) 返 回:成功则返回 0 例:__int16 st;

st=rf_authentication(icdev,0,0);

注:每张卡上有A密码和B密码,可根据实际需要确定是否使用B密码,这由卡的存取

控制位来决定。此外,读写器中可以存放三套密码,可用rf_load_key()分别装

入,只有装入后才能使用验证密码函数验证。

(5)__int16 rf_halt(HANDLE icdev); 功 能:中止卡操作

参 数:HANDLE icdev:rf_init()返回的设备描述符 返 回:成功则返回 0 例:__int16 st;

st=rf_halt(icdev);

注:使用rf_card()函数时,如果模式选择为 0则在对卡进行读写操作完毕后,

必须执行rf_halt(),且只能当该卡离开并再次进入操作区域时,读写器

才能够再次操作它。

(6)__int16 rf_read(HANDLE icdev,usigned char _Adr,unsigned char *_Data); 功 能:读数据,一次必须读一个块

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(0~63) unsigned char *_Data:读出数据 返 回:成功则返回0 例:__int16 st;

static unsigned char data[16] st=rf_read(icdev,0,data);

(7)__int16 rf_read_hex(HANDLE icdev,usigned char _Adr,unsigned char *_Data);

功 能:以十六进制读数据,一次必须读一个块

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(0~63) unsigned char *_Data:读出数据 返 回:成功则返回0 例:__int16 st;

static unsigned char data[32]

st=rf_read_hex(icdev,0,data); /*读出数据格式如rf_write_hex*/

(8)__int16 rf_write(HANDLE icdev,unsigned char _Adr,unsigned char *_Data);

功 能:写数据, 一次必须写一个块

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63)

unsigned char *_Data:写入数据,块长度为16 B 返 回:成功则返回 0 例:__int16 st;

static unsigned char data[16] /* 给data赋值*/

st=rf_write(icdev,1,data); /*写入块1*/

(9)__int16 rf_write_hex(HANDLE icdev,unsigned char _Adr,unsigned char *_Data);

功 能:以十六进制写数据, 一次必须写一个块

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63)

unsigned char *_Data:写入数据,块长度为32Byte 返 回:成功则返回 0 例:__int16 st;

unsigned char data[32]=\ /* data赋值为16个0xaa*/

st=rf_write_hex(icdev,1,data); /*写入块1*/

(10)__int16 rf_initval(HANDLE icdev,unsigned char _Adr,unsigned long _Value);

功 能:初始化块值

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63) unsigned long _Value:初始值 返 回:成功则返回 0 例:__int16 st;

unsigned long value;

value=1000;

st=rf_initval(icdev,1,value); /*将块1的值初始化为value*/

注:作为数值处理的块,是以特殊格式存贮的,所以必须用初始化值函数初始化,

初始化之后方可进行读、减、加的处理。

(11)__int16 rf_increment(HANDLE icdev,unsigned char _Adr,unsigned long _Value);

功 能:块增值操作

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63) unsigned long _Value:要增加的值 返 回:成功则返回 0; 例:__int16 st;

unsigned long value;

value=1;

st=rf_increment(icdev,1,value); /*将块1的值增加value*/ (12)__int16 rf_decrment(HANDLE icdev,unsigned char _Adr,unsigned long _Value);

功 能:块减值操作

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(1~63) unsigned long _Value:要减少的值 返 回:成功则返回 0 例:__int16 st;

unsigned long value;

value=1;

st=rf_decrement(icdev,1,value); /*将块1的值减少value*/ (13)__int16 rf_readval(HANDLE icdev,unsigned char _Adr,unsigned long *_Value); 功 能:读值

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:块地址(0~63)

unsigned long *_Value:返回读出值的地址 返 回:成功返回0 例:__int16 st;

unsigned long value;

st=rf_readval(icdev,1,&value); /*读出块1的值,放入value*/

(14)__int16 rf_restore(HANDLE icdev,unsigned char _Adr); 功 能:将某块的数据传入卡的内部寄存器中

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:要进行回传的地址 返 回:成功返回0 例:__int16 st;

st=rf_restore(icdev,1); 注:用此函数将某一块内的数值传入卡的内部寄存器,然后用rf_transfer()函数

将寄存器的数据再传送到另一块中去,即实现了块与块之间的数值传送。 (15)__int16 rf_transfer(HANDLE icdev,unsigned char _Adr); 功 能:将寄存器的数据传送到某一块中

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Adr:要传送的地址(0~63) 返 回:成功返回0 例:__int16 st;

st=rf_transfer(icdev,1); 注:见rf_restore()的说明。

(16)__int16 rf_load_key(HANDLE icdev,unsigned char _Mode,unsigned char SecNr,

unsigned char * _Nkey); 功 能:向读写器的RAM装入密码

参 数:HANDLE icdev:rf_init()返回的设备描述符

unsigned char _Mode :同 rf_authentication() unsigned char _SecNr:同 rf_authentication()

unsigned char *_Nkey:包含了要写入硬件系统RAM中的卡密码 返 回:成功则返回 0

例://key A and key B

unsigned char tk[2][7]= { {0xa0,0xa1,0xa2,0xa3,0xa4,0xa5}, {0xb0,0xb1,0xb2,0xb3,0xb4,0xb5} }; /*装入1扇区的A密码 0套,*/

if((rf_load_key(icdev,0, 1,tk[1]))!=0) {

printf(\ rf_exit(); exit(1); }

注:*_Nkey是与卡中的密码相对应的密码。

(17)__int16 rf_load_key_hex(HANDLE icdev,unsigned char _Mode, unsigned char SecNr,char * _Nkey); 功 能:向读写器的RAM装入16进制密码

参 数:HANDLE icdev:rf_init()返回的设备描述符

unsigned char _Mode :同 rf_authentication() unsigned char _SecNr:同 rf_authentication() unsigned char *_Nkey:要写入读写器RAM中的卡密码 返 回:成功则返回 0 例://key A

unsigned char tk[]= \等同于{0xa0_.0xa5}*/ /*装入1扇区的A密码|0套,*/

if((rf_load_key_Hex(icdev,0, 1,tk))!=0) {

printf(\ rf_exit(); exit(1); }

注:*_Nkey是与卡中的密码相对应的密码。

(18)_int16 rf_get_status(unsigned char *_Status); 功 能:取得读写器的版本号,如“mwrf025_v2.0”

参 数:unsigned char *_Status:返回读写器版本信息 返 回:成功则返回 0 例:int st;

unsigned char status[32]; st=rf_get_status(status);

(19) __int16 rf_request(int icdev,unsigned char _Mode, unsigned int *TagType);

功 能:寻卡请求

参 数: HANDLE icdev:设备描述符

unsigned char _Mode:寻卡模式,为0或1 Mode=0:IDLE模式,一次只选一张卡 Mode=1:ALL模式, 一次可选多张卡

unsigned int *Tagtype:指向返回的卡类型值 返 回:成功则返回 0 例:int st;

st=rf_request(icdev,IDLE,tagtype); 注:对卡操作前先执行寻卡指令

(20)__int16 rf_anticoll(int icdev,unsigned char _Bcnt,unsigned long *_Snr);

功 能:防止卡冲突;返回卡的序列号 参 数:HANDLE icdev: 设备描述符 unsigned char _Bcnt: 预选卡所用的位数,标准值为0(不考虑系列号) unsigned long *_Snr: 返回的卡序列号地址 返 回:成功则返回 0 例:int st;

st=rf_anticoll(0,snr);

注:request指令之后应立即调用anticoll,除非卡的序列号已知。

(21)__int16 rf_select(int icdev,unsigned long _Snr,unsigned char *_Size);

功 能:从多个卡中选取一个给定序列号的卡 参 数:HANDLE icdev:设备描述符 unsigned long _Snr:卡序列号

unsigned char *_Size:指向返回的卡容量的数据 返 回:成功则返回 0 例: int st; snr=239474;

st=rf_select(snr,size); /* 返回239474卡的容量 */

注:上述rf_card()寻卡函数包含了19~21三个低级函数。每次对卡重新操作时首先要调用rf_card()函数(或连续调用19~21三个函数)。

(22)__int16 rf_encrypt(char *key,char *ptrsource,unsigned __int16 msglen,

char *ptrdest); 功 能:DES算法加密

参 数:char *key:加密的密码,长度为8 char *ptrsource:原文

unsigned __int16 msglen:原文长度 char *ptrdest:密文 返 回:成功则返回0

例:/* 将长度为16的”abcdefghabcdefgh”用密码“12345678”加密 */ rf_encrypt(“12345678”,”abcdefghabcdefgh”,16,ptrdest)

(23)__int16 rf_decrypt(char *key,char *ptrsource,unsigned __int16 msglen,

char *ptrdest);

功 能:DES算法解密函数

参 数:char *key:加密的密码,长度为8 char *ptrsource:加密后密文

unsigned __int16 msglen:原文长度 char *ptrdest:原文 返 回:成功则返回0

例:略,使用过程与rf_encrypt相反。

(24)__int rf_beep(unsigned int _Msec); 功 能:蜂鸣

参 数:unsigned int _Msec:蜂鸣时间的长短,单位是10毫秒; 返 回:成功则返回 0 例:int st;

st=rf_beep(10); /*鸣叫100毫秒*/

(25)__int rf_disp(HANDLE icdev,unsigned char pt_mode,unsigned int digit);

功 能:使读写器的数码管显示数字

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char pt_mode: 小数点显示模式 取值如下:

0 — 小数点熄灭

1 — 个位后的小数点位亮 2 — 十位后的小数点位亮 3 — 百位后的小数点位亮 4 — 千位后的小数点位亮 unsigned int digit:要显示的数 返 回:成功则返回 0 例:int st;

st=rf_disp(icdev,0,1234); /*显示整数1234*/ (26)__int16 rf_reset(HANDLE icdev,unsigned __int16 _Msec); 功 能:射频头复位

参 数:HANDLE icdev:rf_init()返回的设备描述符

unsigned __int16 _Msec:复位时间,0~500毫秒有效 返 回:成功则返回 0

例:st=rf_reset(icdev,60);

(27)__int16 rf_HL_initval(HANDLE icdev,unsigned char _Mode,unsigned char _SecNr,

unsigned long _Value,unsigned char *_Snr); 功 能:高级初始化值

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Mode:寻卡模式,为0、1或2

Mode=0: IDLE模式,一次只操作一张卡

1:ALL模式,一次可操作多张卡 2:只对给定序列号的卡操作 unsigned char _SecNr:扇区号(0~15) unsigned long _Value:初始值

unsigned char *_Snr:卡的序列号地址 返 回:成功则返回 0

例:st=rf_HL_initval(icdev,0,3,100L,&Snr);

注:高级函数为几个低级函数的组合,对卡操作之前不必使用rf_card()和 rf_authentication()函数。

(28)__int16 rf_HL_decrement(HANDLE icdev,unsigned char _Mode,

unsigned char _SecNr,unsigned long _Value, unsigned long _Snr,unsigned long *_NValue, unsigned long *_NSnr); 功 能:高级减值函数

参 数:HANDLE icdev:rf_init()返回的设备描述符

unsigned char _Mode:寻卡模式,同HR_initval(); unsigned char _SecNr:扇区号(0~15) unsigned long _Value:要减的值 unsigned long _Snr:卡的序列号

unsigned long *_NValue:减后的值的地址 unsigned long *_NSnr:返回卡的序列号地址 返 回:成功则返回 0

例:st=rf_HL_decrement(icdev,0,2,1,Snr,&Nvalue,&NSnr);

(29)__int16 rf_HL_increment(HANDLE icdev,unsigned char _Mode, unsigned char _SecNr,unsigned long _Value, unsigned long _Snr,unsigned long *_NValue, unsigned long *_NSnr); 功 能:高级增值函数

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Mode:寻卡模式,同HL_initval(); unsigned char _SecNr:扇区号(0~15) unsigned long _Value:要加的值 unsigned long _Snr:卡的序列号

unsigned long *_NValue:加后的值的地址 unsigned long *_NSnr:返回卡的序列号地址 返 回:成功则返回 0

例:st=rf_HL_increment(icdev,0,2,1,Snr,&Nvalue,&NSnr);

(30)__int16 rf_HL_write(HANDLE icdev,unsigned char _Mode,unsigned char _Adr,

unsigned long *_Snr,unsigned char *_Data); 功 能:高级写数据

参 数:HANDLE icdev:rf_init()返回的设备描述符

unsigned char _Mode:寻卡模式,为0、1或2

Mode=0: IDLE模式,一次只操作一张卡 1:ALL模式,一次可操作多张卡 2:只对给定序列号的卡操作 unsigned char _Adr:块地址(1~63) unsigned long *_Snr:卡的序列号地址 unsigned char *_Data:写入的数据 返 回:成功则返回 0

例:st=rf_HL_write(icdev,0,3,&Snr,data);

(31)__int16 rf_HL_read(HANDLE icdev,unsigned char _Mode,unsigned char _Adr,

unsigned long _Snr,unsigned char *_Data, unsigned long *_NSnr); 功 能:高级读数据

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned char _Mode:同HL?_write(); unsigned char _Adr:块地址(0~63) unsigned long _Snr:卡的序列号 unsigned char *_Data:读出的数据

unsigned long *_NSnr:返回卡的序列号地址 返 回:成功则返回 0

例:st=rf_HL_read(icdev,0,3,Snr,data,&NSnr);

(32)__int16 rf_initval_ml(HANDLE icdev, unsigned int _Value); 功 能:初始化值,仅适用于ML卡

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned int _Value:初始值 返 回:成功则返回 0

例:__int16 st;

st=rf_initval(icdev,1000); /*将ML卡钱包赋初值1000*/ (33)__int16 rf_decrment_ml(HANDLE icdev, unsigned int _Value); 功 能:减值操作,仅适用于ML卡

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned int _Value:要减少的值 返 回:成功则返回 0

例:__int16 st;

st=rf_decrement(icdev, 10); /*将钱包的值减少10*/ (34)__int16 rf_readval_ml(HANDLE icdev, unsigned int *_Value); 功 能:读值,仅适用于ML卡

参 数:HANDLE icdev:rf_init()返回的设备描述符 unsigned int *_Value:指向读出值的地址 返 回:成功则返回 0

例:__int16 st;

unsigned int value;

st=rf_readval?_ml(icdev,&value); /*读出钱包的值*/ 3.7 FoxPro For Dos 库函数 (1) rf_init(_Com,_Baud); 功 能:初始化串口

参 数:_Com:通讯串口(0~3)

_Baud:通讯波特率,9600~115200 返 回:成功则返回设备描述符(≥0) 例:icdev=rf_init(1,115200); (2) rf_exit(icdev); 功 能:关闭串口

参 数:icdev:rf_init()返回的设备描述符 返 回:成功则返回0 例:rf_exit(icdev);

(3)rf_card(icdev,_Mode,_Snr);

功 能:寻卡,能返回在工作区域内某张卡的序列号 参 数:icdev:rf_init()返回的设备描述符 _Mode:整数,寻卡模式,为IDLE或ALL Mode=0: IDLE模式,一次只操作一张卡 Mode=1:ALL模式,一次可操作多张卡

有关_Mode的说明请参阅rf_halt()函数说明 _Snr:字符串,卡的序列号 返 回:成功则返回卡的序列号,为整数 例:snr=rf_card(icdev,0,Snr);

(4)rf_auth(icdev,_Mode,_SecNr) 功 能:验证某一扇区密码

参 数:icdev:rf_init()返回的设备描述符 _Mode:整数,决定验证密码的方式 取值如下:

0 — 用KEYSET0和KEYA验证 1 — 用KEYSET1和KEYA验证 2 — 用KEYSET2和KEYA验证 4 — 用KEYSET0和KEYB验证 5 — 用KEYSET1和KEYB验证 6 — 用KEYSET2和KEYB验证

_SecNr:整数,为要验证密码的扇区号(0~63) 返 回:成功则返回 0

例:/* 用A密码和 0套密码去验证扇区0 */ st=rf_pass(icdev,0,0);

注:每张卡上有A密码和B密码,可根据实际需要确定是否使用B密码,这

由卡的存取

控制位来决定。读写器中可以存放三套密码,可用rf_load_key()来分别装入

只有装入后才能使用验证密码函数验证。

(5)rf_halt(icdev); 功 能:中止卡操作

参 数:icdev:rf_init()返回的设备描述符 返 回:成功则返回 0

例:st=rf_halt(icdev);

注:使用rf_card()函数时,如果模式选择为0(IDLE),则在对卡读写操作完毕后,必须

执行rf_halt()中止对卡的操作。只有该卡离开并再次进入操作区域时,读写器才能

够再次操作它。

(6)rf_read( icdev,_Adr);

功 能:读数据,一次必须读一个块

参 数:icdev:rf_init()返回的设备描述符 _Adr:整数,为块地址(0~63)

返 回:成功则返回所读数据的第一个字符为'0',否则请参考错误值; 从第二个字符开始16个字节为该块的数据

例:/* 读块0中的数据并将数据存放在变量value中 */ value=rf_read(icdev,0);

(7)rf_rd_hex(icdev,_Adr);

功 能:以十六进制读数据,一次必须读一个块 参 数:icdev:rf_init()返回的设备描述符 _Adr:整数,为块地址(0~63)

返 回:成功则返回所读数据的第一个字符为'0',否则请参考错误值; 从第二个字符开始32个字节为该块用16进制表示的数据 例:/* 读块0中的数据并将数据存放在变量value中 */ value=rf_rd_hex(icdev,0);

(8)rf_write(icdev,_Adr,_Data); 功 能:写数据, 一次必须写一个块

参 数:icdev:rf_init()返回的设备描述符 _Adr:整数,为块地址(1~63) _Data:字符串,存放要写的数据 返 回:成功则返回 0

例:/* 将存放在字符串data中的数据写到块1中 */ st=rf_write(icdev,1,data)

(9)rf_wr_hex(icdev,_Adr,_Data)

功 能:以十六进制写数据,一次必须写一个块

参 数:icdev: rf_init()返回的设备描述符 _Adr: 整数,为块地址(1~63) _Data: 字符串,指向存放要写数据的地址,存放16个用16进制表示的字符,

长度为32B 。 返 回:成功则返回 0

例: st=rf_wr_hex(icdev,1, \(10)rf_inc_val(icdev,_Adr,_Value); 功 能:块增值

参 数:icdev: rf_init()返回的设备描述符 _Adr:整数,为所增值的地址(1~63)

_Value:整数,为要增加的值(长度为4字节) 返 回:成功则返回 0;

例:/* 块1增加数值value; */ st=rf_inc_val(icdev,1,value);

(11)rf_dec_val(icdev,_Adr,_Value); 功 能:块减值

参 数:icdev: rf_init()返回的设备描述符 _Adr:整数,为块地址(1~63)

_Value:整数,为要减少的值(长度为4字节) 返 回:成功则返回 0

例:/* 块1减去数值value */

st=rf_dec_val(icdev,1,value);

(12)rf_ini_val(icdev,_Adr,_Value); 功 能:初始化块值

参 数:icdev: rf_init()返回的设备描述符 _Adr:整数,为块地址(1~63)

_Value:整数,为初始值(长度为4字节) 返 回:成功则返回 0

例:/* 将块1的值初始化为value */ st=rf_ini_val(icdev,1,value);

注:作为数值处理的块,是以特殊格式存贮的,所以必须用初始化值函数初始化,

初始化之后方可进行读、减、加的处理。 (13)rf_rd_val(icdev,_Adr); 功 能:读块值

参 数:icdev: rf_init()返回的设备描述符 _Adr:整数,为块地址(1~63) 返 回:读出值(整数)

例: st= rf_readval(icdev,1);

(14) rf_tran(icdev,_Adr);

功 能:将寄存器的内容传送到块中

参 数:icdev: rf_init()返回的设备描述符 _Adr:整数,为要传送的地址(0~63) 返 回:成功返回0

例:st=rf_tran(icdev,1); 注:见rf_rest()的说明。

(15) rf_rest(icdev,_Adr);

功 能:将块中数据回传到卡的寄存器中 参 数:icdev: rf_init() 返回的设备描述符 _Adr:整数,为要进行回传的地址(0~63) 返 回:成功返回0

例:st=rf_rest(icdev,1);

注:用此函数将某一块内的数值传入寄存器中,然后用rf_transfer()函数将寄存器

的数据再传送到另一块中,即实现了块与块之间的数值传送。 (16)rf_ld_k(icdev,_Mode,_SecNr,Key); 功 能:向读写器的RAM中装入密码

参 数:icdev: rf_init()返回的设备描述符 _Mode:同 rf_auth() _SecNr: 同 rf_anth()

Key:字符串,为写入读写器RAM中的卡密码 返 回:成功则返回 0

例:Key=Chr(160)+Chr(161)+Chr(162)+Chr(163)+Chr(164)+Chr(165) st=rf_ld_k(icdev,0,1,Key);

(17) rf_ld_kh(icdev,_Mode,_SecNr,Key); 功 能:向读写器的RAM中装入十六进制密码 参 数:icdev: 返回的设备描述符 _Mode:同 rf_auth() _SecNr:同 rf_auth()

Key:字符串,为写入读写器RAM中的卡密码 返 回:成功则返回 0

例:Key=\

st=rf_ld_kh(icdev,0,1,Key);

(18)rf_beep(icdev,_Msec); 功 能:蜂鸣

参 数:icdev: rf_init()返回的设备描述符

_Msec: 蜂鸣时间的长短,单位是10毫秒; 返 回:成则返回 0

例: st=rf_beep(icdev,10); /*鸣叫100毫秒*/

(19)rf_disp(icdev,pt_mode,digit); 功 能:使读写器的数码管显示数字

参 数:icdev: rf_init()返回的设备描述符 pt_mode: 小数点显示模式 取值如下:

0 — 小数点熄灭

1 — 个位后的小数点位亮 2 — 十位后的小数点位亮 3 — 百位后的小数点位亮 4 — 千位后的小数点位亮 digit: 要显示的数 返 回:成功则返回 0

例:st=rf_disp(icdev,0,1234); /*显示整数1234*/ (20)rf_get_sta(icdev)

功 能:读取版本号,如“mwrf025_v2.0” 参 数:icdev: rf_init()返回的设备描述符 返 回:成功则返回读写器版本信息 例:VERBUFF=rf_get_sta(icdev); (21)rf_reset(icdev,_Msec) 功 能:射频头复位

参 数:icdev: rf_init()返回的设备描述符 _Msec:复位时间,0~500毫秒有效 返 回:成功则返回 0

例:st=rf_reset(icdev,60);

(22) rf_HL_ini(icdev,Mode,_SecNr,Value,_Snr) 功 能:高级初始化值

参 数:icdev: rf_init()返回的设备描述符 Mode=0:IDLE模式,一次只操作一张卡 1:ALL模式,一次操作多张卡 2:只对给定序列号的卡操作 _SecNr:扇区号(0~15) Value:初始值 _Snr:卡的序列号 返 回:成功则返回卡的序列号 例:?\

SNR=rf_HL_ival(ICDEV,1,10,5854019,SNR) (23)rf_HL_dec(icdev,Mode,_SecNr,Value,_Snr) 功 能:高级减值操作

参 数:icdev: rf_init()返回的设备描述符 Mode:寻卡模式 ,同HL_ini(); _SecNr:扇区号

Value:要减的值 _Snr:卡的序列号 返 回:成功则返回卡的序列号

例:NSnr=rf_HL_dec(icdev,0,3,Snr); (24)rf_HL_inc(icdev,Mode,_SecNr,Value,_Snr) 功 能:高级增值操作

参 数:icdev: rf_init()返回的设备描述符 Mode:同HL_ini(); _SecNr:扇区号 Value:要加的值 _Snr:卡的序列号 返 回:成功则返回卡的序列号 例:?\

SNR=rf_HL_inc(ICDEV,1,10,100,SNR)

(25) rf_HL_wr(icdev,Mode,_Adr,_Snr,_Data) 功 能:高级写数据

参 数:icdev: rf_init()返回的设备描述符 Mode:同HL?_ini(); _Adr:块地址(1~63) _Snr:卡的序列号 _Data:要写的数据 返 回:成功则返回卡的序列号 例:?\

SNR=rf_HL_wr(ICDEV,1,41,SNR,\

(26) rf_HL_rd(icdev,Mode,_Adr,_Snr) 功 能:高级读数据

参 数:icdev: rf_init()返回的设备描述符 Mode:同HL?_ini(); _Adr:块地址(0~63) _Snr:卡的序列号

返 回:成功则返回长度为17 B的字符串,第一个字符为'0',从第二个字符开始的16个字

节为该块的数据;否则请参考错误值; 例:?\

READBUFFER=RFX_REA_H(ICDEV,1,41,SNR)

(27)ic_encrypt(key, ptrsource, msglen ) 说明: DES算法加密函数

参数: key:加密的密钥,长度为8 ptrsource: 原文

msglen:原文长度必需为8的倍数

返回: 返回的第一个字符值为0,表示操作成功;从第二个字符开始为密文

举例: st=ic_encrypt(“12345678”,”abcdefghabcdefgh”,16) 将长度为16的”abcdefghabcdefgh”用密码“12345678” 加密,加密后的密文

放在 st中从第2个字符开始字节处。

(28)ic_decrypt(key, ptrsource, msglen)

说明:DES算法解密函数,使用过程与ic_encrypt相反 调用:key: 加密的密钥;长度为8 ptrsource: 加密后的密文

msglen: 原文长度必需为8的倍数

返回:返回的第一个字符值为0,表示操作成功;从第二个字符开始为解密后的原文

举例:st=ic_decrypt(“12345678”,”abcdefghabcdefgh”,16) 将长度为16的”abcdefghabcdefgh”用密码“12345678” 解密 (29)rf_ini_ml(icdev, _Value); 功 能:初始化值,仅适用ML卡

参 数:icdev: rf_init()返回的设备描述符

_Value:整数,为初始值(长度为4字节) 返 回:成功则返回 0

例:/* 将电子钱包赋初值1000 */ st=rf_ini_val(icdev, 1000);

(30)rf_dec_ ml(icdev, _Value); 功 能:减值操作,仅适用于ML卡

参 数:icdev: rf_init()返回的设备描述符

_Value:整数,为要减少的值(长度为4字节) 返 回:成功则返回 0

例:/* 将电子钱包的数值减少10 */ st=rf_dec_val(icdev,10);

(31)rf_rd_ ml(icdev);

功 能:读值操作,仅适用于ML卡

参 数:icdev: rf_init()返回的设备描述符

返 回:成功返回要读出的值(整数);错误参考错误代码 例:/* 读出钱包的数值并存在st中*/ st=rf_rd_ml(icdev);

3.8 库函数使用范例

参见随盘MWRD\\EXAMPLES目录下各种开发平台的应用范例 3.9 函数错误类型代码

十六进制 错误类型 -0x80 读错误

-0x81 写错误 -0x82 通讯错误 -0x84 超时错误 -0x87 格式错误

3.10 版本兼容性

读写器的上层函数库Version 2.1与Version 2.0完全兼容,初始化函数rf_init()例外。 新版本改动如下: (1) C函数库中,初始化函数rf_init(COM,Baud)没有更改,波特率参数可省略;Windows

动态库和FoxPro函数库中,增加了Baud参数,此参数不能省略,其值为9600~115200。

(2) ML卡增加了三个专用函数,分别是初始化值、减值和读值。 (3) 提供了五个高级函数,功能进一步完善。 (4) 提供了DES加密和解密算法。 附录1 二种Mifare射频卡的特性

1.Mifare 1射频卡 Mifare 1射频卡容量为8192bit,整卡结构分为16个扇区,每个扇区有4个块,每块有16字节;每个扇区的块3 (即第4块) 由该扇区的密码A(6 字节)、存取控制(4字节)、和密码B(6 字节)组成,是一个特殊的块,其余三个块是一般的数据块。扇区0的块0是厂商代码,已固化,不可改写。

数据块有两种应用,一种是作一般的数据保存,可直接读写。另一种是作数值块,可进行初始化值、加值、减值、读值的运算。系统配有相应的函数完成其功能。

2. Mifare light射频卡

Mifate light射频卡容量为384bit,整卡由12页组成,每页有4个字节。0~1页存有卡序列号和代码信息;2~3页和10~11页作为一般数据块使用;4~5页作为电子钱包使用,其计数值为无符号的16位整型。6~9页由2套密码和存取控制位组成,利用A密码和B密码能够设置不同的访问权限。

Mifare light射频卡容量小、应用简单。数据块有两种应用,一种是作一般的数据保存。另一种是作数值块,可以进行初始化值、减值、读值的运算(无加值)。

ML卡不支持Mifare 1 的TRANSFER、RESTORE、INCREMENT和五个高级函数;其初始化值、减值和读值三个函数与M1卡也不兼容。利用DEMO演示系统可以对该卡读写操作,只是其页数要与M1卡的绝对块数相对应。

本文来源:https://www.bwwdw.com/article/tdt6.html

Top