您的当前位置:首页正文

Get清风MT明泰读卡器API接口函数库使用说明

2021-06-16 来源:意榕旅游网


MT明泰-读卡器-API接口函数库使用说明

API

接口函数库使用说明

发布时间:2021-04-29

版本更新记录

修订章节 林锐彬 林锐彬 杨亚军 作者 版发布本 时间 4-18 2021-0建立文档 2021-0增加“接触式存储卡操5-24 作指令〞 2021-1增加读序列号及磁条卡1-28 读数据命令 2021-1增加CPU卡波特率1-01 384000 2021-0增加密码键盘 1-15 2021-0增加二代证读取信息扩8-02 展接口 2021-0增加获取设备状态函数 傅冲 8-08 2021-0增加EERPOM操作 9-18 2021-1增加设置磁条卡模式函0-12 数 傅冲 傅冲

2021-0二代证相关操作函数及6-03 调用说明完善 余菊萍 2021-0增加1604卡、删除二代杨亚军 6-10 证照片文件接口 2021-06-17 增加二代证扩展二接口及设置保存二代证照片名字的接口 杨亚军 杨亚军 2021-0增加二代证接口扩展三6-30 及wlt转bmp函数 2021-0增加金融IC卡读姓名与蔡拔群 7-07 卡号函数 2021-0实现AT88SC1604卡伪杨亚军 7-24 个人化 修改二代证解码动态库杨亚军 2021-1动态加载失败的问题及1-06 磁条卡读取的BUG、添加二代证调用流程图 翻开设备端口做了处杨亚军 2021-1理,如果已经翻开就不2-24 再去翻开,增加了获取接触、非接卡片是否存在、

平安模块是否存在的 增加AT24C卡包括AT24C01、AT24C02、 2021-0AT24C04、AT24C08、1-16 AT24C16、AT24C32、AT24C64、AT24C128、AT24C256 2021-0增加LED 4个灯灭、亮、杨亚军 1-23 闪烁控制 2021-01-27 2021-04-20 增加非接触式CPU卡卡杨亚军 状态获取:无卡、一张卡、多张卡 增加接触卡、非接A卡,余菊萍 非接B卡到位状态获取:无卡、有卡 杨亚军

目录

API接口函数库使用说明 .......................................................................................................... 2 1. 文档概述............................................................................................................................... 13

1.1. 文档范围 .................................................... 13 1.2. 面向对象 .................................................... 13 1.3. 参考资料 .................................................... 13

2. 函数库介绍........................................................................................................................... 14

2.1. 功能 ............................................................ 14 2.2. 性能 ............................................................ 14

3. 运行环境............................................................................................................................... 15

3.1. 硬设备 ........................................................ 15 3.2. 软件的运行平台 ........................................ 15 3.3. 函数调用方法 ............................................ 17

3.3.1. Delphi调用32位动态库的方法 .. 17 3.3.2. VB调用32位动态库的方法 ........ 19 3.3.3. VC调用32位动态库的方法 ....... 22

4. API介绍 ................................................................................................................................ 23

4.1. 函数调用流程 ............................................ 23

4.1.1. 非接触式存储卡API调用流程 ... 23 4.1.2. 非接触式CPU卡片API调用流程23 4.1.3. 接触式CPU卡片API调用流程 .... 23 4.1.4. 接触式存储卡片API调用流程 .... 24 4.1.5. 身份证API调用流程 ................... 24 4.1.6. 函数操作结果信息表 .................... 29 4.2. 设备操作函数组 ........................................ 33

4.2.1 翻开读写器device_open ............... 33 4.2.2 关闭读写器device_close ............. 34 4.2.3 判断设备通讯类型device_gettype34

4.3 4.2.4 设置通讯波特率device_setbaud . 35 4.2.5 获取读写器版本信息device_version .......................................... 35 4.2.6 读写器蜂鸣device_beep ............... 36 4.2.7 LED灯控制 device_ledctrl ......... 37 4.2.8 获取读写器生产序列号 device_readsnr .......................................... 38 4.2.9 获取设备状态 get_device_status39 4.2.10 读取读卡器的EEPROM ................... 40 ...................................................................... 41 4.2.12 复位串口配置信息 ReSetupComm 42 4.2.13 读卡器软复位 device_reset ...... 42 4.2.14 获取设备状态扩展 get_device_statusEx ................................ 43 5 获取非接触式CPU卡卡片状态 dev_cardstate ............................................ 44 6 获取接触式CPU卡到位状态 ICC_GetStatus ............................................ 45 7 读EMID号Dev_GetEMID ......................... 46 接触式卡片操作函数 .................................. 47

4.3.1 判断接触式卡片状态sam_slt_getstate ...................................... 47 4.3.2 接触式卡片上电复位sam_slt_reset

...................................................................... 48 4.3.3 接触式卡设置复位波特率sam_slt_reset_baud .................................. 49 4.3.4 接触式卡片下电sam_slt_powerdown ...................................................................... 50 4.4. 非接触 CPU 卡函数 .................................. 51

4.4.1 激活非接触式卡open_card ........... 51 4.4.2 设置非接触式卡片为halt状态 rf_halt ........................................................ 52 4.4.3 应用层传输命令card_APDU ........... 53 4.5 非接触式存储卡操作函数 .......................... 54

4.5.1 激活非接触式存储卡rf_card ....... 54 4.5.2 非接触式存储卡认证扇区 rf_authentication .................................... 57 4.5.3 非接触式存储卡读数据rf_read ... 58 4.5.4 非接触式存储卡写数据rf_write . 58 4.5.5 非接触式存储卡读值块rf_readval59 4.5.6 非接触式存储卡写值块rf_initval60 4.5.7 非接触式存储卡加值rf_increment61 4.5.8 非接触式存储卡减值rf_decrement61 4.5.9 非接触式存储卡值传送 rf_transfer ................................................ 62 4.6 二代身份证操作函数 .................................. 63

4.6.1 卡操作指令-身份证读卡IDCard_Read ................................................ 63 4.6.2 卡操作指令-身份证读卡IDCard_ReadCard ........................................ 65 4.6.3卡操作指令 根据索引获取身份证数据IDCard_GetCardInfo ............................. 66 4.6.4 获取二代证模块

ID

IDCard_GetModeID ...................................... 67 4.6.5 身份证读卡模块扩展一IDCard_ReadCard_Extra ............................ 68 4.6.6 设置二代证照片存储路径 IDCard_SetPhotoPath ................................ 69 4.6.7 设置二代证照片名字 IDCard_SetPhotoName ................................ 70 4.6.8 读二代证信息扩展二 IDCard_ReadCard_Ex .................................. 71 4.6.9 删除所有二代证照片文件 delete_all_photofile ..................................... 74 4.6.10

ID

IDCard_Read_IDNUM .............................. 75 4.6.11 获取卡姓名 IDCard_Name ......... 76 4.6.12 获取卡性别 IDCard_Sex ............. 77 4.6.13 获取卡名族 IDCard_Nation ....... 78

4.7 4.6.14 获取卡出生日期 IDCard_Birthday79 4.6.15 获取卡出生地址 IDCard_Address80 4.6.16 获取卡身份证号 IDCard_IDNumber .................................... 81 4.6.17

IDCard_IssueDepartment .......................... 82 4.6.18 获取卡有效期起始日期 IDCard_ValidFromDate ............................ 84 4.6.19 获取卡有效期截止日期 IDCard_ValidExpiryDate .......................... 85 4.6.20 获取卡预留信息 IDCard_Reserve86 4.6.21 获取非接触式卡片类型 CLCard_Open ............................................ 88 4.6.22 获得读卡过程中生成文件的Base64编码 GetFileBase64Buffer ...................... 89 4.6.23 读取二代证信息扩展三 IDCard_ReadCard_ExTwo ............................ 90 4.6.24 wlt转bmp文件 iWlttoBmp ......... 91 4.6.25 读二代证追加信息 ........................ 92 工具函数 ...................................................... 93

4.7.1 将 16 进制数转换为 ASCII 字符hex_asc ......................................................... 93 4.7.2 将 ASCII 字符转换为 16 进制数

4.8 asc_hex ......................................................... 94 4.7.3 DES 算法加密函数rf_encrypt ..... 95 4.7.4 DES 算法解密函数 rf_decrypt .... 96 4.7.5 将 16 进制数转换为 Base64 字符hex_base64 .................................................. 97 4.7.6 将 Base64字符转换为16进制数base64_hex .................................................. 98 4.7.7 DES 算法加密函数des_encrypt ... 99 4.7.8 DES 算法解密函数des_decrypt错误!未定义

4.7.9 TDES 算法加密函数des3_encrypt101 4.7.10 TDES 算法解密函数des3_decrypt102 4.7.11 将 ASCII 字符转换为 10 进制数asc_dec ....................................................... 104 接触式存储卡操作函数 ............................ 104

