1. 概述
我公司开发的二代身份证读卡系列机具适用于相关行业的联机型应用。产品提供了完善的二次软件开发接口(API)。本手册对开发接口的文件组成、函数定义格式、调用方法及返回值等进行详细的说明。
本通用开发包支持的设备型号如下:
1、 iDR200(串口和USB口)。
2、 iDR320(必须进入“同步应用”模式)。
3、 iDR400-1(必须进入“同步”模式)。
4、 iDR210(USB-HID免驱动接口)。
5、 iDR210(串口)。
注意:完全兼容原2.0版本开发接口,支持USB-HID接口和串口的iDR210。
1、如果使用原开发包采用动态调用dll方式,只需直接替换原dll即可。
2、如果使用原开发包采用的静态调用方式,则在不改变代码的情况下,对原程序重新编译链接即可。
2. 系统要求
使用本API的PC机,必须满足下列条件:
l Windows 98、Windows 2000 Pro、Windows 2000 Server、
Windows XP。
l 至少32兆内存(32M RAM or Larger)。
l 至少10兆空闲硬盘空间(10M Free Hard Disk Space or Larger)。
l 至少一个空闲普通串口或USB口(视用户需求而定)。
3. 接口文件说明
接口文件包括:
Dewlt.dll 相关动态联接库
sdtapi.dll 该文档所有说明的接口都在该动态联接库
SavePhoto.dll 相关动态联接库
sdtapi.h 该文档包括的所有接口的头文件
适用开发语言:
Visual C++ 5.0 及以后版本
C++ Builder 5.0 及以后版本
Visual Basic 5.0 及以后版本
Delphi 3.0 及以后版本
PowerBuilder 5.0 及以后版本
4. Sdtapi.ll接口函数说明
4.1. 端口函数
4.1.1. 端口初始化函数
原 型:int InitComm (int iPort)
说 明:本函数用于打开串口或USB并检测读卡设备是否就绪。
参 数:iPort:设置串口、USB(公安部标准驱动)、USB-HID(免驱动)、USB-CCID接口。
串口 | 1 – 16(十进制) | 例如: 1: 1(COM1) 2:2(COM2) |
USB | 1001 | 1001 |
返 回 值:
值 | 意义 |
1 | 正确 |
其它 | 错误 |
注:如果读卡机具连接的端口是确定的,可以直接使用相应端口号调用本函数。否则,可以采用循环查找的方式调用本函数。
4.1.2. 端口关闭接口
原 型:int CloseComm(void)
说 明:本函数用于关闭已打开的端口,一般在调用InitComm成功并完成读卡任务后调用。
参 数:无
返 回 值:
值 | 意义 |
1 | 正确 |
其它 | 错误 |
注意:如果不再使用已打开的端口,必须使用CloseComm函数关闭端口。
4.1.3. 关闭天线接口
原 型:int Routon_ShutDownAntenna (void)
说 明:本函数用于关闭天线场强。使用前必须端口初始化(InitComm)成功,关闭天线后,调用卡认证接口或者找卡命令,天线场强将自动打开。
参 数:无
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
-1 | 端口未打开 |
4.1.4. 获取当前接入的HID接口iDR210数量
原 型:int GetHIDCount (void)
说 明:本函数用于获取当前接入的HID接口iDR210的数量。使用前必须端口初始化(InitComm)成功。
参 数:无
返 回 值:
值 | 意义 |
数字 | 设备数量 |
4.1.5. 设定当前操作的HID接口iDR210
原 型:bool HIDSelect (int index)
说 明:本函数用于设定当前操作的HID接口iDR210。使用前必须端口初始化(InitComm)成功。
参 数:index,指定的iDR210的索引号。比如当前接入的设备数量是2,则在调用认证或找卡函数前,可分别使用HIDSelect (1)或HIDSelect (2)来指定准备操作的iDR210设备。
返 回 值:
值 | 意义 |
true | 成功 |
false | 失败 |
4.2. 读二代证相关函数
4.2.1. 卡认证接口
原 型:int Authenticate (void)
说 明:本函数用于发现身份证卡并选择卡。
参 数:无
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
注:认证卡时,需要将身份证放置于读卡机具上方并做稍许时间的停留。如果函数返回错误表示没有发现卡或者卡停留时间太短。
4.2.2. 读卡信息接口
原 型:int ReadBaseMsg( unsigned char * pMsg, int * len);
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息已经分段解析,输出格式为单字节,且每一字段信息已经被表示为字符串。图象信息被解码后存为文件photo.bmp(在当前工作目录下)。
参 数:
pMsg [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于192。函数调用成功后,各字段的文本信息已经转换为单字节形式,并表示为字符串格式。字段意义及偏移值如下所示:
项目 | 长度(字节) | 说明 |
姓名 | 31 | 汉字 |
性别 | 3 | 汉字 |
民族 | 10 | 汉字 |
出生日期 | 9 | CCYYMMDD |
住址 | 71 | 汉字和数字 |
公民身份号码 | 19 | 数字 |
签发机关 | 31 | 汉字 |
有效期起始日期 | 9 | CCYYMMDD |
有效期截止日期 | 9 | CCYYMMDD 有效期为长期的表示为汉字“长期” |
Len [out] 整数, 返回总字符长度,可以给空值(NULL)。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
原 型2:int ReadBaseMsgPhoto( unsigned char * pMsg, int * len,char * directory);
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息已经分段解析,输出格式为单字节,且每一字段信息已经被表示为字符串。图象信息被解码后存为文件photo.bmp(在directory指定目录下)。
参 数:
pMsg [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于192。函数调用成功后,各字段的文本信息已经转换为单字节形式,并表示为字符串格式。字段意义及偏移值如下所示:
项目 | 长度(字节) | 说明 |
姓名 | 31 | 汉字 |
性别 | 3 | 汉字 |
民族 | 10 | 汉字 |
出生日期 | 9 | CCYYMMDD |
住址 | 71 | 汉字和数字 |
公民身份号码 | 19 | 数字 |
签发机关 | 31 | 汉字 |
有效期起始日期 | 9 | CCYYMMDD |
有效期截止日期 | 9 | CCYYMMDD 有效期为长期的表示为汉字“长期” |
Len [out] 整数, 返回总字符长度,可以给空值(NULL)。
directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(NULL),表示照片存储在当前目录中,此时函数效果同ReadBaseMsg。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
4 | 目录不存在 |
原 型3:int ReadBaseInfos( char * Name, char * Gender, char * Folk,
char *BirthDay, char * Code, char * Address,char *Agency, char * ExpireStart,char* ExpireEnd)
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息以字符串格式输出。照片信息被解码后存为文件photo.bmp。
参 数:
Name [out] 字符型指针,指向姓名信息。需要在调用时分配内存,字节数不小31。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
Folk [out] 字符型指针,指向民族信息。需要在调用时分配内存,字节数不小10。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小19。
Address [out] 字符型指针,指向地址信息。需要在调用时分配内存,字节数不小71。
Agency [out] 字符型指针,指向签证机关信息。需要在调用时分配内存,字节数不小31。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
-4 | 缺少dewlt.dll、savephoto.dll等DLL |
原 型4:int ReadBaseInfosPhoto( char * Name, char * Gender, char * Folk,char *BirthDay, char * Code, char * Address,char *Agency, char * ExpireStart,char* ExpireEnd,char * directory)
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息以字符串格式输出。图象信息被解码后存为照片photo.bmp和photo.jpg,身份证正面反面合成图片card.jpg(在directory指定目录下)。
参 数:
Name [out] 字符型指针,指向姓名信息。需要在调用时分配内存,字节数不小31。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
Folk [out] 字符型指针,指向民族信息。需要在调用时分配内存,字节数不小10。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小19。
Address [out] 字符型指针,指向地址信息。需要在调用时分配内存,字节数不小71。
Agency [out] 字符型指针,指向签证机关信息。需要在调用时分配内存,字节数不小31。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(NULL),表示照片存储在当前目录中,此时函数效果同ReadBaseInfos。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
4 | 目录不存在 |
-4 | 缺少dewlt.dll、savephoto.dll等DLL |
原 型5:int ReadBaseMsgW( unsigned char * pMsg, int * len);
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息未解析,文字信息采用GB13000的UCS-2进行存储,图象信息被解码后存为文件photo.bmp(在当前工作目录下)。
参 数:
pMsg [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于256。偏移值如下所示:
项目 | 长度(字节) | 说明 |
姓名 | 30 | 汉字 |
性别 | 2 | 代码 |
民族 | 4 | 代码 |
出生 | 16 | 年月日:YYYYMMDD |
住址 | 70 | 汉字和数字 |
公民身份号码 | 36 | 数字 |
签发机关 | 30 | 汉字 |
有效期起始日期 | 16 | 年月日:YYYYMMDD |
有效期截止日期 | 16 | 年月日:YYYYMMDD 有效期为长期时存储“长期” |
最新住址 | 70 | 汉字和数字 |
Len [out] 整数, 返回基本信息长度。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
原 型6:int ReadBaseMsgWPhoto( unsigned char * pMsg, int * len,char * directory));
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息未解析,文字信息采用GB13000的UCS-2进行存储,图象信息被解码后存为文件photo.bmp(在directory指定目录下)。
参 数:
pMsg [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于256。偏移值如下所示:
项目 | 长度(字节) | 说明 |
姓名 | 30 | 汉字 |
性别 | 2 | 代码 |
民族 | 4 | 代码 |
出生 | 16 | 年月日:YYYYMMDD |
住址 | 70 | 汉字和数字 |
公民身份号码 | 36 | 数字 |
签发机关 | 30 | 汉字 |
有效期起始日期 | 16 | 年月日:YYYYMMDD |
有效期截止日期 | 16 | 年月日:YYYYMMDD 有效期为长期时存储“长期” |
最新住址 | 70 | 汉字和数字 |
Len [out] 整数, 返回基本信息长度。
directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(NULL),表示照片存储在当前目录中,此时函数效果同ReadBaseMsgW。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
4 | 目录不存在 |
注:读卡基本信息时,需要将身份证置于读卡机具上方做稍许时间的停留。
4.2.3. 读追加地址信息
原 型1:int ReadNewAppMsg( unsigned char * pMsg, int * num );
说 明:本函数用于读取卡中追加地址信息,输出格式为单字节字符串格式。
参 数:
pMsg [out] 无符号字符指针,指向读到的追加地址信息。需要在调用时分配内存,字节数不小于284。字段意义及偏移值如下所示:
项目 | 长度(字节) | 说明 |
追加地址1 | 71 | 汉字和数字 |
追加地址2 | 71 | 汉字和数字 |
追加地址3 | 71 | 汉字和数字 |
追加地址4 | 71 | 汉字和数字 |
num [out] 整数, 返回读到的追加地址数。最多为4个。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
原 型2:int ReadNewAppInfos( unsigned char * addr1,
unsigned char * addr2,unsigned char * addr3,
unsigned char * addr4,int * num );
说 明:本函数用于读取卡中追加地址信息,输出格式为单字节字符串格式。
参 数:
addr1、addr2、addr3、addr4 [out] 无符号字符指针,分别指向读到的追加地址信息。需要在调用时分配内存,字节数分别不小于71。
num [out] 整数, 返回读到的追加地址数。最多为4个。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
原 型3:int ReadNewAppMsgW( unsigned char * pMsg, int * num );
说 明:本函数用于读取卡中追加地址信息,信息采用GB13000的UCS-2进行存储。
参 数:
pMsg [out] 无符号字符指针,指向读到的追加地址信息。需要在调用时分配内存,字节数不小于280。偏移值如下所示:
项目 | 长度(字节) | 说明 |
追加地址1 | 70 | 汉字和数字 |
追加地址2 | 70 | 汉字和数字 |
追加地址3 | 70 | 汉字和数字 |
追加地址4 | 70 | 汉字和数字 |
num [out] 整数, 返回读到的追加地址数。最多为4个。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
注:读追加地址信息时,需要将身份证置于读卡机具上方做稍许时间的停留。
4.2.4. 读卡体管理号
原 型:int ReadIINSNDN( char * pMsg );
说 明:本函数用于读取身份证卡的管理号。
参 数:
pMsg [out] 字符指针,需要在调用时分配内存,字节数不小于16。返回8个16进制证卡序列号。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
注:针对ERP编码为1IDA14016(即PCB型号B1342-3) 和 1IDA14018(即PCB型号B1342-3)的串口组件设备,请使用原型2接口来读取身份证物理卡号。
原型2: int Routon_ReadIINSNDN( char * pMsg );
说 明:本函数用于读取身份证卡的管理号。
参 数:
pMsg [out] 字符指针,需要在调用时分配内存,字节数不小于16。返回8个16进制证卡序列号。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
4.2.5. 读模块序列号
原 型:int GetSAMIDToStr( char *pcSAMID );
说 明:本函数用于读取验证安全控制模块(SAM_V)的序列号。
参 数:
pcSAMID [out] 字符指针,需要在调用时分配内存,字节数不小于37。模块序列号分为5个部分,格式为『2字符.2字符-8字符-10字符-10字符』,共36个字符;
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 协议包读写错误 |
-1 | 通讯失败 |
-3 | 接收错误协议包 |
-4 | 读取包错误(base64串口设备) |
-5,-6,-8 | 读取超时 |
4.2.6. 判断身份证是否在设备上
原 型:int CardOn ( void);
说 明:本函数用于用于判断身份证是否在机具上。
注 意:只能用于读卡之后判断卡是否离开,在找卡、选卡、读卡过程中不要使用本函数,会导致读卡失败!
参 数: 无
返 回 值:
值 | 意义 |
1 | 有身份证 |
0 | 无身份证 |
4.2.7. 判断设备是否支持指纹信息读取
原 型:int IsFingerPrintDevice(void);
说 明:本函数用于判断iDR210是否支持指纹信息读取。
参 数:无
注 意:使用前需要先端口初始化InitComm。
返 回 值:
值 | 意义 |
1 | 支持 |
-1 | 设备不支持 |
-2 | 模块不支持 |
4.2.8. 读指纹及卡信息接口
原 型:int ReadBaseFPMsg( unsigned char * pMsg, int * len ,unsigned char * pucFPMsg,unsigned int *puiFPMsgLen);
说 明:本函数用于读取指纹信息及卡中基本信息,包括文字信息与图像信息。文字信息已经分段解析,输出格式为单字节,且每一字段信息已经被表示为字符串。图象信息被解码后存为文件photo.bmp(在当前工作目录下)。
参 数:
pMsg [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于192。函数调用成功后,各字段的文本信息已经转换为单字节形式,并表示为字符串格式。字段意义及偏移值如下所示:
项目 | 长度(字节) | 说明 |
姓名 | 31 | 汉字 |
性别 | 3 | 汉字 |
民族 | 10 | 汉字 |
出生日期 | 9 | CCYYMMDD |
住址 | 71 | 汉字和数字 |
公民身份号码 | 19 | 数字 |
签发机关 | 31 | 汉字 |
有效期起始日期 | 9 | CCYYMMDD |
有效期截止日期 | 9 | CCYYMMDD 有效期为长期的表示为汉字“长期” |
Len [out] 整数, 返回总字符长度,可以给空值(NULL)。
pucFPMsg [out] 无符号字符指针,指向读到的指纹信息。需要在调用时分配内存,字节数不小于1024。
puiFPMsgLen [out] 整数, 返回指纹信息长度。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
4.3. Type A卡相关函数
注意:串口型iDR200和iDR210支持读写Type A卡。
iDR210使用Routon开头的相关函数。
串口型iDR200使用dc_开头的相关函数。
4.3.1. 找IC卡
原 型:int Routon_IC_FindCard();
说 明:本函数用于寻卡。
参 数: 无。
返 回 值:
值 | 意义 |
1 | M1-S50卡 |
2 | CPU卡 |
3 | M1-S70卡 |
4 | Mifare UltraLight卡 |
0 | 未找到卡 |
其他 | 不明卡错误码 |
4.3.2. 读IC卡序列号高级函数
原 型:int Routon_IC_HL_ReadCardSN(char * SN);
说 明:本函数用于读取IC卡的序列号,自动完成找卡、选卡等过程。
参 数: SN [out] 字符指针,需要在调用时分配内存,字节数不小于16。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
4.3.3. 读IC卡区块高级函数
原 型:
int Routon_IC_HL_ReadCard (int SID,int BID,
int KeyType,unsigned char * Key,
unsigned char * data);
说 明:本函数用于读取IC卡指定扇区的数据内容,在调用本函数前需要先找卡Routon_IC_FindCard()。
参 数:
SID为扇区号,0-15之间(对M1S50卡)。
BID为块号,0-3之间。
KeyType为密钥类型,两种:0x60 keyA,0x61 keyB。
Key为密钥。
data为读取到的数据内容,需要在调用时分配内存,字节数不小于16。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 读卡错误 |
-1 | 参数错误 |
-3 | 密钥或卡类型错 |
备注:如果为Mifare UltraLight卡,参数SID,KeyType,Key可为0或空值,只需传入BID即可。
4.3.4. 写IC卡区块高级函数
原 型:
int Routon_IC_HL_WriteCard (int SID,int BID,
int KeyType,unsigned char * Key,
unsigned char * data);
说 明:本函数用于向IC卡指定扇区写入数据内容,在调用本函数前需要先找卡Routon_IC_FindCard()。
参 数:
SID为扇区号,0-15之间(对M1S50卡)。
BID为块号,0-3之间。
KeyType为密钥类型,两种:0x60 keyA,0x61 keyB。
Key为密钥。
data为准备写入的数据内容,字节数为16。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
-3 | 密钥或卡类型错 |
备注:如果为Mifare UltraLight卡,参数SID,KeyType,Key可为0或空值,只需传入BID与data即可。
4.3.5. 控制蜂鸣器和指示灯
原 型1:
int HID_BeepLED(bool BeepON,bool LEDON,unsigned int duration);
说 明:本函数用于控制iDR210 USB-HID 设备的LED指示灯和蜂鸣器。
参 数:
BeepON和LEDON为布尔类型,值为True时,对应的蜂鸣器和指示灯打开;duration为打开持续的时间,单位为毫秒。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
原 型2:
int Routon_BeepLED(bool BeepON,bool LEDON,unsigned int duration);
说 明:本函数用于控制iDR200 串口型设备LED指示灯和蜂鸣器。
参 数:
BeepON和LEDON为布尔类型,值为True时,对应的蜂鸣器和指示灯打开;duration为打开持续的时间,单位为毫秒。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
4.3.6. 读取PSAM卡ATR数据
原 型:
int PSAM_ReadATR(unsigned char CardIndex,unsigned char SpeedIndex,unsigned char TypeIndex, unsigned char *_Data);
说 明:本函数用于读取设备上PSAM卡的ATR数据
参 数:
CardIndex: 0x01为卡座1, 0x02为卡座2
SpeedIndex: CPU卡的速率 (0:4800,1:9600,2:19200,3:38400)
TypeIndex: CPU卡电压类型(0:5V,1:3V)
*_Data: 读出数据缓存区指针
返 回 值:
值 | 意义 |
0 | 正确 |
-1 | 未插卡 |
-2 | 设置卡座错误 |
-3 | 设置速率错误 |
-4 | 设置电压错误 |
-5 | 设备未连接 |
4.3.7. 向PSAM卡发送数据
原 型:
int PSAM_SendCMD(unsigned char CardIndex,unsigned char *_Cmd,int Len, unsigned char *_Data)
说 明:本函数用于向PSAM卡发送数据
参 数:
CardIndex:0x01为卡座1, 0x02为卡座2
*_Cmd:向PSAM卡发送命令数据缓冲区指针
Len:命令的长度
*_Data:PSAM卡返回数据缓存区指针
返 回 值:
值 | 意义 |
0 | 正确 |
-1 | 未知错误 |
-2 | 设置卡座错误 |
-3 | 设备未连接 |
4.3.8. PSAM卡下电
原 型:
int STDCALL PSAM_PowerOff(unsigned char CardIndex)
说 明:本函数用于断开PSAM卡电源,降低功耗
参 数:
CardIndex:0x01为卡座1, 0x02为卡座2
返 回 值:
值 | 意义 |
0 | 正确 |
-1 | 未知错误 |
-2 | 设置卡座错误 |
-3 | 设备未连接 |
4.3.9. dc_init
注意:仅串口型iDR200可使用本接口,iDR210使用InitComm()进行端口初始化。
原 型:int dc_init(int port,long baud);
说 明:初始化通讯口。
参 数:
port:取值为1~16。
baud:为通讯波特率9600~115200。
返 回 值:成功则返回串口通讯设备标识符>0,失败返回负值。
4.3.10. dc_exit
注意:仅串口型iDR200可使用本接口,iDR210使用CloseComm()关闭端口。
原 型:int dc_exit(int dev);
说 明:关闭端口。
参 数:
icdev:通讯设备标识符。
返 回 值:成功返回0,失败返回负值。
4.3.11. dc_request
原 型:int dc_request(int icdev,unsigned char _Mode,unsigned int *TagType);
说 明:寻卡请求。
参 数:
icdev:通讯设备标识符。
_Mode:寻卡模式。0表示Standard模式;1表示All模式。
Tagtype:卡类型值。
返 回 值:成功返回0,失败返回负值。
4.3.12. dc_anticoll
原 型:int dc_anticoll(int icdev,unsigned char _Bcnt,unsigned long *_Snr);
说 明:防卡冲突,返回卡的序列号。
参 数:
icdev:通讯设备标识符。
_Bcn: 设为0。
_Snr:返回的卡序列号地址。
返 回 值:成功返回0,失败返回负值。
4.3.13. dc_select
原 型:int dc_select(int icdev,unsigned long _Snr,unsigned char *_Size);
说 明:从多个卡中选取一个给定序列号的卡。
参 数:
icdev:通讯设备标识符。
_Snr:卡序列号。
_Size:指向返回的卡容量的数据(暂不支持,无返回)。
返 回 值:成功返回0,失败返回负值。
4.3.14. dc_authentication_passaddr
原 型:int dc_authentication_passaddr(int icdev, unsigned char _Mode, unsigned char Addr, unsigned char *passbuff);
说 明:核对密码函数。
参 数:
Icdev:通讯设备标识符。
_Mode:密码验证模式。0x60 keyA,0x61 keyB。
blockAddr:要验证密码的块地址号。
passbuff:密码字符串。
返 回 值:成功返回0,失败返回负值。
4.3.15. dc_read
原 型:dc_read(int icdev,unsigned char _Adr,unsigned char *_Data);
说 明:读取卡中数据。
参 数:
icdev:通讯设备标识符。
_Adr:M1S50卡——块地址(0~63),M1S70(0~255)。
_Data:读出数据。
返 回 值:成功返回0,失败返回负值。
4.3.16. dc_write
原 型:dc_write(int icdev,unsigned char _Adr,unsigned char *_Data);
说 明:向卡中写入数据。
参 数:
icdev:通讯设备标识符。
_Adr:M1S50卡——块地址(1~63),M1S70(1~255)。
_Data:要写入的数据。
返 回 值:成功返回0,失败返回负值。
4.3.17. dc_halt
原 型:dc_halt(int icdev);
说 明:中止对该卡操作。
参 数:
icdev:通讯设备标识符。
返 回 值:成功返回0,失败返回负值。
4.3.18. dc_BeepLED
原 型:dc_BeepLED(int icdev,bool BeepON,bool LEDON,unsigned int duration);
说 明:控制LED指示灯和蜂鸣器。
参 数:
icdev:通讯设备标识符。
BeepON:值为true时,蜂鸣器打开。
LEDON:值为true时,指示灯打开。
duration为持续的时间,单位为毫秒。
返 回 值:成功返回0,失败返回负值。
4.3.19. Routon_CPUCard_PowerOFF
原 型:Routon_CPUCard_PowerOFF(void);
说 明:CPU卡下电。
参 数: 无
返 回 值:成功返回1,失败返回0。
4.3.20. Routon_CPUCard_Active
原 型:Routon_CPUCard_Active(void);
说 明:CPU卡激活。
参 数: 无
返 回 值:成功返回1,失败返回0。
4.3.21. Routon_CPUCard_ATS
原 型:Routon_CPUCard_ATS(unsigned char * ATSMsg,
unsigned int * ATSLen);
说 明:CPU卡发送RATS,返回ATS数据。
参 数:
ATSMsg ATS数据
ATSLen ATS数据长度
返 回 值:成功返回1,失败返回0。
4.3.22. Routon_CPUCard_PPS
原 型:Routon_CPUCard_PPS(unsigned char PPS0,unsigned char PPS1);
说 明:CPU卡发送PPS参数。
参 数:
PPS0 PPS0值
PPS1 PPS1值
返 回 值:成功返回1,失败返回0。
4.3.23. Routon_APDU
原 型:Routon_APDU (char * apdu,unsigned char * data,int * datalen)说 明:向CPU卡发送APDU,并获取返回数据。
参 数:
apdu APDU指令,为字符串数据
data APDU指令的返回数据,字节数据
datalen APDU指令返回数据长度
返 回 值:
值 | 意义 |
0 | 失败 |
1 | 成功 |
-1 | APDU指令超长(超过251字节) |
-2 | 通讯错误 |
-3 | 不支持端口协议 |
4.3.24. Routon_ ShutDownAntenna
原 型: Routon_ ShutDownAntenna (void)
说 明:关闭天线。
参 数:
无
返 回 值:
值 | 意义 |
0 | 失败 |
1 | 成功 |
4.3.25. Routon_Mute(bool isMute)
原 型: Routon_Mute(bool isMute)
说 明:蜂鸣器开关。
参 数:
isMute true为关闭,false为打开
返 回 值:
值 | 意义 |
0 | 失败 |
1 | 成功 |
4.3.26. Routon_RepeatRead(bool isRepeat)
原 型: Routon_RepeatRead(bool isRepeat)
说 明:设置是否可以重复读一张身份证,默认是不重复读。
参 数:
isRepeat true为可重复读,false为只能读一次
返 回 值:
值 | 意义 |
0 | 失败 |
1 | 成功 |
4.3.27. Routon_IsSaveWlt(bool isWlt)
原 型: Routon_IsSaveWlt(bool isWlt)
说 明:设置是否保存wlt文件,默认不保存。
备注:在调用读取身份证信息接口之前调用该接口
参 数:
isWlt true保存wlt文件,false为不保存
返 回 值:
值 | 意义 |
0 | 失败 |
1 | 成功 |
4.3.28. ReadBaseInfosFPPhoto(char* Name, char* Gender, char* Folk, char* BirthDay, char * Code, char* Address, char* Agency, char* ExpireStart, char* ExpireEnd, char* directory, unsigned char * pucFPMsg, unsigned int * puiFPMsgLen)
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息以字符串格式输出。图象信息被解码后存为照片photo.bmp和photo.jpg,身份证正面反面图片(在directory指定目录下)。
参 数:
Name [out] 字符型指针,指向姓名信息。需要在调用时分配内存,字节数不小31。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
Folk [out] 字符型指针,指向民族信息。需要在调用时分配内存,字节数不小10。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小19。
Address [out] 字符型指针,指向地址信息。需要在调用时分配内存,字节数不小71。
Agency [out] 字符型指针,指向签证机关信息。需要在调用时分配内存,字节数不小31。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(NULL),表示照片存储在当前目录中,此时函数效果同ReadBaseInfos。
pucFPMsg [out] 无符号字符指针,指向读到的指纹信息。需要在调用时分配内存,字节数不小于1024。
puiFPMsgLen [out] 整数, 返回指纹信息长度。
返 回 值:
值 | 意义 |
1 | 正确 |
0 | 错误 |
4 | 目录不存在 |
-4 | 缺少dewlt.dll、savephoto.dll等DLL |
4.3.29. Routon_DecideIDCardType()
说 明:本函数用户判断当前证件类型是身份证,还是外国人居留证。注意,该函数需在调用Authenticate函数后再调用。
返 回 值:
值 | 意义 |
100 | 中国身份证 |
101 | 外国人居留证 |
其它 | 其它错误 |
4.3.30. Routon_ReadForeignBaseInfos (char *enName, char *Gender, char *Code, char *Nation, char *cnName, char *BirthDay, char * ExpireStart,char* ExpireEnd)
废弃,请使用接口Routon_ReadAllForeignBaseInfos
说 明:本函数用来读取外国人居留证相关信息内容,照片文件保存在当前stdapi.dll文件相同目录中,照片文件名为photo.bmp。
参 数:
enName [out] 字符型指针,指向英文姓名信息。需要在调用时分配内存,字节数不小121。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小31。
Nation [out] 字符型指针,指向国籍信息。需要在调用时分配内存,字节数不小40。
cnName [out] 字符型指针,指向中文姓名信息。需要在调用时分配内存,字节数不小31。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调
用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
返 回 值:
值 | 意义 |
0 | 读取卡信息失败 |
1 | 读取卡信息成功 |
4.3.31. Routon_ReadForeignBaseInfosPhoto (char*enName, char *Gender, char *Code, char *Nation, char *cnName, char *BirthDay, char * ExpireStart,char* ExpireEnd,char* directory)
废弃,请使用接口Routon_ReadAllForeignBaseInfosPhoto
说 明:本函数用来读取外国人居留证相关信息内容,照片文件保存在当前stdapi.dll文件相同目录中,照片文件名为photo.bmp。(
参 数:
enName [out] 字符型指针,指向英文姓名信息。需要在调用时分配内存,字节数不小121。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小31。
Nation [out] 字符型指针,指向国籍信息。需要在调用时分配内存,字节数不小40。
cnName [out] 字符型指针,指向中文姓名信息。需要在调用时分配内存,字节数不小31。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调
用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(NULL),表示照片存储在当前目录中,此时函数效果同Routon_ReadForeignBaseInfos。
返 回 值:
值 | 意义 |
0 | 读取卡信息失败 |
1 | 读取卡信息成功 |
4.3.32. Routon_ReadAllForeignBaseInfos (char*EnName, char *Gender, char *Code, char *Nation, char *CnName, char *BirthDay, char * ExpireStart,char* ExpireEnd,char* CardVertion,char *Agency,char *CardType, char *FutureItem)
说 明:本函数用来读取外国人居留证所有信息内容,头像照片文件保存在当前stdapi.dll文件相同目录中,照片文件名为photo.bmp。
参 数:
EnName [out] 字符型指针,指向英文姓名信息。需要在调用时分配内存,字节数不小121。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小31。
Nation [out] 字符型指针,指向国籍信息。需要在调用时分配内存,字节数不小40。
CnName [out] 字符型指针,指向中文姓名信息。需要在调用时分配内存,字节数不小31。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调
用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
CardVertion [out] 字符型指针,指向证件版本号信息。需要在调用时分配内存,字节数不小于5。
Agency [out] 字符型指针,指向当次申请受理机关代码信息。需要在调用时分配内存,字节数不小于9。
CardType [out] 字符型指针,指向证件类型标识。需要在调用时分配内存,字节数不小于2。外国人永久居留证的标识为大写字母“I”。
FutureItem [out] 字符型指针,指向预留项信息。需要在调用时分配内存,自己数不小于7。目前存放了三个空格符。
返 回 值:
值 | 意义 |
0 | 读取卡信息失败 |
1 | 读取卡信息成功 |
4.3.33. Routon_ReadAllForeignBaseInfosPhoto (char*EnName, char *Gender, char *Code, char *Nation, char *CnName, char *BirthDay, char * ExpireStart,char* ExpireEnd,char* CardVertion,char *Agency,char *CardType, char *FutureItem,char *Directory)
说 明:本函数用来读取外国人居留证所有信息内容,照片文件保存在当前stdapi.dll文件相同目录中,照片文件名为photo.bmp。
参 数:
EnName [out] 字符型指针,指向英文姓名信息。需要在调用时分配内存,字节数不小121。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小31。
Nation [out] 字符型指针,指向国籍信息。需要在调用时分配内存,字节数不小40。
CnName [out] 字符型指针,指向中文姓名信息。需要在调用时分配内存,字节数不小31。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调
用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
CardVertion [out] 字符型指针,指向证件版本号信息。需要在调用时分配内存,字节数不小于5。
Agency [out] 字符型指针,指向当次申请受理机关代码信息。需要在调用时分配内存,字节数不小于9。
CardType [out] 字符型指针,指向证件类型标识。需要在调用时分配内存,字节数不小于2。外国人永久居留证的标识为大写字母“I”。
FutureItem [out] 字符型指针,指向预留项信息。需要在调用时分配内存,自己数不小于7。目前存放了三个空格符。
Directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(“”),表示照片存储在当前用户的临时目录中,此时函数效果同Routon_ReadForeignBaseInfos。
返 回 值:
值 | 意义 |
0 | 读取卡信息失败 |
1 | 读取卡信息成功 |
4.3.34. FindAllUSB(int *SCount, int *HCount)
说 明:本函数用于“部标”设备和HID设备同时连接PC时,获取当前PC连接的读卡设备的情况,能够识别是否有“部标”设备,有几台HID设备。
备 注:仅针对USB接口的“部标”设备和HID设备。
参 数:
SCount[out]整型指针,指向当前PC连接“部标”设备数量。需要在调用时分配内存,字节数为1。SCount[0]值为0表示无“部标”设备,1表示有“部标”设备。
HCount[out]整型指针,指向当前PC连接HID设备数量。需要在调用时分配内存,字节数为1。HCount[0]值为0表示无HID设备,1表示有一台HID设备,2表示有两台HID设备。
返 回 值:
值 | 意义 |
1 | 寻找USB设备成功 |
其他 | 寻找USB设备失败 |
4.3.35. SelectUSB(int index)
说 明:根据用户选择的“部标”设备和HID设备,初始化相应的设备端口。
备 注:仅针对USB接口的“部标”设备和HID设备,调用之前必须先先FindAllUSB()函数寻找USB接口设备。
参 数:
index整数,表示“部标”设备和HID设备。0代表“部标”设备,1代表HID1,2代表HID2。
返 回 值:
值 | 意义 |
1 | 初始化指定设备端口成功 |
0 | 初始化指定设备端口失败 |
4.3.36. CloseSDTandHIDComm(int index)
说 明:根据打开的“部标”设备和HID设备的端口,关闭相应的端口。
备 注:仅针对USB接口的“部标”设备和HID设备。
参 数:
index整数,表示“部标”设备和HID设备。0代表“部标”设备,1代表HID1,2代表HID2。
返 回 值:
值 | 意义 |
1 | 关闭指定设备端口成功 |
0 | 关闭指定设备端口失败 |
4.3.37. InitSDTandHIDComm(int index)
说 明:寻找当前PC连接的USB接口设备,根据用户选择的“部标”设备和HID设备,初始化相应的设备端口。
备 注:仅针对USB接口的“部标”设备和HID设备。该接口包含了FindAllUSB()和SelectUSB()的功能。
参 数:
index整数,表示“部标”设备和HID设备。0代表“部标”设备,1代表HID1,2代表HID2。
返 回 值:
值 | 意义 |
1 | 初始化指定设备端口成功 |
0 | 初始化指定设备端口失败 |
4.3.38. Routon_ReadAllTypeCardInfos(int port, char* pMsg, char *PhotoPath)
说 明:读身份证或者外国人居留证
参 数:
port 整数,表示设备的端口号或者串口号。
pMsg [out] 字符型指针,指向卡片的基本信息,在调用时分配内存,内存不小于265字节。
Photopath [in] 字符指针,表示头像照片存储路径,路径最后有无“\”均可;若不指定头像相片路径PhotoPath,则传入NULL或者“”,照片存在当前程序目录中;若指定头像照片路径PhotoPath,则传入不包含文件名的目录,如“d:\\temp”。
返 回 值:
返回值 | 含义 |
1 | 卡片类型身份证 |
2 | 卡片类型外国人居留证 |
-1 | 文本信息指针为空,或指定照片路径不存在 |
-2 | 端口打开失败 |
-3 | 卡认证失败 |
-4 | 读卡失败 |
-5 | 头像照片生成失败 |
备 注:卡基本信息返回值pMsg格式
身份证:姓名|性别|民族|出生年月日|住址|公民身份号码|签发机关|有效期限起始日期|有效期限结束日期|有效期限
外国证: 英文姓名|中文姓名|性别|国籍或地区代号|出生年月日|永久居住证号码|签发机关|有效期限起始日期|有效期限结束日期|有效期限
5. 接口使用流程及示例
在连接好读卡机具以后,首先需要调用函数InitComm打开相应端口。打开端口成功以后,即可以使用循环认证并读取卡中信息。
5.1. 二代证示例
示 例:
#include “sdtapi.h”
int main()
{
int ret;
int iPort=1;
ret=InitComm(iPort);
if ( ret ){
ret= Authenticate ();
if (ret){
char Msg[200];
ret= ReadBaseMsg (Msg, 0 );
if (ret > 0 ){
//显示文字及图片信息
}
char Msg1[200];
int num;
ret= ReadNewAppMsg (Msg1, &num );
if (ret > 0 ){
//显示追加地址信息
}
}
}
ret= CloseComm();
return ret;
}
5.2. TypeA卡示例(iDR210)
示 例:
#include “sdtapi.h”
int main()
{
int ret;
int dev;
ret =InitComm (1001);//USB接口的iDR210
if (ret)
{
char csn[1024]={0};
if (Routon_IC_HL_ReadCardSN(csn))//读A卡卡号
{
//
}
else
{
MessageBox( NULL, "Routon_IC_HL_ReadCardSN error。",
"错误", MB_OK | MB_ICONERROR );
return;
}
ret=Routon_IC_FindCard();
if (ret)
{
int sid=0,bid=0;
unsigned char da[64]={0};
unsigned char pw[6]={0xff,0xff,0xff,0xff,0xff,0xff};
ret=Routon_IC_HL_ReadCard (sid,bid,0x60,pw,da);//读0扇区0块的内容
}
}
CloseComm();
}
5.3. 读取指纹及身份证信息示例(iDR210)
ret = InitComm(1001);
if ( ret ){
ret=IsFingerPrintDevice();
if (ret!=1)
{
sprintf(msg,"设备不支持读取指纹信息!返回值=%d",ret);
MessageBox(msg,"提示");
return ;
}
ret= Authenticate ();
if (ret){
/*unsigned char unCHMsg[256];
unsigned char ucFPMsg[1024];
int uiFPMsgLen,uiCHMsgLen;
ret = ReadBaseFPMsg(unCHMsg, &uiCHMsgLen,ucFPMsg, &uiFPMsgLen);*/
char name[32]={0};
char Gender[4]={0};
char Folk[4]={0};
char BirthDay[9]={0};
char Code[19]={0};
char Address[71]={0};
char Agency[31]={0};
char ExpireStart[9]={0};
char ExpireEnd[9]={0};
char pucFPMsg[1024]={0};
unsigned int puiFPMsgLen=0;
ret = ReadBaseInfosFPPhoto(name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd,“C:\\”, pucFPMsg, &puiFPMsgLen);
if (ret!=1)
{
sprintf(msg,"读指纹信息失败!返回值=%d",ret);
MessageBox(msg,"提示");
return ;
}
if (uiFPMsgLen<1024)
{
sprintf(msg,"无指纹信息!");
MessageBox(msg,"提示");
}
…
//此处处理指纹及身份证信息
}
}
CloseComm();
5.4. CPU卡操作示例(iDR210)
unsigned char data[1024];
memset(data,0,1024);
int datalen=0;
ret = InitComm(1);//串口1
if ( ret ){
ret=Routon_IC_FindCard();
if (ret!=2)//类型2为CPU卡
{
sprintf(msg,"不是CPU卡!返回值=%d",ret);
MessageBox(msg,"提示");
return ;
}
char apdu[]=” 00A404000E315041592E5359532E4444463031”;
ret=Routon_CPUCard_Active();
if (ret==1){ //激活成功
ret=Routon_APDU(apdu,data,&datalen);//data为16进制值
}
}
CloseComm();
5.5. 外国人居留证操作示例(iDR200/iDR210)
#include “sdtapi.h”
int main()
{
int ret;
int dev;
ret =InitComm (1001);//USB接口, 1-16则为串口号
if ( ret )
{
ret= Authenticate ();
if (ret){
ret= Routon_DecideIDCardType()
if (ret == 100 ){ //身份证卡
//读取身份证信息
ret = ReadBaseInfos(Name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd);
}
else if(ret == 101){ //外国人居留证
//读取外国居留证
ret = Routon_ReadAllForeignBaseInfos(enName, Gender, Code,
Nation, cnName, BirthDay, ExpireStart, ExpireEnd,CardVertion,Agency,CardType,FutureItem);
}
}
}
CloseComm();
return 0;
}
5.6. “部标”设备和HID设备同时连接PC,读卡示例(iDR210)
#include “sdtapi.h”
int main()
{
int ret;
int index;//输入的USB设备索引号,“0”部标设备,“1”HID1,“2”HID2
int SDTCount[1];//当前PC连接的部标设备数量
int HIDCount[1];//当前PC连接的HID设备数量
FindAllUSB(SDTCount, HIDCount);
ret=SelectUSB(index);
if ( ret )
{
ret= Authenticate ();
if (ret){
ret= Routon_DecideIDCardType();
if (ret == 100 ){ //身份证卡
//读取身份证信息
ret = ReadBaseInfos(Name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd);
}
else if(ret == 101){ //外国人居留证
//读取外国居留证
ret = Routon_ReadForeignBaseInfosPhoto(enName, Gender, Code, Nation, cnName, BirthDay, ExpireStart, ExpireEnd);
}
}
}
CloseSDTandHIDComm(index);
}
5.7. 外国证居留证生成正反面照片操作示例(iDR210)
#include “sdtapi.h”
int main()
{
int ret;
int dev;
ret =InitComm (1001);//USB接口, 1-16则为串口号
if ( ret )
{
ret= Authenticate ();
if (ret){
ret= Routon_DecideIDCardType()
if (ret == 100 ){ //身份证卡
//读取身份证信息
ret = ReadBaseInfosPhoto(Name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd, "D:\\IDtemp");
}
else if(ret == 101){ //外国人居留证
//读取外国居留证
ret = Routon_ReadForeignBaseInfosPhoto(enName, Gender, Code, Nation, cnName, BirthDay, ExpireStart, ExpireEnd, "D:\\FIDtemp");
}
}
}
CloseComm();
return 0;
}