MT明泰_读卡器_API接口函数库使用说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
API接口函数库使用说明
部文件:V1.0.20
发布时间:2015-04-29
版本更新记录
目录
API接口函数库使用说明1
1. 文档概述6
1.1. 文档围6
1.2. 面向对象6
1.3. 参考资料6
2. 函数库介绍7
2.1. 功能7
2.2. 性能7
3. 运行环境7
3.1. 硬设备7
3.2. 软件的运行平台7
3.3. 函数调用方法8
3.3.1. Delphi调用32位动态库的方法 (8)
3.3.2. VB调用32位动态库的方法 (9)
3.3.3. VC调用32位动态库的方法 (11)
4. API介绍12
4.1. 函数调用流程12
4.1.1. 非接触式存储卡API调用流程 (12)
4.1.2. 非接触式CPU卡片API调用流程 (12)
4.1.3. 接触式CPU卡片API调用流程12
4.1.4. 接触式存储卡片API调用流程12
4.1.5. API调用流程 (12)
4.1.6. 函数操作结果信息表16
4.2. 设备操作函数组19
4.2.1 打开读写器device_open19
4.2.2 关闭读写器device_close19
4.2.3 判断设备通讯类型device_gettype19
4.2.4 设置通讯波特率device_setbaud20
4.2.5 获取读写器版本信息device_version20
4.2.6 读写器蜂鸣device_beep21
4.2.7 LED灯控制 device_ledctrl21
4.2.8 获取读写器生产序列号 device_readsnr22
4.2.9 获取设备状态 get_device_status22
4.2.10 读取读卡器的EEPROM23
4.2.11更新读卡器的EEPROM24
4.2.12 复位串口配置信息 ReSetupComm24
4.2.13 读卡器软复位 device_reset24
4.2.14 获取设备状态扩展 get_device_statusEx25
4.2.15 获取非接触式CPU卡卡片状态 dev_cardstate26
4.2.16 获取接触式CPU卡到位状态 ICC_GetStatus26
4.2.17读EMID号Dev_GetEMID26
4.3 接触式卡片操作函数27
4.3.1 判断接触式卡片状态sam_slt_getstate27
4.3.2 接触式卡片上电复位sam_slt_reset28
4.3.3 接触式卡设置复位波特率sam_slt_reset_baud28
4.3.4 接触式卡片下电sam_slt_powerdown29
4.4. 非接触 CPU 卡函数30
4.4.1 激活非接触式卡open_card30
4.4.2 设置非接触式卡片为halt状态 rf_halt31
4.4.3 应用层传输命令card_APDU31
4.5 非接触式存储卡操作函数32
4.5.1 激活非接触式存储卡rf_card32
4.5.2 非接触式存储卡认证扇区 rf_authentication33
4.5.3 非接触式存储卡读数据rf_read33
4.5.4 非接触式存储卡写数据rf_write34
4.5.5 非接触式存储卡读值块rf_readval34
4.5.6 非接触式存储卡写值块rf_initval35
4.5.7 非接触式存储卡加值rf_increment35
4.5.8 非接触式存储卡减值rf_decrement36
4.5.9 非接触式存储卡值传送 rf_transfer36
4.6 二代操作函数37
4.6.1 卡操作指令-读卡IDCard_Read37
4.6.2 卡操作指令-读卡IDCard_ReadCard39
4.6.3卡操作指令根据索引获取数据IDCard_GetCardInfo40
4.6.4 获取二代证模块ID IDCard_GetModeID40
4.6.5 读卡模块扩展一IDCard_ReadCard_Extra41
4.6.6 设置二代证照片存储路径 IDCard_SetPhotoPath42
4.6.7 设置二代证照片名字 IDCard_SetPhotoName42
4.6.8 读二代证信息扩展二 IDCard_ReadCard_Ex42
4.6.9 删除所有二代证照片文件 delete_all_photofile (44)
4.6.10 获取卡ID号 IDCard_Read_IDNUM (44)
4.6.11 获取卡IDCard_Name (45)
4.6.12 获取卡性别 IDCard_Sex (45)
4.6.13 获取卡名族 IDCard_Nation (46)
4.6.14 获取卡出生日期 IDCard_Birthday (46)
4.6.15 获取卡出生地址 IDCard_Address (47)
4.6.16 获取卡号 IDCard_IDNumber (47)
4.6.17 获取卡签发机构 IDCard_IssueDepartment (48)
4.6.18 获取卡有效期起始日期 IDCard_ValidFromDate (48)
4.6.19 获取卡有效期截止日期 IDCard_ValidExpiryDate (49)
4.6.20 获取卡预留信息 IDCard_Reserve50
4.6.21 获取非接触式卡片类型 CLCard_Open (50)
4.6.22 获得读卡过程中生成文件的Base64编码 GetFileBase64Buffer51
4.6.23 读取二代证信息扩展三 IDCard_ReadCard_ExTwo52
4.6.24 wlt转bmp文件 iWlttoBmp52
4.6.25 读二代证追加信息53
4.7 工具函数53
4.7.1 将 16 进制数转换为 ASCII 字符hex_asc53
4.7.2 将 ASCII 字符转换为 16 进制数asc_hex (54)
4.7.3 DES 算法加密函数rf_encrypt54
4.7.4 DES 算法解密函数 rf_decrypt55
4.7.5 将 16 进制数转换为 Base64 字符hex_base6456
4.7.6 将 Base64字符转换为16进制数base64_hex57
4.7.7 DES 算法加密函数des_encrypt57
4.7.8 DES 算法解密函数des_decrypt58
4.7.9 TDES 算法加密函数des3_encrypt59
4.7.10 TDES 算法解密函数des3_decrypt60
4.7.11 将 ASCII 字符转换为 10 进制数asc_dec60
4.8 接触式存储卡操作函数61
4.8.1 设置接触式存储卡种类contact_settype62
4.8.2 识别接触式存储卡种类contact_identifytype63
4.8.3 接触式存储卡密码校验contact_passwordcheck63
4.8.4 接触式存储卡读数据contact_read64
4.8.5 接触式存储卡写数据contact_write65
4.8.6 接触式存储卡密码初始化(更改密码)contact_passwordinit65
4.9 磁条卡操作函数66
4.9.1 获取磁条卡数据magnetic_read66
4.9.2 设置磁条卡数据输出方式set_magnetic_mode67
4.10 外挂密码键盘68
4.10.1 密码键盘下载主密钥68
4.10.2 密码键盘下载工作密钥(密钥为密文)68
4.10.3 密码键盘激活主密钥和工作密钥69
4.10.4 密码键盘设置键盘输入密码的长度69
4.10.5 密码键盘设置键盘超时时间70
4.10.6 获取键盘输入的密码(明文传输)70
4.10.7 获取键盘输入的密码(密文传输)71
4.11 AT88SC1604卡71
4.11.1 读数据 srd_160472
4.11.2 写数据 swr_160472
4.11.3 校验应用区密码 csc_160473
4.11.4 校验擦除密码 cesc_160474
4.11.5 擦除数据 ser_160474
4.11.6 写密码 wsc_160475
4.11.7 伪个人化 fakefus_160475
4.11.8 个人化 psnl_160476
4.12 金融IC卡76
4.12.1读取金融IC卡卡号和76
1.文档概述
1.1.文档围
该手册主要介绍二代证读写器、相关接口函数库的使用以及相关API的介绍。
在附录中介绍了读写器支持的卡型的卡片特性。
1.2.面向对象
购买了二代证读写器,欲使用二代证读写器进行二次开发的开发人员。
1.3.参考资料
(农行)金融IC卡读写器通讯协议说明
2.函数库介绍
2.1.功能
API函数库提供了使用二代证读卡器对卡片操作时所用到的函数接口,包括以下几个方面:
A. 设备操作函数组
B. 接触式卡片操作函数
C. 非接触式卡片操作函数
D. 操作函数
E. 磁条卡操作函数
F. 外挂键盘操作函数
2.2.性能
1.读写器通过串口或HID无驱设备与PC机进行通讯,不需要安装驱动程序。
2.API接口函数库封装了通过PC机来操作二代证读卡器时用到的各个函数,用户在执行操作时,
只需调用相应的函数接口即可,不需要编写对读卡器的操作函数。
3.运行环境
3.1.硬设备
为运行本产品,您需要的硬设备的最小配置如下:
A.处理器:80X86
B.存:64KB
C.硬盘:2.0GB
B接口一个
E.RS232串口一个
3.2.软件的运行平台
为运行本产品,您需要的支持软件如下:
A. 操作系统:Win 7/Windows Vista/Win2003/WinXP/Win2000;
B. 程序编写工具:VC/VB/PB/Delphi等;
3.3.函数调用方法
3.3.1.Delphi调用32位动态库的方法
语法:
[Public Private | protected] Function FunctionName([Var] [Arg1:DataType1;] [Arg2:DataType2;...]) [:ReturnDataType]; far;stdcall;external‘libname’ [Name AliasName];
调用语句的语法包含下面部分:
关键字Public(可选),表示函数可以被程序代码中的任意部分访问。
●关键字Private(可选),表示函数在声明类的单元(源代码)外不能访问。
●关键字Protected(可选),表示保护函数,保护元素只能被当前类和它的子类访问。
●关键字Function(必选),表示调用函数,函数有返回值。
●FunctionName(必选),调用外部函数的名称,区分大小写。
●关键字Var(可选),表示通过引用传递参数,函数参数可以用值传递,也可以通过引用传递。
通过引用传递参数,它的值没被复制到存放函数例程参数的堆栈中,程序执行速度快。
通过引用传值,将允许过程和函数改变参数的值。
●ArgN:DataTypeN(可选),参数名以及参数类型,传递的参数类型可以是:Shorint,Smallint,
Longint,Integer(16/32),Single,Double,Extended,Currency,Date,Pchar,Object,Variant 等。
●ReturnType(可选),函数返回值的类型。
●Stdcall(必选),表示传递约定,这样调用模块(应用程序),与被调用模块(DLL)就使用相同
的参数约定。
●关键字external(必选),声明访问外部函数。
●Libname(必选),访问的DLL名称,16位Delphi中外部声明不带扩展名的库名。
●Name‘AliasName’(可选),Name指令可以为外部函数起别名,避免与系统例程和函数名称冲
突。
外部程序调用的DLL函数,必须遵照下列规则:
(1)必须列在DLL的exports子句中。
(2)在Delphi3中,调用函数还需被声明为stdcall,来使用标准的WIN32参数传递技术。
代替优化的register参数传递技术。
(3)在WIN32中,DLL可以使用全局数据,该数据将不会通过调用应用程序来分享,每当应用程序装载DLL时,它在自己的地址空间中存储着DLL的全部数据。
注:详细请参考ICCard\EXAMPLES目录下的使用例。
3.3.2.VB调用32位动态库的方法
语法:
[Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])]
[As type]
Declare 语句的语法包含下面部分:
●Public (可选)用于声明在所有模块中的所有过程都可以使用的函数。
●Private(可选),用于声明只能在包含该声明的模块中使用的函数。
●Name(必选),任何合法的函数名。
动态库的入口处(entry points)区分大小写。
●Libname(必选),包含所声明的函数动态库名或代码资源名。
●Alias(可选),表示将被调用的函数在动态库 (DLL) 中还有另外的名称。
当外部函数名与某个
函数重名时,就可以使用这个参数。
当动态库的函数与同一围的公用变量、常数或任何其它过程的名称相同时,也可以使用 Alias。
如果该动态库函数中的某个字符不符合动态库的命名约定时,也可以使用 Alias。
●Aliasname(可选)动态库。
如果首字符不是数字符号 (#),则 aliasname 是动态库中该函数入
口处的名称。
如果首字符是 (#),则随后的字符必须指定该函数入口处的顺序号。
●Arglist(可选),代表调用该函数时需要传递参数的变量表。
●Type(可选),Function返回值的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、
Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)或 Variant,用户定义类型,或对象类型。
arglist 参数的语法如下:
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type]
部分描述:
●Optional(可选),表示参数不是必需的。
如果使用该选项,则 arglist 中的后续参数都必需是
可选的,而且必须都使用 Optional 关键字声明。
如果使用了 ParamArray,则任何参数都不能使用 Optional。
●ByVal(可选),表示该参数按值传递。
●ByRef(可选),表示该参数按地址传递。
●ParamArray(可选),只用于 arglist 的最后一个参数,表示最后参数是一个 Variant 元素的
Optional 数组。
使用 ParamArray 关键字可以提供任意数目的参数。
ParamArray 关键字不能与ByVal、ByRef或 Optional 一起使用。
●Varname(必选),代表传给该函数参数的变量名;遵循标准的变量命名约定。
●( ) 对数组变量是必需的。
指明 varname 是一个数组。
type (可选),传递给函数参数的数据类型;可以是除Decimal以外的任何类型。
说明:
Function的数据类型决定其返回值的数据类型。
可以在 arglist 之后使用 As 子句来指定函数返回值的数据类型。
在 arglist 中,可以使用 As 子句来指定任何传给该函数参数的数据类型。
不单可以指定为任何标准数据类型,还可以在 arglist 中指定 As Any 来禁止类型检查,从而允许将任意数据类型传递给该函数。
空圆括号表示该 Function 没有参数,且 Visual Basic 应确保不会传递任何参数。
注意:
(1)当所调用的外部函数需要一个值为 0 的字符串时,就要使用 vbNullString 常数。
该常数与零长度字符串 ("")是不相同的。
(2)VB5调用32位动态库,对于ASCII码值大于128的读写操作,请参考Examples 中24系列的BYREF传递方式;16位动态库可以直接使用CHR函数转换。
(3)详细请参考ICCard\EXAMPLES目录下的使用例。
3.3.3.VC调用32位动态库的方法
(1)在.CPP中包含“mtx_32.h”头文件;
(2)在工程文件中加入mtx_32.lib文件。
(3)在C:\WINDOWS\system32或工程文件中加入GetInfo.dll文件。
4.API介绍
4.1.函数调用流程
4.1.1.非接触式存储卡API调用流程
建立连接成功后软件中基于 Mifare one 卡测试一般的操作过程是:
读数
建立连接-> 寻卡-> 验证中止卡片
值操作
4.1.2.非接触式CPU卡片API调用流程
软件中基于非接触 CPU 卡片,一般的操作过程是:
建立连接成功->打开卡片->发送 APDU命令->设置卡片状态为halt->中止卡片操作
4.1.3.接触式CPU卡片API调用流程
软件中基于接触式CPU卡片,一般的操作过程是:
建立连接成功->上电复位->获取卡片状态/发送APDU命令->卡片下电。
4.1.4.接触式存储卡片API调用流程
软件中基于接触式存储卡片,一般的操作过程是:
建立连接成功->设置存储卡种类->识别存储卡种类->密码校验->读数据/写数据/更改密码
4.1.
5.API调用流程
软件中基于,一般的操作过程是:
目前我们的二代证接口有五套操作接口,下面分别对五套接口的操作流程都做一下详细描述,具体如下:
1.对于只需要读取二代证的情况,操作流程如下:
方案1、直接读取信息的UNICODE码,通过返回的UNICODE码传入相关函数获取信息。
建立连接成功->读卡,获取信息的UNICODE码(IDCard_Read)->获取(IDCard_Name)/获取性别(IDCard_Sex).../(保存照片IDCard_PhotoSave_Ex)->关闭设备
流程图如下:
方案2、不需要二代证照片,直接读取信息
建立连接成功->读卡(IDCard_ReadCard)->解析数据(IDCard_GetCardInfo)->关闭设备
流程图如下:
方案3、需要设置二代证照片保存全路径(包括照片名字)及获取信息
建立连接成功->读二代证扩展一(IDCard_ReadCard_Extra)->解析数据(IDCard_GetCardInfo)->关闭设备
流程图如下所示:
方案4、需要设置二代证照片路径、照片保存名字、需要照片信息的Base64码.
建立连接成功->设置照片存放路径(IDCard_SetPhotoPath)->设置照片名字(IDCard_SetPhotoName)->读二代证扩展二(IDCard_ReadCard_Ex)->关闭设备
具体流程图如下所示:
注意:上述四个方案,实际是四个读卡函数,不建议一次二代证读卡,调用四个读卡函数中的多个,如果只是需要部分信息(比如),建议采用方案一;
如果只是需要读取信息的明文,不需要保存照片,可以采用方案二、方案三(照片文件传空)、方案四(照片保存参数填0);
如果需要保存照片,并且指定照片保存的全路径(包括照片名字,比如:C:\zp.bmp),那么建议采用方案三;
如果需要修改保存照片的名字或者获取照片信息的Base64码,那么建议采用方案四。
2.对于需要读取多种非接卡的情况,操作流程如下:
建立连接成功->判断卡类型(CLCard_Open)->解析数据(IDCard_GetCardInfo)->关闭设备
4.1.6.函数操作结果信息表
说明:实际返回的错误信息为表中数据的负数形式,例如:命令超时,返回-0x0011。
00H 00H 命令执行正确回应
00H 01H 可选的功能接口或参数不支持(包括可选的通讯波
特率参数、显示屏功能等)
00H 02H 调用sdtapi.dll错误
00H 03H 相片解码错误
00H 04H wlt文件后缀错误
00H 05H wlt文件打开错误
00H 06H wlt文件格式错误
00H 07H 软件未授权
00H 08H 设备连接错误
00H 09H 相片解码其他错误
00H 11H 命令超时
00H 12H 无效的通讯句柄
00H 13H 打开通讯端口错误
00H 14H 通讯端口已被占用
00H 15H 获取通讯端口状态错误
00H 16H 设置通讯端口状态错误
00H 17H 从读写器读取数据出错
00H 18H 向读写器写入数据出错
00H 21H STX错误
00H 22H ETX错误
00H 23H 校验位错误
00H 24H 数据长度大于最大长度
00H 25H 数据值错误
00H 31H 获取信息,下标有误
00H 32H 读卡错误
10H 01H 不支持接触用户卡
10H 02H 接触用户卡未插到位
10H 03H 接触用户卡已上电
10H 04H 接触用户卡未上电
10H 05H 接触用户卡上电失败
10H 06H 操作接触用户卡数据无回应
10H 07H 操作接触用户卡数据出现错误
20H 01H 不支持PSAM卡
20H 03H PSAM卡已上电
20H 04H PSAM卡未上电
20H 05H PSAM卡上电失败
20H 06H 操作PSAM卡数据无回应
20H 07H 操作PSAM卡数据出现错误
30H 01H 不支持非接触用户卡
30H 04H 非接触用户卡未激活
30H 05H 非接触用户卡激活失败
30H 06H 操作非接触用户卡无回应(等待超时)
30H 07H 操作非接触用户卡数据出现错误
30H 08H 非接触用户卡halt失败
30H 09H 有多卡在感应区
60H 01H 不支持逻辑操作
60H 20H 卡片类型不对(卡状态6A82)60H 21H 余额不足(卡状态9401)
60H 22H 卡片功能不支持(卡状态6A81)60H 23H 扣款失败(卡状态9302)
60H 30H 卡片未启用
60H 31H 卡片不在有效期
60H 32H 交易明细无此记录
60H 33H 交易明细记录未处理完成
60H 40H 需要做防拔处理
60H 41H 防拔处理中出错, 非原来卡60H 42H 交易中断, 没有资金损失
4.2. 设备操作函数组
4.2.1 打开读写器device_open
函数功能:与读写器建立连接
函数声明: HANDLE __stdcall device_open(char* port name __int16 port,unsigned long baud); 入口参数: port name 连接方式,分为“USB”和“COM”。
port 串口号,0对应COM1,1对应COM2……,取值围0~31。
baud (入)通讯波特率,9600bps(缺省设置)19200bps,38400bps,57600bps,115200bps 通讯方式为HID时,port和baud可为任意值。
返回值: <0 错误
>0 通讯设备标识符
举例: icdev=device_open (“USB”,0,9600);
4.2.2 关闭读写器device_close
函数功能:与读写器断开连接
函数声明: __int16 device_close (HANDLE icdev)
入口参数: icdev 表示通讯设备标识符
返回值: <>0 错误
=0 正确
举例: st=device_close (icdev);
4.2.3 判断设备通讯类型device_gettype
函数功能:获取设备与PC机的通讯方式
函数声明: __int16 device_gettype(unsigned char* devicetype);
出口参数: devicetype: 1字节设备与PC机的通讯方式,1--HID,0--串口
返回值: ≡0
举例:
unsigned char cDeviceType=0;
st=device_gettype (&cDeviceType);
4.2.4 设置通讯波特率device_setbaud
函数功能:设置串口通讯波特率
函数声明:__int16 device_setbaud(HANDLE icdev,unsigned char module,unsigned long baud); 入口参数:icdev 通讯设备标识符
module 功能模块1字节 00H:接触式, 01H:非接触式
baud 串口波特率 9600bps(缺省设置)
19200bps
38400bps
57600bps
115200bps
返回值: < 0 错误
= 0 正确
举例: __int16 st=device_setbaud(icdev,0,9600);//设置接触式模块的通讯波特率为9600bps.
4.2.5 获取读写器版本信息device_version
函数功能:查看读写器版本信息
函数声明: __int16 device_version(HANDLE icdev,unsigned char module,unsigned char* verlen,unsigned char* verdata);
入口参数: icdev 通讯设备标识符
module 功能模块1字节 00H:接触式, 01H:非接触式
出口参数: verlen 版本信息字节长度
verdata 读写器版本信息
返回值: < 0 错误
= 0 正确
举例: __int16 st=0;
unsigned char verlen=0;
unsigned char verdata[100];
memset(verdata,0,100);
st=device_version(icdev,0,&verlen,verdata); //获取读写器接触式模块的版本信息
4.2.6 读写器蜂鸣device_beep
函数功能:控制读写器蜂鸣器的单声鸣叫延迟时间和鸣叫次数
函数声明: __int16 device_beep(HANDLE icdev, unsigned short delaytime,unsigned char times);
入口参数: icdev 通讯设备标识符
delaytime 蜂鸣器鸣叫时间,单位为100毫秒。
其中,第一字节是一次鸣叫持续时间,第二字节是一次鸣叫停止时间(多次蜂鸣时的蜂鸣间隔时间)。
times 蜂鸣器鸣叫次数
返回值: <>0 错误
=0 正确
举例: int st=0;
unsigned short DelayTime=1285;
st=device_beep( icdev,DelayTime,2);
4.2.7 LED灯控制 device_ledctrl
函数功能:控制读写器对应LED灯的开关状态
函数声明:__int16 device_ledctrl(HANDLE icdev,unsigned char ledctrl);
入口参数:icdev 通讯设备标识符
ledctrl 1字节位7对应绿灯,0关,1开
其他保留
返回值: <>0 错误
=0 正确
举例: __int16 st=device_ledctrl(icdev,128);
4.2.8 获取读写器生产序列号 device_readsnr
函数功能:获取读写器生产序列号
函数声明:__int16 __stdcall device_readsnr(HANDLE icdev,unsigned char nSnrLen,char* sSnrData);
入口参数:icdev 通讯设备标识符
nSnrLen 1字节序列号长度,1--20.
出口参数:sSnrData nSnrLen字节序列号数据,ASCII码字符形式
返回值: <>0 错误
=0 正确
举例: int st=0;
unsigned char sSnrData[30];
memset(sSnrData,0,30);
st=device_readsnr(icdev,20,sSnrData);
4.2.9 获取设备状态 get_device_status
函数功能:获取设备状态,判断设备是否正常
函数功能:__int16 __stdcall get_device_status(HANDLE icdev,unsigned char *ndev_status) 入口参数:icdev 通讯设备标识符
出口参数:ndev_status设备状态字节一字节取值 0~3
0 正常
1 接触卡通道异常
2 非接卡通道异常
3 接触卡和非接卡通道异常
4 安全模块通道异常
5 接触卡和安全模块通道异常
6 非接卡和安全模块通道异常
7 接触卡、非接卡和安全模块通道异常
返回值: <>0 错误
=0 正确
举例: unsigned char ndev_status = 0;
int st=get_device_status(icdev,&ndev_status);
4.2.10 读取读卡器的EEPROM
函数功能:读取读卡器的EEPROM数据
函数功能:__int16 __stdcall dev_readeeprom(HANDLE icdev,unsigned short nAddr,unsigned short nDLen,unsigned char* sReadData);
入口参数:icdev 通讯设备标识符
nAddr 地址( 0~199)
nDLen 读取数据长度(1~200,单位:字节)
sReadData 返回的数据
返回值: <>0 错误
=0 正确
举例: unsigned char sData[20];
int st=dev_readeeprom(icdev,0,20,sData);
4.2.11更新读卡器的EEPROM
函数功能:更新读卡器的EEPROM数据
函数功能:__int16 __stdcall dev_writeeeprom(HANDLE icdev,unsigned short nAddr,unsigned short nDLen,unsigned char* sWriteData);
入口参数:icdev 通讯设备标识符
nAddr 地址( 0~199)
nDLen 写入的数据长度(1~200,单位:字节)
sWriteData 写入的数据
返回值: <>0 错误
=0 正确
举例: unsigned char sData[5];
Memset(sData, “\x11\x22\x33\x44\x55”);
int st=dev_writeeeprom(icdev,0,5,sData);
4.2.12 复位串口配置信息 ReSetupComm
函数功能:复位串口配置信息
函数声明:__int16 __stdcall ReSetupComm(HANDLE idComDev);
入口参数:idComDev通讯设备标识符
出口参数:无
返回值: <>0 错误
=0 正确
举例: int st=0;
st=ReSetupComm(icdev);
4.2.13 读卡器软复位 device_reset
函数功能:读卡器软复位
函数声明:__int16 __stdcall device_reset(HANDLE icdev,unsigned char module);
入口参数:icdev通讯设备标识符
Module复位模式参数,0表示接触式模块、1表示非接触式模块
出口参数:无
返回值: <>0 错误
=0 正确
举例: int st=0;
st=device_reset(icdev, 0);
4.2.14 获取设备状态扩展 get_device_statusEx
函数功能:获取设备状态,判断设备是否正常
函数功能:__int16 __stdcall get_device_statusEx(HANDLE icdev,unsigned char *ndev_status) 入口参数:icdev 通讯设备标识符
出口参数:ndev_status设备状态字节一字节取值 0~3
0 接触无卡、非接无卡、安全模块不存在
1 接触有卡、非接无卡、安全模块不存在
2 接触无卡、非接有卡、安全模块不存在
3 接触有卡、非接有卡、安全模块不存在
4 接触无卡、非接无卡、安全模块存在
5 接触有卡、非接无卡、安全模块存在
6 接触无卡、非接有卡、安全模块存在
7 接触有卡、非接有卡、安全模块存在
返回值: <>0 错误
=0 正确
举例: unsigned char ndev_status = 0;
int st=get_device_statusEx(icdev,&ndev_status);
4.2.15 获取非接触式CPU卡卡片状态 dev_cardstate
函数功能:获取非接触式CPU卡片状态
函数功能:__int16 __stdcall dev_cardstate(HANDLE icdev, unsigned char* ndev_cardstate) 入口参数:icdev 通讯设备标识符
出口参数:ndev_cardstate非接触式CPU卡状态
ndev_cardstate[0] = 0 无卡
ndev_cardstate[0] = 1 一卡
ndev_cardstate[0] = 2 多卡
返回值: <>0 错误
=0 正确
举例: unsigned char ndev_status = 0;
int st=dev_cardstate(icdev,&ndev_status);
4.2.16 获取接触式CPU卡到位状态 ICC_GetStatus
函数功能:获取接触式CPU卡到位状态
函数功能:__int16 __stdcall ICC_GetStatus(HANDLE icdev, unsigned char* uCardStatus)
入口参数:icdev 通讯设备标识符
出口参数:uCardStatus接触式CPU卡到位状态,0:无卡,1:有卡
返回值: <>0 错误
=0 正确
举例: unsigned char ndev_status = 0;
int st=ICC_GetStatus(icdev,&ndev_status);
4.2.17读EMID号Dev_GetEMID
函数功能:读EMID卡号
函数功能:__int16 __stdcall Dev_GetEMID(HANDLE icdev,unsigned char* nIDLen,unsigned char* sIDData);
入口参数:icdev 通讯设备标识符
出口参数:nIDLen EMID号字节长度
sIDData EMID号信息
返回值: <>0 错误
=0 正确
举例: unsigned char nIDLen=0;
unsigned char sIDData[100];
memset(sIDData,0,100);
int st=Dev_GetEMID(icdev,&nIDLen,sIDData);
4.3 接触式卡片操作函数
4.3.1 判断接触式卡片状态sam_slt_getstate
函数功能:判断指定卡座号中的卡片状态,包括接触式用户卡和PSAM卡。
函数声明: __int16 sam_slt_getstate(HANDLE icdev,unsigned char cardno,unsigned short*
cardstate);
入口参数: icdev: 通讯设备标识符
cardno: 1字节卡片类型接触式用户卡:00H-0FH, PSAM卡:10H-1FH
出口参数: cardstate: 返回的卡片状态
10H,01H不支持接触式用户卡
10H,02H接触式用户卡未插到位
10H,03H接触式用户卡已上电
10H,04H接触式用户卡未上电
20H,01H不支持PSAM卡
20H,03HPSAM卡已上电
20H,04HPSAM卡未上电
返回值: <>0 错误
=0 正确
举例: __int16 ret=0;
__int16 rlen=0;
unsigned char cardno=0;
unsigned short cardstate=0;
ret=sam_slt_getstate(icdev,cardno,&cardstate);
4.3.2 接触式卡片上电复位sam_slt_reset
函数功能:读写器在指定时间对指定卡座进行寻卡,寻到卡后便对卡片上电复位。
函数声明:__int16 sam_slt_reset(HANDLE icdev,unsigned short delaytime, unsigned char cardno,unsigned char* rlen,unsigned char* resetdata);
入口参数:icdev:通讯设备标识符
delaytime 2字节等待插卡时间(单位:毫秒),0:无需等待,无卡直接返回
cardno: 1字节接触式用户卡:00H-0FH, PSAM卡:10H-1FH
出口参数:rlen: 1字节复位信息长度
resetdata: 复位信息数据
返回值: =0,执行成功
<>0,错误
举例: __int16 st;
unsigned char RLen;
unsigned char cCardNO=0;
unsigned char RDatah[40];
memset(RDatah,0,40);
st=sam_slt_reset(icedv,0,cCardNO,&RLen,RDatah);
4.3.3 接触式卡设置复位波特率sam_slt_reset_baud
函数功能:读写器在指定时间对指定卡座进行寻卡,寻到卡后便对卡片上电复位。
函数声明:__int16 __stdcall sam_slt_reset_baud(HANDLE icdev,unsigned char cardno, unsigned
char resetBaud, unsigned char* rlen,unsigned char* resetdata);
入口参数:icdev通讯设备标识符
Cardno1字节接触式用户卡:00H-0FH, PSAM卡:10H-1FH resetBaud0:9600
1:38400
2:115200
出口参数:rlen: 1字节复位信息长度
resetdata: 复位信息数据
返回值: =0,执行成功
<>0,错误
举例: __int16 st;
unsigned char RLen;
unsigned char cCardNO=0;
unsigned char RDatah[40];
memset(RDatah,0,40);
st=sam_slt_reset_baud(icedv,cCardNO,0,&RLen,RDatah);
4.3.4 接触式卡片下电sam_slt_powerdown
函数功能:对接触式卡片进行下电操作。
函数声明: __int16 sam_slt_powerdown(HANDLE icdev,unsigned char cardno); 入口参数: icdev: 通讯设备标识符
cardno: 1字节接触式用户卡:00H-0FH, PSAM卡:10H-1FH
返回值: <>0 错误
=0 正确
举例: __int16 st;
unsigned char cardno=0;
st=sam_slt_powerdown(icdev,cardno);
4.4. 非接触 CPU 卡函数
4.4.1 激活非接触式卡open_card
函数功能:读写器在传递的时间查寻卡是否进入感应区,并激活进入感应区的卡片。
函数声明: __int16 open_card(HANDLE icdev,unsigned short delaytime,unsigned char* cardtype,unsigned char* snrlen,unsigned char* snr,unsigned char* rlen,unsigned char* recdata);
入口参数: icdev:通讯设备标识符
delaytime 2字节等待卡进入感应区时间(单位:毫秒),高位字节在前
0:无需等待,无卡直接返回
0xffff:一直等待
出口参数:
cardtype 1字节卡类型0AH A类卡; 0BH B类卡
snrlen 1字节卡UID长度
snr 4字节卡UID
rlen 1字节 ATR长度
recdata: ATR应答数据
返回值: <>0 错误
=0 正确
举例: __int16 st;
unsigned char CardType=0;
unsigned char CardSnr[10]={0,0,0,0,0,0,0,0,0,0};
memset(CardSnr,0,40);
unsigned char RLen=0;
unsigned char RecData[40];
memset(RecData,0,40);
st=open_card(icdev,0,&CardType,CardSnr,&RLen,RecData);
注:由于调用该函数时,不一定有卡在感应区,很有可能需要较长的时间才能等到卡进感应区,故设定较长的时间给读写器,完全由读写器在这段时间等待对卡激活,如果超时了便返回“激活失败”。
此命令的delaytime参数就是为了传递上述时间参数给读写器。
如果delaytime参数为0,在无卡进感应区时读写器不用等待直接返回“激活失败”;如果delaytime参数为0xffff时,一直寻卡,直到卡进入感应区;如果delaytime参数为其它值时,读写器可在delaytime
时间一直寻卡,直到超时了读写器才返回“激活失败”,此时主机端也是采用delaytime作为超时退出时间。
如果有卡在感应区但激活失败,那么读写器不用继续寻卡就直接返回“激活失败”。
4.4.2 设置非接触式卡片为halt状态 rf_halt
函数功能:设置非接触式卡片为halt状态。
函数声明: __int16 rf_halt(HANDLE icdev,unsigned short delaytime);
入口参数: icdev:通讯设备标识符 slen:datasend 的长度
delaytime:等待卡离开感应区时间(单位:毫秒),高位字节在前
0:无需等待
0xffff:一直等待
返回值: <>0 错误
=0 正确
举例: __int16 st=rf_halt(icdev,0);
注:完成对卡的Halt操作或者Deselect操作后,要求用户将卡离开射频操作区域,否则将一直循环判断。
如果delaytime参数为0时,则不用等待,将直接返回halt操作结果;若delayTime为0xffff时,将无限等待,直至卡离开感应区;若为其它值时,将在规定时间判断卡是否还在感应区直至定时时间到或者卡离开感应区。
4.4.3 应用层传输命令card_APDU
函数功能:传输通讯链路建成后,终端和读写器开始应用层的APDU命令的传送。
函数声明:__int16 card_APDU(HANDLE icdev,unsigned char cardno,int slen,unsigned char *datasend,int* rlen,unsigned char* datareceive);
入口参数: icdev: 通讯设备标识符 slen:datasend 的长度
CardNo1字节非接触式卡:FFH,接触式卡:00H-0FH,PSAM卡:10H-1FH
Slen 发送数据的字节长度
datasend: 要发送的数据
出口参数: rlen: 返回的数据长度
datareceive: 返回的指令应答信息
返回值: <>0 错误
=0 正确
举例: __int16 st;
unsigned short rlen;
unsigned char datarecv[300];
memset(datarecv,0,300);
unsigned char databuff[]={0x00,0x84,0x00,0x00,0x08,0}; //取随机数
st=card_APDU(icdev,0xFF,5,databuff,&rlen,datarecv);//非接触式卡取随机数
4.5 非接触式存储卡操作函数
4.5.1 激活非接触式存储卡rf_card
函数功能:读写器在传递的时间查寻卡是否进入感应区,并激活进入感应区的非接触式存储卡。
函数声明:__int16 rf_card(HANDLE icdev,unsigned short delaytime,unsigned char* cardtype,unsigned char* cardID);
入口参数: icdev: 通讯设备标识符
delaytime: 2字节等待卡进入感应区时间(单位:毫秒),高位字节在前
0:无需等待,无卡直接返回
0xffff:一直等待
出口参数: cardType 1字节0AH Type A 卡; 0BH TypeB卡
cardID4字节卡片UID
返回值: <>0 错误
=0 正确
举例: __int16 st;
unsigned char nCardType=1;
unsigned char nCardID[10]={0,0,0,0,0,0,0,0,0,0};
st=rf_card(icdev,0,&nCardType,nCardID);
注:由于调用该函数时,不一定有卡在感应区,很有可能需要较长的时间才能等到卡进感应区,故设定较长的时间给读写器,完全由读写器在这段时间等待对卡激活,如果超时了便返回“激活失败”。
此函数的delaytime参数就是为了传递上述时间参数给读写器。
如果delaytime参数为0,在无卡进感应区时读写器不用等待直接返回“激活失败”;如果delaytime参数为0xffff时,一直寻卡,直到卡进入感应区;如果delaytime参数为其它值时,读写器可在delaytime 时间一直寻卡,直到超时了读写器才返回“激活失败”,此时主机端也是采用delaytime作为超时退出时间。
如果有卡在感应区但激活失败,那么读写器不用继续寻卡就直接返回“激活失败”。