4.8.1 设置接触式存储卡种类contact_settype ...................................... 105 4.8.2 识别接触式存储卡种类contact_identifytype ............................ 107 4.8.3 接触式存储卡密码校验contact_passwordcheck .......................... 108 4.8.4 接触式存储卡读数据contact_read .................................................................... 109 4.8.5 接触式存储卡写数据

contact_write .......................................... 110 4.8.6 接触式存储卡密码初始化〔更改密码〕contact_passwordinit .................... 112 4.9 磁条卡操作函数 ........................................ 113

4.9.1 获取磁条卡数据magnetic_read 113 4.9.2 设置磁条卡数据输出方式set_magnetic_mode .................................. 115 4.10 外挂密码键盘 .......................................... 115

4.10.1 密码键盘下载主密钥 .................. 115 4.10.2 密码键盘下载工作密钥(密钥为密文) .............................................................. 116 4.10.3 密码键盘激活主密钥和工作密钥118 4.10.4 密码键盘设置键盘输入密码的长度118 4.10.5 密码键盘设置键盘超时时间 ...... 119 4.10.6 获取键盘输入的密码(明文传输)120 4.10.7 获取键盘输入的密码(密文传输)121 4.11 AT88SC1604卡 ......................................... 122

4.11.1 读数据 srd_1604 ........................ 122 4.11.2 写数据 swr_1604 ........................ 124 4.11.3 校验应用区密码 csc_1604 ........ 125 4.11.4 校验擦除密码 cesc_1604 .......... 126 4.11.5 擦除数据 ser_1604 .................... 127 4.11.6 写密码 wsc_1604 ........................ 128

4.11.7 伪个人化 fakefus_1604 ............ 129 4.11.8 个人化 psnl_1604 ...................... 130 4.12 金融IC卡 ................................................. 131

读取金融IC卡卡号和姓名 ...................... 131

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.

D. USB接口一个 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] [Arg2:DataType2;...])

调用语句的语法包含下面局部:

 关键字Public〔可选〕,表示函数可以被程序代码中的任意局部访问。

 关键字Private〔可选〕,表示函数在声明类的单元〔源代码〕外不能访问。

 关键字Protected〔可选〕,表示保护函数,保护元素只能被当前类和它的子类访问。

 关键字Function〔必选〕,表示调用函数,函数有返回值。

 FunctionName〔必选〕,调用外部函数的名称,区分大小写。

 关键字Var〔可选〕,表示通过引用传递参数,函数参数可以用值传递,也可以通过引用传递。通过引用传递参数,它的值没被复制到存放函数例程参数的堆栈中,程序执行速度快。通过引用传值,将

[Arg1:DataType1;] [:ReturnDataType];

far;stdcall;external‘libname’ [Name AliasName];

允许过程和函数改变参数的值。

 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] 局部描述:

 Optional〔可选〕,表示参数不是必需的。如果使用该选项,那么 arglist 中的后续参数都必需是可选的,而且必须都使用 Optional 关键字声明。如果使用了 ParamArray,那么任何参数都不能使用 Optional。

 ByVal〔可选〕,表示该参数按值传递。  ByRef〔可选〕,表示该参数按地址传递。

[ByVal

|

ByRef]

[ParamArray]

varname[( )] [As type]

 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或工程文件中参加文件。

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。 StatusH StatusL 00H 00H

00H 01H

说明

命令执行正确回应 可选的功能接口或参数不支持〔包括可选的通讯波特率参数、显示屏功能等〕

00H 00H 00H 00H

02H 03H 04H 05H

相片解码错误 wlt文件后缀错误 wlt文件翻开错误

00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 10H 10H 10H 10H 06H 07H 08H 09H 11H 12H 13H 14H 15H 16H 17H 18H 21H 22H 23H 24H 25H 31H 32H 01H 02H 03H 04H wlt文件格式错误 软件未授权 设备连接错误 相片解码其他错误

命令超时 无效的通讯句柄 翻开通讯端口错误 通讯端口已被占用 获取通讯端口状态错误 设置通讯端口状态错误 从读写器读取数据出错 向读写器写入数据出错

STX错误 ETX错误 校验位错误 数据长度大于最大长度

数据值错误

获取身份证信息,下标有误

身份证读卡错误 不支持接触用户卡 接触用户卡未插到位 接触用户卡已上电 接触用户卡未上电

10H 10H 10H 20H 20H 20H 20H 20H 20H 30H 30H 30H 30H 30H 30H 30H 60H 60H

05H 06H 07H 01H 03H 04H 05H 06H 07H 01H 04H 05H 06H 07H 08H 09H 01H 20H

接触用户卡上电失败 操作接触用户卡数据无回

操作接触用户卡数据出现

错误 不支持PSAM卡 PSAM卡已上电 PSAM卡未上电 PSAM卡上电失败 操作PSAM卡数据无回应 操作PSAM卡数据出现错

不支持非接触用户卡 非接触用户卡未激活 非接触用户卡激活失败 操作非接触用户卡无回应

〔等待超时〕 操作非接触用户卡数据出

现错误

非接触用户卡halt失败 有多张卡在感应区 不支持逻辑操作 卡片类型不对〔卡状态

60H 60H 60H 60H 60H 60H 60H 60H 60H 60H 21H 22H 23H 30H 31H 32H 33H 40H 41H 42H

6A82〕

余额缺乏〔卡状态9401〕

卡片功能不支持〔卡状态

6A81〕 扣款失败〔卡状态9302〕

卡片未启用 卡片不在有效期 交易明细无此记录 交易明细记录未处理完成

需要做防拔处理 防拔处理中出错, 非原来

交易中断, 没有资金损失

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 正确 举

4.2.8 获取读写器生产序列号 device_readsnr

例: __int16

st=device_ledctrl(icdev,128);

函数功能:获取读写器生产序列号 函

__int16

__stdcall

char

device_readsnr(HANDLE 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);

icdev,unsigned

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);

函数功能:更新读卡器的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 接触式卡片操作函数

判断接触式卡片状态sam_slt_getstate

函数功能:判断指定卡座号中的卡片状态,包括接触式用户卡和PSAM卡。

函数声明: __int16 sam_slt_getstate(HANDLE icdev,unsigned cardstate);

入口参数: icdev: 通讯设备标识符

cardno: 1字节 卡片类型 接触式用户卡:00H-0FH, PSAM卡:10H-1FH 出口参数: cardstate: 返回的卡片状态 10H,01H 不支持接触式用户卡

10H,02H 接触式用户卡未插到位 10H,03H 接触式用户卡已上电 10H,04H 接触式用户卡未上电 20H,01H 不支持PSAM卡 20H,03H PSAM卡已上电 20H,04H PSAM卡未上电 返回值: <>0 错误

char

cardno,unsigned

short*

=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 resetdata);

入口参数:icdev:通讯设备标识符

delaytime 2字节 等待插卡时间〔单位:毫秒〕,0:无需等待,无卡直接返回

cardno: 1字节 接触式用户卡:00H-0FH, PSAM卡:10H-1FH

出口参数:rlen: 1字节 复位信息长度 resetdata: 复位信息数据 返回值: =0,执行成功

char*

rlen,unsigned

char*

<>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 通讯设备标识符

Cardno 1字节 接触式用户卡:00H-0FH, PSAM卡:10H-1FH

resetBaud 0: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

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作为超时

退出时间。如果有卡在感应区但激活失败, 那么读写器不用继续寻卡就直接返回“激活失败〞。

char

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 的长度

CardNo 1字节 非接触式卡: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 数

st=card_APDU(icdev,0xFF,5,databuff,&rlen,datarecv); //非接触式卡取随机数

4.5 非接触式存储卡操作函数

4.5.1 激活非接触式存储卡rf_card

char

databuff[]={0x00,0x84,0x00,0x00,0x08,0}; //取随机

函数功能:读写器在传递的时间内查寻卡是否进入感应区,并激活进入感应区的非接触式存储卡。

函数声明:__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卡

cardID 4字节 卡片UID

返回值: <>0 错误 =0 正确 举例: __int16 st;

unsigned char nCardType=1; unsigned

nCardID[10]={0,0,0,0,0,0,0,0,0,0};

st=rf_card(icdev,0,&nCardType,nCardID);

注: 由于调用该函数时,不一定有卡在感应区,很有可能需要较长的时间才能等到卡进感应区,故设定较长的时间给读写器,完全由读写器在这段时间等待对卡激活,如果超时了便返回“激活失败〞。此函数的delaytime参数就是为了传递上述时间参数给读写器。如果delaytime参数为0,在无卡进感应区时读写器不用等待直接返回“激活失败〞;

char

如果delaytime参数为0xffff时,一直寻卡,直到卡进入感应区;如果delaytime参数为其它值时,读写器可在delaytime时间内一直寻卡,直到超时了读 写器才返回“激活失败〞,此时主机端也是采用delaytime作为超时退出时间。如果有卡在感应区但激活失败,

那么读写器不用继续寻卡就直接返回“激活失败〞。

4.5.2 非接触式存储卡认证扇区 rf_authentication

函数功能:对非接触式存储卡的某一个扇区进行认证。

函数声明:__int16 rf_authentication(HANDLE icdev,unsigned char mode,unsigned char addr, unsigned char *key);

入口参数: icdev: 通讯设备标识符 mode: 认证模式 0 KEYA 模式

1 KEYB 模式

addr: 扇区号

key: 要传入的密码,6 字节。

返回值: <>0 错误 =0 正确 举例: __int16 st; unsigned

st=rf_authentication(icdev,0,1,Nkey); //使用密码A对扇区1认证,认证密码为

char

Nkey[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0};

“FFFFFFFFFFFF〞;

4.5.3 非接触式存储卡读数据rf_read

函数功能:获取非接触存储卡指定块地址的数据 函数声明:__int16 icdev,unsigned *readdata)

入口参数: icdev:通讯设备标识符 addr:块地址 出口参数: readdata:读出数据 返回值: <>0 错误 =0 正确 举例: __int16 st;

unsigned char Addr=1; unsigned

Data[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; st=rf_read(icdev, Addr,Data);

4.5.4 非接触式存储卡写数据rf_write

rf_read(HANDLE

char

char addr,unsigned

char

函数功能:设置非接触存储卡指定块地址的数据 函数声明:__int16

rf_write(HANDLE

icdev,unsigned char addr,unsigned char*

writedata)

入口参数:icdev:通讯设备标识符 addr:块地址

writeata:要写入的数据 返回值: <>0 错误 =0 正确 举例: __int16 st;

unsigned char Addr=1; unsinged char WriteData[17]= {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x00}; st=rf_write( icdev,Adr,WriteData);

4.5.5 非接触式存储卡读值块rf_readval

函数功能:获取非接触存储卡指定块地址的数值 函数声明:__int16 rf_readval(HANDLE icdev,unsigned readvalue)

入口参数: icdev: 通讯设备标识符 addr: 块地址 出口参数: readvalue: 读出的值

char

addr,unsigned

long*

返回值: <>错误 =0 正确 举例: __int16 st;

unsigned char Block = 1; unsigned long val=0;

st = rf_readval(icdev, Block, &val);

4.5.6 非接触式存储卡写值块rf_initval

函数功能:设置非接触存储卡指定块地址的数值 函数声明:__int16 rf_initval(HANDLE icdev,unsigned writevalue);

入口参数: icdev:通讯设备标识符 addr:块地址 writevalue:传入的值 返回值: <>0 错误 =0 正确 举例: __int16 st;

unsigned char Block = 1; unsigned long val=10; st=rf_initval(icdev,Block,val);

char

addr,unsigned

long

4.5.7 非接触式存储卡加值rf_increment

函数功能:对非接触存储卡指定块地址的数据进行加值操作

函数声明:__int16 rf_increment(HANDLE icdev,unsigned char addr,unsigned long incvalue) 入口参数: icdev:通讯设备标识符 addr:块地址 incvalue:传入的值 返回值: <>0 错误 =0 正确 举例: __int16 st;

unsigned char Block = 1; unsigned long val=10;

st=rf_increment(icdev,Block,val);

4.5.8 非接触式存储卡减值rf_decrement

函数功能:对非接触存储卡指定块地址的数据进行减值操作

函数声明:__int16 rf_decrement(HANDLE

icdev,unsigned char addr,unsigned long decvalue) 入口参数: icdev:通讯设备标识符 addr:块地址 decvalue:传入的值 返回值: <>0 错误 =0 正确 举例: __int16 st;

unsigned char Block = 1; unsigned long val=10;

st=rf_decrement(icdev,Block,val);

4.5.9 非接触式存储卡值传送 rf_transfer

函数功能:非接触式存储卡值传送

函数声明:__int16 __stdcall rf_transfer(HANDLE icdev,unsigned char nAdr); 入口参数: icdev:通讯设备标识符 addr:块地址 返回值: <>0 错误 =0 正确 举例: __int16 st;

unsigned char Block = 1; st=rf_transfer(icdev,Block);

4.6 二代身份证操作函数

注意:读二代证保存照片文件时,设置的二代证存储路径和照片名称的总长度不能超过250个字节。〔不包括.bmp或.wlt〕

4.6.1 卡操作指令-身份证读卡IDCard_Read

函数功能:读取身份证上的数据

函数声明:__int16 IDCard_Read(HANDLE icdev,int* rLen,unsigned char* receivedata); 入口参数:icdev: 通讯标识符 出口参数:rLen: 读取的数据的长度 Receivedata:读取的数据 返回值: <>0 错误 =0 正确 举例: __int16 st=0; int RecLen=0;

unsigned char RecData[1024]; memset(RecData,0,1024);

st=IDCard_Read(icdev,&RecLen,RecData); 注意:该函数是一次性把所有的数据给读回来,

返回的数据包括文字信息与图片信息,文字信息为Unicode编码字符。

身份证信息表

文字信息长度高字节 〔1字节〕 文字信息长度低字节 〔1字节〕 相片信息长度高字节 〔1字节〕 相片信息长度低字节 〔1字节〕 文字信息〔可变〕 相片信息〔可变〕 〔不大于256字节〕 〔不大于1024字节〕 文字信息一般为256字节,采用Unicode编码,根本信息文件数据项结构如下: 序号 1 2 3 4 5 6 7 8 9 工程名称 姓名 性别 民族 出生日期 住址 公民身份号码 签发机关 有效期起始日期 有效期截止日期 字节数 30 2 4 16 70 36 30 16 16 说明 符合GB/T 3304 的规定 年月日:CCYYMMDD 符合GB/T11643 的规定 年月日:CCYYMMDD 年月日:CCYYMMDD 有效期为长期的存储表示为“长期〞 10 预留区 36 注:文字信息缺乏部份补空格(0x0020) 附:

人的性别代码:0--未知的性别;1---男性;2--女性;9--未说明的性别。

2.中国各民族名称的罗马字母拼写法和代码 数字代码 民族民称 字母代码 数字代码 民族民称 字母代码 1 汉族 HA 29 柯尔克孜族 KG

2 蒙古族30 土族 3 回族

MG31 达斡尔族4 藏族 HU ZA 32 仫佬族

5 维吾尔族33 羌族

6 苗族

UG 34 布朗族 7 彝族 MH35 撒拉族 8 壮族 YI 36 毛难族 9 ZH BY 37 仡佬族 10 布依族11 朝鲜族

CS 38 锡伯族 39 阿昌族 12 满族 MA13 侗族 DO 40 普米族

41 塔吉克族14 瑶族 YA15 白族 BA 42 怒族

16 土家族 TJHN 43 乌孜别克族17 哈尼族 44 俄罗斯族

45 鄂温克族18 哈萨克族

KZ19 傣族 DALI 46 德昂族

20 黎族傈僳族LS 47 保安族 21 佤族 VA 48 裕固族22 畲族 SH 49 京族

23 高山族 GS 50 塔塔尔族51 独龙族 24 拉祜族LH25 水族

SU 52 鄂伦春族26 东乡族 DX 53 赫哲族

54 门巴族 27 纳西族 NX28

景颇族

JP

55 珞巴族 56

基诺族

外国血统中97 其他

98

国籍人士

4.6.2 卡操作指令-身份证读卡IDCard_ReadCard

函数功能:读取身份证上的数据

TU DU MLQI BLSL MNGL XB AC PMTA NU UZRS EWDE BN YGGI TT DR OR HZ MB LBJN

函数声明:__int16 IDCard_ReadCard(HANDLE icdev,char* message);

入口参数:icdev: 通讯标识符

出口参数:message: 返回的操作信息〔长度在8到18之间,定义时字节长度要大于18〕 返回值: <>0 错误 =0 正确 举例: __int16 st=0; char RecMessage[20]; memset(RecMessage,0,20);

st=IDCard_ReadCard(icdev,RecMessage); 注意:该函数调用调用成功后,需配合调用4.6.3,根据索引获取身份证数据一起使用。

4.6.3卡操作指令 根据索引获取身份证数据IDCard_GetCardInfo

函数功能:根据索引获取身份证数据结构体中该下表所对应的数据 函

__int16 icdev,int

IDCard_GetCardInfo(HANDLE index,char* infodata);

入口参数:icdev: 通讯标识符

index: 索引值,取值范围〔0-10〕

出口参数:infodata: 该索引对应的数据〔长度在4到70之间,定义时字节长度要大于70〕 返回值: <>0 错误 =0 正确 举例: __int16 st=0; int nIndex=0; char cInfoData[72]; memset(cInfoData,0,72);

st=IDCard_GetCardInfo(icdev,nIndex,cInfoData); //获取姓名

索引值说明:0--姓名,1--性别,2--民族,3--出生日期,4--住址,5--公民身份号码,6--签发机关,7--有效期起始日期,8--有效期截止日期,9--预留区,10--照片文件名。

4.6.4 获取二代证模块ID IDCard_GetModeID

函数功能:获取二代证模块ID 函

__int16

__stdcall

IDCard_GetModeID(HANDLE

icdev,unsigned

char* nIDLen,unsigned char* sIDData); 入口参数:icdev 通讯设备标识符

出口参数:nIDLen 模块ID数据长度 返回值: <>0 错误 =0 正确 举例: int st=0;

unsigned char nIDLen=0; unsigned char sIDData[30]; memset(sIDData,0,30);

st=IDCard_GetModeID(icdev,&nIDLen,sIDData);

4.6.5 身份证读卡模块扩展一IDCard_ReadCard_Extra

sIDData nIDLen字节 模块ID信息

函数功能:读取身份证上的数据,同时可以设置照片保存路径。 函

__int__stdcallIDCard_ReadCard_Extra(HANDLE icdev,char *lpInPhoneSaveFile,char * meage);

入口参数:icdev: 通讯标识符 lpInPhoneSaveFile, 照片保存路径绝对地址〔包括文件路径及文件名字,只支持BMP

格式的照片文件。〕如:D:\\\\mt\\\\mt\\\\zp.bmp,当参数传入为空时,不生成照片数据,只要不为空, 就会去判断路径是否正确,正确的话,会在相应地方生成指定的照片文件。

出口参数:me age: 返回的操作信息〔长度在8到18之间,定义时字节长度要大于18〕

返回值: <>0 错误 =0 正确 举例: __int16 st=0;

Char RecMeage[20]; memset(RecMeage,0,20);

st=IDCard_ReadCard_Extra(icdev,“〞,RecMe age);

注意:该函数调用调用成功后,需配合调用4.6.3,根据索引获取身份证数据一起使用。

如果需要保存照片文件,该函数会先去判断照片路径是否存在,不存在会去创立相应的路径.

4.6.6 设置二代证照片存储路径 IDCard_SetPhotoPath

函数功能:设置二代证照片存储路径,不加照片

名称。 函

__int16

__stdcall

IDCard_SetPhotoPath( char* photoPath ); 入口参数:photoPath 存储绝对路径,结尾不加照片名称。 出口参数:无 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

St = IDCard_SetPhotoPath(“c:\\\\〞); 注意:传入的路径必须是合法路径,函数接口会去判断路径合法性。

4.6.7 设置二代证照片名字 IDCard_SetPhotoName

函数功能:设置二代证照片存储名字。 函

__int16

__stdcall

IDCard_SetPhotoName( char* photoName ); 入口参数:photoName 存储的二代证照片名字 出口参数:无 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

St = IDCard_SetPhotoName(“zp〞); 注意:传入的存储照片的名字必须是合法的名字,函数接口会去判断名字合法性。

4.6.8 读二代证信息扩展二 IDCard_ReadCard_Ex

函数功能:读取二代证信息。 函

__int16

__stdcall

IDCard_ReadCard_Ex(

HANDLE icdev, char* sName, char* sSex, char* sNation, char* sBirthday, char* sAddress, char* sIDNumber, char* sIssueDepartment, char* sValidFromDate, char* sValidExpiryDate, char* sReserve, int iSavePhoto, char* sPhotoBase64, int* iPhotoBase64Len,

char* message); 入口参数:icdev 设备句柄

iSavePhoto 照片保存方式参数:0,不保存照片;1、照片保存为指定名称;2、照片保 存名称为身份证号码 出口参数:sName 姓名 sSex 性别 sNation 名族

sBirthday 出生日期 sAddress 出生地址 sIDNumber 身份证号码 sIssueDepartment 签发机关

sValidFromDate 证件有效期起始日期 sValidExpiryDate 证件有效期截至日期

sReserve 预留信息

sPhotoBase64 照片信息Base64码 iPhotoBase64Len 照片信息Base64码长度

Message 错误信息 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char Info_Name[40]=\"\\0\"; //姓名 char Info_Gender[3]=\"\\0\"; //性别 char Info_Nation[18]=\"\\0\"; //民族 char Info_Birth[16]=\"\\0\"; //出生日期 char Info_Address[70]=\"\\0\"; //住址 char Info_IDNumber[36]=\"\\0\"; //公民身份证号

char Info_Issued[30]=\"\\0\"; //签发机关 char Info_DateBegin[16]=\"\\0\"; //有效期起始日期

char Info_DateEnd[16]=\"\\0\"; //有效期截止日期

char Info_Reserved[36]=\"\\0\"; //预留区

char Info_PhotoName[50]=\"\\0\"; //照片文件名

char cPhotoBase64[65530]=\"\\0\"; int iPhotoBase64Len = 0;

st = IDCard_ReadCard_Ex(

hDev, Info_Name, Info_Gender,

Info_Nation, Info_Birth, Info_Address, Info_IDNumber,\\

Info_Issued,

Info_DateBegin, Info_DateEnd, Info_Reserved, 1,

cPhotoBase64, &iPhotoBase64Len, cMessage);

本卷须知:

如果需要保存照片文件,该函数会先去判断照片路径是否存在,不存在会去创立相应的路径.

4.6.9 删除所有二代证照片文件 delete_all_photofile

函数功能:删除所有二代证照片文件〔wlt及bmp格式文件〕。

函数声明:__int16 __stdcall delete_all_photofile(); 入口参数:无 出口参数:无 返回值:<>0 错误

=0 正确 举例: __int16 st=0; St = delete_all_photofile();

4.6.10 获取卡ID号 IDCard_Read_IDNUM

函数功能:获取卡ID号。 函

__int16

__stdcall icdev,int*

IDCard_Read_IDNUM(HANDLE rlen,unsigned char* receivedata);

入口参数:icdev 通讯设备标识符 rlen ID卡号长度

Receivedata ID卡号 出口参数:无 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

int rlen = 0; char szRecv[128];

memset(szRecv, 0, sizeof(szRecv));

St = IDCard_Read_IDNUM(icdev, &rlen,

szRecv);

4.6.11 获取卡姓名 IDCard_Name

函数功能:获取卡姓名。

函数声明:__int16 __stdcall IDCard_Name(char* cUnicodeStr, char* cName);

入口参数:cUnicodeStr 姓名对应的UNICODE码

出口参数:cName 姓名 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeName[31]; memset(cUnicodeName, sizeof(cUnicodeName));

memcpy(cUnicodeName, glUnicode + 9, 30); char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); St = IDCard_Name(cUnicodeName, szRecv);

注意:glUnicode为4.6.1读二代证成功返回的

0,

UNICODE信息。

4.6.12 获取卡性别 IDCard_Sex

函数功能:获取卡性别。

函数声明:__int16 __stdcall IDCard_Sex(char* cUnicodeStr, char* cSex);

入口参数:cUnicodeStr 性别对应的UNICODE码

出口参数:cSex 性别 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeSex[31]; memset(cUnicodeSex, sizeof(cUnicodeSex));

memcpy(cUnicodeSex, glUnicode + 39, 2); char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); St = IDCard_Sex(cUnicodeSex, szRecv);

注意:glUnicode为4.6.1读二代证成功返回的

0,

UNICODE信息。

4.6.13 获取卡名族 IDCard_Nation

函数功能:获取二代证名族。 函

__int16

__stdcall

IDCard_Nation(char* cANSIStr,char* cNation); 入口参数:cUnicodeStr 名族对应的UNICODE码

出口参数:cNation 名族 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeNation[31]; memset(cUnicodeNation, sizeof(cUnicodeNation));

memcpy(cUnicodeNation, glUnicode + 41, 4); char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); St szRecv);

=

IDCard_Nation(cUnicodeNation,

0,

注意:glUnicode为4.6.1读二代证成功返回的UNICODE信息。

4.6.14 获取卡出生日期 IDCard_Birthday

函数功能:获取二代证出生日期。 函

__int16

__stdcall char*

IDCard_Birthday(char* cBirthday);

入口参数:cUnicodeStr 出生日期对应的UNICODE码

出口参数:cBirthday出生日期 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeBirth[31]; memset(cUnicodeBirth, sizeof(cUnicodeBirth));

0,

cUnicodeStr,

memcpy(cUnicodeBirth, glUnicode + 45, 16); char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); St szRecv);

注意:glUnicode为4.6.1读二代证成功返回的UNICODE信息。

4.6.15 获取卡出生地址 IDCard_Address

= IDCard_Birthday(cUnicodeBirth,

函数功能:获取二代证出生地址。 函

__int16 cUnicodeStr,

__stdcall char*

IDCard_Address(char* cAddress);

入口参数:cUnicodeStr 出生地址对应的UNICODE码

出口参数:cAddress出生地址 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeAddress[256]; memset(cUnicodeAddress, sizeof(cUnicodeAddress));

memcpy(cUnicodeAddress, glUnicode + 61, 70);

char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); st szRecv);

注意:glUnicode为4.6.1读二代证成功返回的UNICODE信息。

4.6.16 获取卡身份证号 IDCard_IDNumber

0,

= IDCard_Address(cUnicodeAddress,

函数功能:获取二代证身份证号。 函

__int16

__stdcall

IDCard_IDNumber(char* cUnicodeStr, char* cIDNumber);

入口参数:cUnicodeStr 身份证号码对应的UNICODE码

出口参数:cIDNumber身份证号码 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeIDNo[256]; memset(cUnicodeIDNo, sizeof(cUnicodeIDNo));

memcpy(cUnicodeIDNo, glUnicode + 131, 36);

char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); st szRecv);

注意:glUnicode为4.6.1读二代证成功返回的UNICODE信息。

4.6.17 获取卡签发机构 IDCard_IssueDepartment

0,

= IDCard_IDNumber(cUnicodeIDNo,

函数功能:获取二代证身份证签发机构。

函数声明:__int16 __stdcall cUnicodeStr,

IDCard_IssueDepartment(char* char* cIssueDepartment);

入口参数:cUnicodeStr 身份证签发机构对应的UNICODE码

出口参数:cIssueDepartment身份证签发机构 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeDepartment[256]; memset(cUnicodeDepartment, sizeof(cUnicodeDepartment));

memcpy(cUnicodeDepartment, glUnicode + 167, 30);

char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); st szRecv);

注意:glUnicode为4.6.1读二代证成功返回的UNICODE信息。

=

IDCard_IssueDepartment(cUnicodeDepartment,

0,

4.6.18 获取卡有效期起始日期 IDCard_ValidFromDate

函数功能:获取二代证身份证有效期起始日期。 函

__int16

__stdcall cUnicodeStr,

IDCard_ValidFromDate(char* char* cValidFromDate);

入口参数:cUnicodeStr 身份证有效期起始日期对应的UNICODE码

出口参数:cValidFromDate身份证有效期起始日期

返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeDateStart[256]; memset(cUnicodeDateStart, sizeof(cUnicodeDateStart));

0,

memcpy(cUnicodeDateStart, glUnicode + 197, 16);

char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); st

IDCard_ValidFromDate(cUnicodeDateStart, szRecv);

注意:glUnicode为4.6.1读二代证成功返回的UNICODE信息。

4.6.19 获取卡有效期截止日期 IDCard_ValidExpiryDate

=

函数功能:获取二代证身份证有效期截止日期。 函

__int16

__stdcall cUnicodeStr,

IDCard_ValidExpiryDate(char*

char* cValidExpiryDate);入口参数:cUnicodeStr 身份证有效期截止日期对应的UNICODE码

出口参数:cValidExpiryDate身份证有效期截止日期

返回值:<>0 错误 =0 正确

举例: __int16 st=0;

char cUnicodeDateStart[256]; memset(cUnicodeDateStart, sizeof(cUnicodeDateStart));

memcpy(cUnicodeDateStart, glUnicode + 213, 16);

char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); st

=IDCard_ValidExpiryDate(cUnicodeDateStart, szRecv);

注意:glUnicode为4.6.1读二代证成功返回的UNICODE信息。

4.6.20 获取卡预留信息 IDCard_Reserve

0,

函数功能:获取二代证身份证预留信息。

函数声明:__int16 cUnicodeStr,

__stdcall char*

IDCard_Reserve(char* cReserve);

入口参数:cUnicodeStr 身份证预留信息对应的UNICODE码

出口参数:cReserve身份证预留信息 返回值:<>0 错误 =0 正确 举例: __int16 st=0;

char cUnicodeReserve[256]; memset(cUnicodeReserve, sizeof(cUnicodeReserve));

memcpy(cUnicodeReserve, glUnicode + 229, 36);

char szRecv[128];

memset(szRecv, 0, sizeof(szRecv)); st szRecv);

注意:glUnicode为4.6.1读二代证成功返回的UNICODE信息。

=IDCard_Reserve(cUnicodeReserve,

0,

4.6.21 获取非接触式卡片类型 CLCard_Open

函数功能:获取非接触式卡片类型。 函

:char*

__int16

__stdcall

CLCard_Open( HANDLE icdev,unsigned short delaytime,unsigned

cardtype,unsigned

char* snrlen,unsigned char* snr,unsigned char* rlen,unsigned char* recdata );

入口参数:icdev 通讯设备标识符

delaytime 超时时间 出口参数:

cardtype 卡类型 snrlen UID长度 snr UID信息

Rlen ATR长度 recdata ATR信息 出口参数:无 返回值:<0 错误 1 二代证 2 非接触式CPU卡

3 非接触式存储卡

举例:__int16 st;

unsigned short delaytime; nsigned char cardtype; unsigned char snrlen = 0; unsigned char snr[32]; unsigned char rlen = 0; unsigned char recdata[128]; st

en,snr,&rlen,recdata );

本卷须知,对于二代证,操作成功返回1之后,只需要调用4.6.3〔IDCard_GetCardInfo〕通过索引就可以获取到二代证相关文字信息。不需要再去调用二代证读卡函数去读卡。

4.6.22 获得读卡过程中生成文件的Base64编码 GetFileBase64Buffer

=

CLCard_Open(icdev,delaytime,&cardtype,&snrl

函数功能:获得读卡过程中生成文件的Base64编码

函数声明:int GetFileBase64Buffer( char *filename, char *WideString );

入口参数:filename 带入文件的绝对路径,目前接口只是支持BMP格式。例如C:\\123.bmp 出口参数:WideString Base64编码字符串。错误返回:1:如果文件不存在,返回The file does not Exist.2:如果发生错误返回ERROR

返回值: <> 错误 =0 正确 举例:int st = 0;

Char *WideString = new char[0x000097CE + 1]; St ing );

delete [] WideString;

4.6.23 读取二代证信息扩展三 IDCard_ReadCard_ExTwo

=

GetFileBase64Buffer(“C:\\123.bmp〞,WideStr

函数声明:__int16 __stdcall

IDCard_ReadCard_ExTwo(HANDLE icdev, bool bIsNeedBmpFile, char* lpInFilePath, char* message);

入口参数: icdev 设备句柄

lpInFilePath 生成文件的路径设置,如果为空,那么默认为C盘根目录。

如果下传路径非法,函数接口会报错,如果路径不存在,函数 会创立该路径。

出口参数: message 执行信息

返回值: <> 错误 =0 正确 举例:int st = 0;

st= IDCard_ReadCard_ExTwo(hDev, true, “c:\\zp〞, message);

4.6.24 wlt转bmp文件 iWlttoBmp

函数声明:__int16 __stdcall iWlttoBmp(const

char* lpWltFilePath, char* message); 入口参数: lpWltFilePath

如果路径文件不存在,函数接口直接报错.

出口参数: message 执行信息

返回值: <> 错误 =0 正确 举例:int st = 0;

st= iWlttoBmp(“〞, message);

5 读二代证追加信息

函数功能:读二代证的追加信息 函数声明: __int16 IDCard_ReadAdded(HANDLE 入口参数: icdev 设备句柄

出口参数: rlen 返回数据长度

cReserve 二代证的追加信息 rlen,unsigned char* cReserve);

__stdcall icdev,

int*

返回值: <>0错误 ==0正确 举例: int st,Rlen;

unsigned char RecvData[500]; st

IDCard_ReadAdded(hDev,&Rlen,RecvData);

4.7 工具函数

4.7.1 将 16 进制数转换为 ASCII 字符hex_asc

=

函数功能:将十六进制的数字数组转换为十六进制的字符数组

函数声明:__int16 hex_asc(unsigned char *hex,unsigned char *asc,unsigned long length) 入口参数: hex: 输入要转换的字符串 length: 16 进制数据的字节长度 出口参数: asc: 存放转换后的字符串 返回值: <0 错误 =0 正确

注:转换后的字符串长度为 2*length. 举例: __int16 st;

unsigned char verdata[65]; memset(verdata,0,65);

unsigned

verdatah[5]={0x00,0x02,0x04,0x05,0};

char

//{0x00,0x02,0x04,0x05}转换为字符串“00020405〞,转换后的数据长度是源数据长度的两倍。

st=hex_asc(verdatah,verdata,4);

4.7.2 将 ASCII 字符转换为 16 进制数asc_hex

函数功能:将十六进制的字符数组转换为十六进制的数字数组

函数声明:__int16 asc_hex(unsigned char *asc,unsigned char *hex,unsigned long len) 入口参数: asc : ASCII 字符

len: 十六进制字符的字节长度 出口参数: hex: 存放转换后的字符串 返回值: <0 错误 =0 正确 举例: __int16 st; unsigned

char

prostr[7]={0x31,0x30,0x38,0x39,0x32,0x35,0}; unsigned char databuff[4]={0,0,0,0}; //字符串“108925〞转换{0x10,0x89,0x25},转换

后的数据长度是源数据长度的一半。 st=asc_hex(prostr,databuff,3);

4.7.3 DES 算法加密函数rf_encrypt

函数功能:将原文加密成密文

函数声明:__int16 rf_encrypt(unsigned char *key,unsigned char *ptrSource, unsigned __int16 msgLen,unsigned char *ptrDest);

入口参数:key: 加密的密码,长度为8 ptrSource: 原文

msgLen: 原文长度必需为 8 的倍数 出口参数:ptrDest: 密文 返回值: <>0 失败 =0成功 举例: __int16 st; unsigned 37};

unsigned char strSource[17]=

{0x01,0x23,0x45,0x67,0x89,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0};

char

cKey[8]={0x32,0x30,0x31,0x31,0x30,0x35,0x31,0x

unsigned char strDest[17]; memset(strDest,0,17); st= 16,strDest);

4.7.4 DES 算法解密函数 rf_decrypt

rf_encrypt(cKey,strDest,

函数功能:将密文解密复原为原文

函数声明:__int16 rf_decrypt(unsigned char *key,unsigned char *ptrSource, unsigned __int16 msgLen,unsigned char *ptrDest); 入口参数:key: 解密的密码;长度为 8 ptrSource,: 解密前的密文

msgLen: 密文长度必需为 8 的倍数 出口参数:ptrDest: 原文 返回值: <>0 失败 =0成功 举例: __int16 st; unsigned 37};

unsigned char strSource[17]=

char

cKey[8]={0x32,0x30,0x31,0x31,0x30,0x35,0x31,0x

{0xA9,0x3B,0xC4,0x00,0x4D,0x5F,0x3D,0x5E,0x15,0xF5,0x26,0x06,0xE7,0xA4,0x1A,0xDF,0};

unsigned char strDest[17]; memset(strDest,0,17); st= 16,strDest);

4.7.5 将 16 进制数转换为 Base64 字符hex_base64

rf_decrypt(cKey,strSource,

函数功能:将十六进制的字符数组转换为Base64的字符数组

函数声明: long hex_base64(unsigned char *hex, unsigned char *base64,unsigned long hexlen); 入口参数: hex: 输入要转换的字符串 hexlen: 十六进制字符的字节长度

出口参数: base64: 存放转换后的字符串 返回值: <0 错误 >0 正确

举例: long st;

unsigned char hex[3]={‘T’,’o’,’m’}; unsigned char base64[5]={0,0,0,0}; st=hex_base64(hex,base64,3); //成功 st == 4,base64 == ‘VG9N’

4.7.6 将 Base64字符转换为16进制数base64_hex

函数功能:将Base64字符数组转换为十六进制的字符数组

函数声明: long base64_hex(unsigned char *base64, unsigned char *hex,unsigned long base64len);入口参数: base64: Base64字符 base64len: Base字符数组的字节长度

出口参数: hex: 存放转换后的字符串 返回值: <0 错误 > 0 正确 举例: long st; unsigned base64[5]={‘V’,’G’,’9’,’N’};

unsigned char hex[4]={0,0,0,0};

char

st=base64_hex(base64,hex,3); //成功 st == 3,hex==’Tom’

4.7.7 DES 算法加密函数des_encrypt

函数功能:将明文用DES算法加密成密文 函数声明:__int16 __stdcall des_encrypt(unsigned char *key,unsigned char *ptrSource, unsigned char msgLen,unsigned char *ptrDest);

入口参数:key: 加密的密码,长度必须为8 ptrSource: 原文 msgLen: 原文长度 出口参数:ptrDest: 密文 返回值: <>0 失败 =0成功 举例: __int16 st; unsigned 37};

unsigned char strSource[17]=

{0x01,0x23,0x45,0x67,0x89,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0};

char

cKey[8]={0x32,0x30,0x31,0x31,0x30,0x35,0x31,0x

unsigned char strDest[17]; memset(strDest,0,17); st= 16,strDest);

4.7.8 DES 算法解密函数des_decrypt

des_encrypt(cKey,strDest,

函数功能:将密文用DES算法解密成明文 函数声明:__int16 __stdcall des_decrypt(unsigned char *key,unsigned char *ptrSource, unsigned char msgLen,unsigned char *ptrDest);

入口参数:key: 解密的密码,长度必须为8 ptrSource: 密文 msgLen: 密文长度 出口参数:ptrDest: 明文 返回值: <>0 失败 =0成功 举例: __int16 st; unsigned 37};

unsigned char strSource[17]=

char

cKey[8]={0x32,0x30,0x31,0x31,0x30,0x35,0x31,0x

{0x01,0x23,0x45,0x67,0x89,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0};

unsigned char strDest[17]; memset(strDest,0,17); st= 16,strDest);

4.7.9 TDES 算法加密函数des3_encrypt

des_decrypt(cKey,strDest,

函数功能:将明文用3DES算法加密成密文 函

__int16

__stdcall

des3_encrypt(unsigned char *key,unsigned char *ptrSource, unsigned char msgLen,unsigned char *ptrDest);

入口参数:key: 加密的密码,长度只为16字节 ptrSource: 明文 msgLen: 明文长度 出口参数:ptrDest: 密文 返回值: <>0 失败

=0成功 举例: __int16 st; unsigned

char

cKey[8]={0x32,0x30,0x31,0x31,0x30,0x35,0x31,0x37,0x32,0x30,0x31,0x31,0x30,0x35,0x31,0x37}; unsigned char strSource[17]=

{0x01,0x23,0x45,0x67,0x89,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0};

unsigned char strDest[17]; memset(strDest,0,17); st= 16,strDest);

4.7.10 TDES 算法解密函数des3_decrypt

des3_encrypt(cKey,strDest,

函数功能:将密文用3DES算法解密成明文 函

__int16

__stdcall

des3_decrypt(unsigned char *key,unsigned char *ptrSource, unsigned char msgLen,unsigned char *ptrDest);

入口参数:key: 解密的密码,长度必须为16字

ptrSource: 密文 msgLen: 密文长度 出口参数:ptrDest: 明文 返回值: <>0 失败 =0成功 举例: __int16 st; unsigned

char

cKey[8]={0x32,0x30,0x31,0x31,0x30,0x35,0x31,0x37,0x32,0x30,0x31,0x31,0x30,0x35,0x31,0x37}; unsigned char strSource[17]=

{0x01,0x23,0x45,0x67,0x89,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0};

unsigned char strDest[17]; memset(strDest,0,17); st= 16,strDest);

des_decrypt(cKey,strDest,

4.7.11 将 ASCII 字符转换为 10 进制数asc_dec

函数功能:将十六进制的字符数组转换为十进制的数字数组

函数声明:__int16 __stdcall asc_dec(unsigned char *asc,unsigned char *dec,unsigned long length)

入口参数: asc : ASCII 字符

length: 十六进制字符的字节长度的一半

出口参数: dec: 存放转换后的字符串 返回值: <0 错误 =0 正确 举例: __int16 st; unsigned

char

prostr[7]={0x31,0x30,0x38,0x39,0x32,0x35,0}; unsigned char databuff[4]={0,0,0,0}; //字符串“108925〞转换{10,89,25},转换后的数据长度是源数据长度的一半。

st=asc_dec(prostr,databuff,3);

4.8 接触式存储卡操作函数 注意:

1、为了减少寻卡工作量,目前在识别存储卡之前,需要先设置卡类型,然后再去识别,如果识别的卡种类跟设置的卡种类一致,那么表示卡识别成功。如果不设置卡种类,直接去识别卡种类,底层BSP只会去识别4442\\4428卡。

2、必须要先设置卡种类、识别卡种类跟设置卡种类匹配后才可以校验密码、修改密码、读、写卡等操作。

3、对于AT24C卡不同种类的卡,会有不同的容量,因此在读写卡的时候传入的偏移地址及读、写数据长度需要注意。 AT24C01 容量:128*1 AT24C02 容量:128*2 AT24C04 容量:128*4 . . .

AT24C256 容量:128*256

4.8.1 设置接触式存储卡种类contact_settype

函数功能:设置接下来将要操作的存储卡的种类,读写器将初始化存储卡操作的参数。

函数声明:__int16 contact_settype(HANDLE icdev,unsigned cardtype);

char

cardno,unsigned

char

入口参数: icdev: 通讯句柄

cardno: 卡座编号,1字节,接触式用户卡:00H-0FH, PSAM卡:10H-1FH

返回值: <0 错误 =0 正确 举例: __int16 st;

unsigned char nCardNO=0;

unsigned char nCardType=02; //卡种类

st=contact_settype(icdev,nCardNO,nCardType);

表4.7.1-1 接触式存储卡类型表 种类代码 01H AT24C01、AT24C02、AT24C04、AT24C08、AT24C16、ST14C02C、ST14C04C、 GPM1K、GPM2K、GPM4K 02H 45D041 03H SLE4418、SLE4428 04H SLE4432、SLE4442 05H AT24C32/64 卡型号

06H 93C46 07H AT153 08H AT102/AT1604 09H AT1608 0AH AT24C128/256

4.8.2 识别接触式存储卡种类contact_identifytype

函数功能:识别接触式存储卡种类。

函数声明:__int16 contact_identifytype(HANDLE icdev,unsigned char cardno,unsigned char* cardtype);

入口参数: icdev: 通讯句柄

cardno: 卡座编号,1字节,接触式用户卡:00H-0FH, PSAM卡:10H-1FH

返回值: <0 错误 =0 正确 举例: __int16 st;

unsigned char nCardNO=0;

unsigned char nCardType=0; //卡种类

st=contact_identifytype(icdev,nCardNO,&nCardType);

4.8.3 接触式存储卡密码校验contact_passwordcheck

函数功能:校验密码是否正确 函

__int16

contact_passwordcheck(HANDLE icdev,unsigned char cardno,unsigned char pinlen,unsigned char* pinstr);

入口参数: icdev: 通讯句柄

cardno: 卡座编号,1字节,接触式用户卡:00H-0FH, PSAM卡:10H-1FH

pinlen: 密码长度,1字节 pinstr: 密码,pinlen个字节 返回值: <0 错误 =0 正确 举例: __int16 st;

unsigned char nCardNO=0; unsigned char nPwdLen=6; unsigned

st=contact_passwordcheck(icdev,nCardNO,nPwdLen,cPwd);

4.8.4 接触式存储卡读数据contact_read

char

cPwd[7]={0xff,0xff,0xff,0xff,0xff,0xff,0x00};

函数功能:读取存储卡上的数据

函数声明:__int16 contact_read(HANDLE icdev,unsigned address,

unsigned short rlen,unsigned char* readdata); 入口参数: icdev: 通讯句柄

cardno: 卡座编号,1字节,接触式用户卡:00H-0FH, PSAM卡:10H-1FH

char

cardno,unsigned

short

address: 地址,2字节 rlen: 数据长度,2字节 出口参数: readdata: 返回的数据,rlen个字节

返回值: <0 错误 =0 正确 举例: __int16 st;

unsigned char nCardNO=0; unsigned 据长度

unsigned char cReadData[65536]; memset(cReadData,0,65536);

st=contact_read(icdev,nCardNO,nDataAddr,nDataLen,cReadData);

4.8.5 接触式存储卡写数据contact_write

short

nDataAddr=0x0110,nDataLen=10; //地址,数

函数功能:往存储卡写入数据

函数声明:__int16 contact_write(HANDLE icdev,unsigned

char

cardno,unsigned

short

address,

unsigned short wlen,unsigned char* writedata); 入口参数: icdev: 通讯句柄

cardno: 卡座编号,1字节,接触式用户卡:00H-0FH, PSAM卡:10H-1FH address: 地址,2字节 wlen: 数据长度,2字节 writedata: 写入的数据,rlen个字节

返回值: <0 错误 =0 正确 举例: __int16 st;

unsigned char nCardNO=0; unsigned 据长度

unsigned

cWriteData[11]={0,1,2,3,4,5,6,7,8,9,10,0};

st=contact_write(icdev,nCardNO,nDataAddr,nDataLen,cWriteData);

char short

nDataAddr=0x0110,nDataLen=10; //地址,数

4.8.6 接触式存储卡密码初始化〔更改密码〕contact_passwordinit

函数功能:初始化或更改卡片密码。 函

__int16

contact_passwordinit(HANDLE pinstr);

入口参数: icdev: 通讯句柄

cardno: 卡座编号,1字节,接触式用户卡:00H-0FH, PSAM卡:10H-1FH pinlen: 密码长度,1字节 pinstr: 新的密码,pinlen个字节

返回值: <0 错误 =0 正确 举例: __int16 st;

unsigned char nCardNO=0; unsigned char nPwdLen=6; unsigned

st=contact_passwordinit(icdev,nCardNO,nPwdLen,cPwd);

char

cPwd[7]={0xff,0xff,0xff,0xff,0xff,0xff,0x00};

icdev,unsigned

char cardno,unsigned char pinlen,unsigned char*

4.9 磁条卡操作函数

4.9.1 获取磁条卡数据magnetic_read

函数功能:获取磁条卡的数据

函数声明: __int16 magnetic_read(HANDLE icdev,

unsigned

char

timeout,MagCard*

mag_card);

入口参数: icdev: 通讯句柄

timeout 磁条卡超时时间,1字节,单位秒。5--255.

出口参数: mag_card 磁条卡数据

返回值: <0 错误 -0x0002表示刷卡超时 -0x0003表示刷卡失败 =0 正确 举例: __int16 st; MagCard magData; st=

magnetic_read(icdev,10,&magData); 注:1.MagCard结构体说明: struct MagCard {

unsigned char track1_len; //1磁道数据长度

unsigned char track2_len; //2磁道数据长度

unsigned char track3_len; //3磁道数据长度

unsigned char track1_data[80]; //1磁道数据

unsigned char track2_data[41]; //2磁道数据

unsigned char track3_data[170]; //3磁道数据 };

4.9.2 设置磁条卡数据输出方式set_magnetic_mode

函数功能:设置磁条卡数据输出方式 函

:

__int16

__stdcall

set_magnetic_mode(HANDLE char nmode);

入口参数: icdev: 通讯句柄

Nmode 磁条卡数据输出方式,0 模拟键盘输入 1 命令模式 出口参数: 无 返回值: <0 错误 =0 正确 举例: __int16 st;

st= set_magnetic_mode(icdev,0);

4.10 外挂密码键盘

4.10.1 密码键盘下载主密钥

icdev,unsigned

函数功能:下载主密钥到密码键盘中 函

__int16

__stdcall icdev,int

mw_kb_downloadmainkey(HANDLE

destype,int mainkeyno,unsigned char *mainkey); 入口参数: icdev 通讯标识符

destype 加密算法类别,0--DES,1--3DES。

mainkeyno 主密钥号,0-3

mainkey 主密钥值,16字节ASCII码字符(DES),或32字节ASCII码字符(3DES) 返回值: <0 错误 =0 正确 举例: __int16 st; int nDesType=0; int nMainKeyNo=0;

st=mw_kb_downloadmainkey(icdev,nDesType,nMainKeyNo,sMainKey);

4.10.2 密码键盘下载工作密钥(密钥为密文)

函数功能:下载工作密钥到密码键盘中,工作密钥为密文 函

__int16

__stdcall

mw_kb_downloaduserkey(HANDLE icdev, int destype, int mainkeyno, int userkeyno, unsigned char *userkey);

入口参数: icdev 通讯标识符

destype 加密算法类别,0--DES,1--3DES。

mainkeyno 主密钥号,0-3. userkeyno 工作密钥号, 0-7.

userkey 工作密钥值,用对应的主密钥加密后的密文,16字节ASCII码字符(DES),或32字节ASCII码字符(3DES) 返回值: <0 错误 =0 正确 举例: __int16 st; int nDesType=0; int nMainKeyNo=0;

int nUserKeyNo=0; unsigned

sUserKey[]=\"cd09bc4876ac0f2b\";

st=mw_kb_downloaduserkey(icdev, nDesType, MainKeyNo, nUserKeyNo, sUserKey);

char

4.10.3 密码键盘激活主密钥和工作密钥

函数功能:激活主密钥和工作密钥 函

__int16

__stdcall

int

mw_kb_activekey(HANDLE mainkeyno,int userkeyno);

入口参数: icdev 通讯标识符

mainkeyno 主密钥号,0-3. userkeyno 工作密钥号, 0-7.

返回值: <0 错误 =0 正确 举例: __int16 st;

int nMainKeyNo=0;

int nUserKeyNo=0;

st=mw_kb_activekey(icdev, MainKeyNo, nUserKeyNo);

注意:目前只有激活工作密钥号才有效。

icdev,

4.10.4 密码键盘设置键盘输入密码的长度

函数功能:设置从键盘输入的密码的长度 函

__int16

__stdcall

mw_kb_setpasslen(HANDLE icdev, int passlen); 入口参数: icdev 通讯标识符

passlen 密码长度,1--15.

返回值: <0 错误 =0 正确 举例: __int16 st;

int nUserKeyNo=0;

st=mw_kb_setpasslen(icdev, nUserKeyNo);

4.10.5 密码键盘设置键盘超时时间

函数功能:设置键盘等待的最长时间 函

__int16

__stdcall

mw_kb_settimeout(HANDLE icdev, int timeout); 入口参数: icdev 通讯标识符

timeout 超时时间,单位为秒,6-255.

返回值: <0 错误 =0 正确 举例: __int16 st; int nTimeOut=0;

st=mw_kb_settimeout(icdev, nTimeOut);

4.10.6 获取键盘输入的密码(明文传输)

函数功能:提示“请输入密码〞或“请再次输入密码〞,并获取从键盘输入的密码 函

:

__int16 icdev,

__stdcall int

type,

mw_kb_getpin(HANDLE unsigned char *planpin);

入口参数: icdev 通讯标识符

type 语音提示类别,1--“请输入密码〞,2--“请再次输入密码〞。

出口参数: planpin 从键盘输入的密码字符,ASCII码字符 返回值: <0 错误 =0 正确 举例: __int16 st;

unsigned char nPwdType=1; unsigned

st=mw_kb_getpin(icdev,nPwdType,sPwdData);

char

sPwdData[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

4.10.7 获取键盘输入的密码(密文传输)

函数功能:提示“请输入密码〞或“请再次输入密码〞,并获取从键盘输入的密码,通讯过程为密文传输 函

:

__int16 icdev,

__stdcall int

type,

mw_kb_getenpin(HANDLE

unsigned char *cardno, unsigned char *planpin); 入口参数: icdev 通讯标识符

type 语音提示类别,1--“请输入密码〞,2--“请再次输入密码〞。

cardno 12个字节的卡号或账号,为ASCII码字符.

出口参数: planpin 从键盘输入的密码字符,ASCII码字符 返回值: <0 错误 =0 正确 举例: __int16 st;

unsigned char nTimeouts=10; unsigned char nPwdLen=0; unsigned

char

sPwdData[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

st=mw_kb_getenpin(icdev,nTimeouts,&nPwdLen,sPwdData);

4.11 AT88SC1604卡

本卷须知:AT88SC1604卡操作流程:识别卡类型 --> 设置卡类型 --> 卡片操作

识别卡类型函数:__int16 __stdcall contact_identifytype(HANDLE 设

icdev,unsigned

__int16 :

char cardno,unsigned char* cardtype);

contact_settype(HANDLE icdev,unsigned char cardno,unsigned char cardtype); AT88SC1604卡卡类型值为0x08,成功识别卡类型时nCardType值为0x08,返回值为0, 设置也必须保证nCardType为0x08

4.11.1 读数据 srd_1604

函数功能:读取AT88SC1604卡内数据

函数声明:int __stdcall srd_1604(HANDLE icdev,int zone,int offset,int len,unsigned char *data_buffer);

入口参数: icdev: 通讯设备标识符

Zone: 应用区号〔0:公用区1:应用一2:应用二3:应用三4:应用四5: 测试区〕

Offset: 卡内地址,注意:该地址必须在前面指定区号对应范围内 Len: 长度值

出口参数: data_buffer:读出的数据,16进制字符数组

返回值: <> 0 错误 == 0 正确 举例: int st=0; unsigned data_buffer[1300]={0};

st=srd_1604(icdev, 1, 27, 1195, data_buffer);

char

4.11.2 写数据 swr_1604

函数功能:向AT88SC1604卡内写数据

函数声明:int __stdcall swr_1604(HANDLE icdev,int zone,int offset,int len,unsigned char *data_buffer);

入口参数: icdev: 通讯设备标识符

Zone: 应用区号〔0:公用区1:应用一2:应用二3:应用三4:应用四5: 测试区〕

Offset: 卡内地址,注意:该地址必须在前面指定区号对应范围内,只限定 应用区,密码区及错误计数器区禁止修改 Len: 长度值

data_buffer:写入的数据,16进制字符数组

返回值: <> 0 错误 == 0 正确 举例: int st=0; unsigned data_buffer[1300]={0};

char

st=swr_1604(icdev, 1, 27, 1195, data_buffer);

4.11.3 校验应用区密码 csc_1604

函数功能:校验AT88SC1604卡应用密码

函数声明:int __stdcall csc_1604(HANDLE icdev,int zone,int len, unsigned char *data_buffer);

入口参数: icdev: 通讯设备标识符

Zone: 应用区号〔0:公用区1:应用一2:应用二3:应用三4:应用四〕 Len: 长度值,定值为2

data_buffer:密码数据,16进制字符数组

返回值: <> 0 错误 == 0 正确 举例: int st=0;

unsigned

data_buffer[5]={0x66,0x53};

char

st=csc_1604(icdev, 1,2, data_buffer);

4.11.4 校验擦除密码 cesc_1604

函数功能:校验AT88SC1604卡应用区擦除密码 函数声明:int __stdcall cesc_1604(HANDLE icdev,int zone,int len, unsigned char *data_buffer);

入口参数: icdev: 通讯设备标识符

Zone: 应用区号〔1:应用一2:应用二3:应用三4:应用四〕 Len: 长度值,定值为2

data_buffer:密码数据,16进制字符数组

返回值: <> 0 错误

== 0 正确 举例: int st=0; unsigned

data_buffer[5]={0x66, 0x53};

st=cesc_1604(icdev, 1,2, data_buffer);

4.11.5 擦除数据 ser_1604

char

函数功能:擦除AT88SC1604卡数据

函数声明:int __stdcall ser_1604(HANDLE icdev,int zone,int offset,int len); 入口参数: icdev: 通讯设备标识符

Zone: 应用区号〔0:公用区1:应用一2:应用二3:应用三4:应用四5: 测试区〕

Offset: 卡内地址,注意:该地址必须在前面指定区号对应范围内,只限定

应用区,密码区及错误计数器区禁止修改 Len: 长度值

出口参数: 无 返回值: <> 0 错误 == 0 正确 举例: int st=0;

st=ser_1604(icdev, 1,27, 2);

4.11.6 写密码 wsc_1604

函数功能:更改AT88SC1604卡密码

函数声明:int __stdcall wsc_1604(HANDLE icdev,int zone,int len, unsigned char *data_buffer);

入口参数: icdev: 通讯设备标识符

Zone: 应用区号〔0:公用区 1:应用一 2:应用二 3:应用三 4:应用 四5:应用一区擦除密码 6:应用二区擦除密码 7:应用三区擦除 密码 8:应

用四区擦除密码〕

Len: 长度值,固定为2

data_buffer:密码数据,16进制数组

出口参数: 无 返回值: <> 0 错误 == 0 正确 举例: int st=0;

unsigned char data_buffer[5]={0};

st=wsc_1604(icdev, data_buffer);

4.11.7 伪个人化 fakefus_1604

1, 2,

函数功能:模拟卡片个人化,与个人化函数差异在于,伪个人化是可逆、可恢复的。

函数声明:int __stdcall fakefus_1604(HANDLE icdev,int mode);

入口参数: icdev: 通讯设备标识符

mode: 伪个人化模式〔0:模拟个人化,1:取消模拟〕 出口参数: 无 返回值: <> 0 错误 == 0 正确 举例: int st=0;

st=fakefus_1604(icdev, 0);

4.11.8 个人化 psnl_1604

函数功能:卡片个人化,固化卡片数据。 函数声明:int __stdcall psnl_1604(HANDLE icdev);

入口参数: icdev: 通讯设备标识符 出口参数: 无 返回值: <> 0 错误 == 0 正确 举例: int st=0;

st=psnl_1604(icdev);

4.12 金融IC卡

说明:金融IC卡是集接触式CPU卡、非接触CPU卡与磁条卡的卡片,此独立模块集成PBOC中对金融IC卡的操作接口。

读取金融IC卡卡号和姓名

函数功能:读取金融IC卡卡号及姓名。 函

int

__stdcall icdev,

int

iReadICCardNoAndName(HANDLE

nCardType, unsigned char* ICCardNo, unsigned char* ICCardName, char* lpErrMsg); 入口参数: icdev 句柄

nCardType 卡片类型 0表示接触式CPU卡、0xFF表示非接触式CPU卡,其 他的不认可。

出口参数: ICCardNo 金融IC卡卡号

ICCardName 金融IC卡姓名

lpErrMsg 错误信息

返回值: <> 0 错误 == 0 正确 举例: int st=0;

Int nCardType = 0;

unsigned char szICCardNo[128]; unsigned char szICName[128]; unsigned char szErrMsg[128];

st=iReadICCardNoAndName(icdev,nCardType,(unsigned

char*)szICCardNo,

(unsigned

char*)szICName, szErrMsg);

因篇幅问题不能全部显示,请点此查看更多更全内容