精伦iDR210/iDR200最新开发包-通用二次开发包V4.2.2.8_通用_20221021
精伦iDR210/iDR200最新开发包-通用二次开发包V4.2.2.8_通用_20221021
精 伦 电 子 股 份 有 限 公 司
iDR210/iDR200联机型身份证阅读器
通用二次开发包接口说明
更新说明:
V4.2.2.6 新增双通道通信接口
V4.2.2.4 新增项目认证码绑定
V4.2.2.3 新增接口返回照片base64文本信息
V4.2.2.2 新增港澳台证正反面接口
V4.2.1.9 增加eID相关的读卡接口
V4.2.0.9 增加对外国居留证卡的信息读取接口功能。
V4.2.0.0 增加对Mifare UltraLight卡的支持。
V4.1.0.4 增加身份证正反面合成功能。
V4.0.1.10解决CPU卡发送超过58字节数据问题,需要iDR210-1 HID(ERP号后五位为13003)读卡器单片机软件版本升级为V20.0.3以上才能支持。
V4.0.1.5增加对护照读卡器的支持。
V4.0.1.2增加Routon_RepeatRead函数,可控制是否连续读身份证。
V4.0.1.0增加对M1- S70卡支持。
V4.0.0.7读身份证信息前的容错处理。
V4.0.0.5增加对CCID接口的210-P护照读卡器支持。增加Routon_Mute函数,在读卡前调用,可控制蜂鸣不发声。
V3.5.1.8解决照片解码相关的一个可能问题。
V3.5.1.7解决ReadBaseInfos和ReadBaseInfosPhoto的输出图片受到系统当前目录设定干扰的问题。
V3.5.1.5 解决一个潜在造成内存泄漏的问题。
V3.5.1.3 去掉原sdtapi.dll对jpgdll.dll的依赖。
V3.5.1.0 解决接入部标版时,有时无法找到身份证的问题。
V3.5.0.4 增加GetHIDCount、HIDSelect接口,可控制一台PC上分别读取多台HID 接口的iDR210 。
V3.5.0.3 增加Routon_ ShutDownAntenna接口,关闭天线。
V3.5 增加Routon_CPUCard_PowerOFF、Routon_CPUCard_Active、Routon_CPUCard_RATS、Routon_CPUCard_PPS等接口,支持CPU卡。
V3.4 增加指纹信息读取接口ReadBaseFPMsg,建议在读取指纹信息前,先判断当前设备是否支持指纹信息读取IsFingerPrintDevice,调用细节请参考示例。
目录
目录 - 3 -
1. 概述 - 6 -
2. 系统要求 - 6 -
3. 接口文件说明 - 7 -
4. Sdtapi.ll接口函数说明 - 7 -
4.1. 端口函数 - 7 -
4.1.1. 端口初始化函数 - 7 -
4.1.2. 端口关闭接口 - 8 -
4.1.3. 关闭天线接口 - 8 -
4.1.4. 获取当前接入的HID接口iDR210数量 - 9 -
4.1.5. 设定当前操作的HID接口iDR210 - 9 -
4.2. 读二代证相关函数 - 9 -
4.2.1. 卡认证接口 - 9 -
4.2.2. 读卡信息接口 - 10 -
4.2.3. 读追加地址信息 - 15 -
4.2.4. 读卡体管理号 - 17 -
4.2.5. 读模块序列号 - 18 -
4.2.6. 判断身份证是否在设备上 - 18 -
4.2.7. 判断设备是否支持指纹信息读取 - 19 -
4.2.8. 读指纹及卡信息接口 - 19 -
4.2.9. 读证件信息,照片保存为Base64 - 20 -
4.2.10. 项目认证码绑定设备 - 21 -
4.2.11. 获取设备项目认证码 - 22 -
4.2.12. 检验设备项目标识是否匹配 - 22 -
4.2.13. 设置读卡双通道 - 23 -
4.2.14. 双通道之从通道接收信息 - 23 -
4.3. Type A卡相关函数 - 24 -
4.3.1. 找IC卡 - 24 -
4.3.2. 读IC卡序列号高级函数 - 24 -
4.3.3. 读IC卡区块高级函数 - 25 -
4.3.4. 写IC卡区块高级函数 - 25 -
4.3.5. 控制蜂鸣器和指示灯 - 26 -
4.3.6. 读取PSAM卡ATR数据 - 27 -
4.3.7. 向PSAM卡发送数据 - 28 -
4.3.8. PSAM卡下电 - 28 -
4.3.9. dc_init - 29 -
4.3.10. dc_exit - 29 -
4.3.11. dc_request - 29 -
4.3.12. dc_anticoll - 30 -
4.3.13. dc_select - 30 -
4.3.14. dc_authentication_passaddr - 30 -
4.3.15. dc_read - 31 -
4.3.16. dc_write - 31 -
4.3.17. dc_halt - 31 -
4.3.18. dc_BeepLED - 31 -
4.3.19. Routon_CPUCard_PowerOFF - 32 -
4.3.20. Routon_CPUCard_Active - 32 -
4.3.21. Routon_CPUCard_ATS - 32 -
4.3.22. Routon_CPUCard_PPS - 33 -
4.3.23. Routon_APDU - 33 -
4.3.24. Routon_ ShutDownAntenna - 33 -
4.3.25. Routon_Mute(bool isMute) - 34 -
4.3.26. Routon_RepeatRead(bool isRepeat) - 34 -
4.3.27. Routon_IsSaveWlt(bool isWlt) - 35 -
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) - 35 -
4.3.29. Routon_DecideIDCardType() - 36 -
4.3.30. Routon_ReadForeignBaseInfos (char *enName, char *Gender, char *Code, char *Nation, char *cnName, char *BirthDay, char * ExpireStart,char* ExpireEnd) - 37 -
4.3.31. Routon_ReadForeignBaseInfosPhoto (char*enName, char *Gender, char *Code, char *Nation, char *cnName, char *BirthDay, char * ExpireStart,char* ExpireEnd,char* directory) - 38 -
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) - 39 -
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) - 40 -
4.3.34. Routon_ReadAllGATBaseInfos (char*Name, char *Gender,char *FutureItem1, char* BirthDay,char *Address, char *Code, char *Agency, char * ExpireStart,char* ExpireEnd,char *PassID,char *SignCnt, char *FutureItem2,char *CardType,char *FutureItem3) - 42 -
4.3.35. Routon_ReadAllGATBaseInfosPhoto (char*Name, char *Gender,char *FutureItem1, char* BirthDay,char *Address, char *Code, char *Agency, char * ExpireStart,char* ExpireEnd,char *PassID,char *SignCnt, char *FutureItem2,char *CardType,char *FutureItem3,char *Directory) - 43 -
4.3.36. FindAllUSB(int *SCount, int *HCount) - 44 -
4.3.37. SelectUSB(int index) - 45 -
4.3.38. CloseSDTandHIDComm(int index) - 45 -
4.3.39. InitSDTandHIDComm(int index) - 46 -
4.3.40. Routon_ReadAllTypeCardInfos(int port, char* pMsg, char *PhotoPath) - 46 -
4.4. eID卡相关函数 - 47 -
4.4.1 eID_Authenticate() - 47 -
4.4.2读eID卡原始信息 - 48 -
4.4.3 读eID基本信息 - 49 -
5. 接口使用流程及示例 - 50 -
5.1. 二代证示例 - 50 -
5.2. TypeA卡示例(iDR210) - 51 -
5.3. 读取指纹及身份证信息示例(iDR210) - 52 -
5.4. CPU卡操作示例(iDR210) - 54 -
5.5. 外国人居留证操作示例(iDR200/iDR210) - 54 -
5.6. “部标”设备和HID设备同时连接PC,读卡示例(iDR210) - 55 -
5.7. 外国证居留证生成正反面照片操作示例(iDR210) - 56 -
5.8. eID读卡示例 - 57 -
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机,必须满足下列条件:
Windows 98、Windows 2000 Pro、Windows 2000 Server、
Windows XP。
至少32兆内存(32M RAM or Larger)。
至少10兆空闲硬盘空间(10M Free Hard Disk Space or Larger)。
至少一个空闲普通串口或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.2.9.读证件信息,照片保存为Base64
原 型:int Routon_ReadAllBaseInfos( char* Msg, char* HeadPhoto, char* FrontCopy, char* BackCopy, char* FingerPrint)
;
说 明:本函数用于读取证件中的信息,包括文字信息与图像信息、指纹信息以及合成仿复印件图片信息。文字信息已经分段解析,输出格式为字段以“:”隔开,且所有信息为字符串。图象信息被解码后以Base64编码存储。
参 数:
Msg [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于256。函数调用成功后,各字段的文本信息已经转换为单字节形式,每个字段以“:”隔开。字段意义如下所示:
序号 信息项 二代证 外国人 港澳台
0 证件类型 A I J
1 中文姓名 姓名 中文姓名 姓名
2 英文姓名 英文姓名
3 性别 性别 性别 性别
4 性别代码 性别代码 性别代码 性别代码
5 民族 民族 国籍或所在地区
6 民族代码 民族代码 国籍或所在地区代码 通行证号码
7 出生日期 出生日期 出生日期 出生日期
8 住址 住址 住址
9 身份证号码 公民身份号码 永久居留证号码 公民身份号码
10 签发机关 签发机关 当次申请受理机关代码 签发机关
11 发卡日期 有效期
起始日期 证件签发日期 有效期
起始日期
12 卡有效期 有效期
截止日期 证件终止日期 有效期
截止日期
13 证件版本号 证件版本号 签发次数
HeadPhoto [out] 无符号字符指针,指向解码后的bmp照片信息,信息经过base64编码。需要在调用时分配内存,字节数不小于100k。
FrontCopy [out] 无符号字符指针,指向正面仿复印件jpg照片信息,信息经过base64编码。需要在调用时分配内存,字节数不小于200k。
BackCopy [out] 无符号字符指针,指向反面仿复印件jpg照片信息,信息经过base64编码。需要在调用时分配内存,字节数不小于200k。
FingerPrint [out] 无符号字符指针,指向读到的指纹原始信息。需要在调用时分配内存,字节数不小于1024。
4.2.10.项目认证码绑定设备
原 型:int Routon_SetProgramCode(char* ProgramCode);
说 明:用于客户用项目码绑定设备。
参 数:ProgramCode [in] 8字节的客户项目码。
返 回 值:
值 意义
1 成功
0 参数错误
-1 非HID设备,不支持该功能
-2 读设备信息错误
-3 写数据错误
-4 设备不支持
4.2.11.获取设备项目认证码
原 型:int Routon_GetProgramCode(char* ProgramCode);
说 明:用于获取设备项目标识。
参 数:ProgramCode [out] 8字节的客户项目码。
返 回 值:
值 意义
1 成功
0 参数错误
-1 非HID设备,不支持该功能
-2 读数据错误
4.2.12.检验设备项目标识是否匹配
原 型:int Routon_CheckProgramCode(char* ProgramCode);
说 明:用于检验设备项目标识是否匹配。
参 数:ProgramCode [in] 8字节的客户项目码。
返 回 值:
值 意义
1 匹配成功
0 参数错误
-1 获取设备中项目识别码失败
-2 读设备信息错误
-3 设备与项目不匹配
4.2.13.设置读卡双通道
原 型:int Routon_SetTransmissionChannel(bool isDoubleChanel);
说 明:用于设置双通道读卡设备是否开启双通道
参 数:isDoubleChanel [in] bool型,true 时开启双通道
返回值:
值 意义
1 设置成功
0 设备不支持
其他 其他错误
4.2.14.双通道之从通道接收信息
原 型:int Routon_GetBaseMsg(int iPortID, unsigned char* pucCHMsg, unsigned int* puiCHMsgLen, unsigned char* pucPHMsg,
unsigned int *puiPHMsgLen, unsigned char* pucFPMsg, unsigned int* puiFPMsgLen, int iIfOpen)
说 明:从通道获取主通道的读卡信息
参 数: iPortID [in] 整型,从通道的端口信息,如USB设备“1001”,串口设备“5”。
pucCHMsg [out] 256字节身份证文本原始信息
puiCHMsgLen [out] 读取的身份证文本信息长度
pucPHMsg [out] 1024字节身份证头像照片原始wlt信息
puiPHMsgLen [out] 读取的身份证头像照片长度
pucFPMsg [out] 1024字节身份证指纹原始信息
puiFPMsgLen [out] 读取的身份证指纹信息长度,有指纹长度为1024,无指纹位0。
iIfOpen [in] 是否打开设备标识,如果执行该接口之前就已经打开了端口则传入0,不再打开设备。如果设备未打开,则传入1。
返回值:
值 意义
0x90 从通道读卡成功
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 外国人居留证
102 港澳台居住证
其它 其它错误
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] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(“”),表示照片存储在当前用户的临时目录中。
返 回 值:
值 意义
0 读取卡信息失败
1 读取卡信息成功
4.3.34.Routon_ReadAllGATBaseInfos (char*Name, char *Gender,char *FutureItem1, char* BirthDay,char *Address, char *Code, char *Agency, char * ExpireStart,char* ExpireEnd,char *PassID,char *SignCnt, char *FutureItem2,char *CardType,char *FutureItem3)
说 明:本函数用来读取港澳台居民居住证所有信息内容,照片文件保存在当前stdapi.dll文件相同目录中,照片文件名为photo.bmp。
参 数:
Name [out] 字符型指针,指向姓名信息。需要在调用时分配内存,字节数不小31。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
FututureItem1 [out] 字符型指针,指向预留项,暂无信息。需要在调用时分配内存,字节数不小5。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
Address [out] 字符型指针,指向地址信息。需要在调用时分配内存,字节数不小71。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小19。
Agency [out] 字符型指针,签发机关信息。需要在调用时分配内存,字节数不小于31。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调
用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
PassID [out] 字符型指针,指向指向通行证号码信息。需要在调用时分配内存,字节数不小于19。
SignCnt [out] 字符型指针,指向签发次数信息。需要在调用时分配内存,字节数不小于5。
FutureItem2 [out] 字符型指针,指向预留项信息。暂时无信息。需要在调用时分配内存,自己数不小于7。目前存放了三个空格符。
CardType [out] 字符型指针,指向证件类型标识。需要在调用时分配内存,字节数不小于2。港澳台居民居住证的标识为大写字母“J”。
FutureItem3 [out] 字符型指针,指向预留项信息。需要在调用时分配内存,自己数不小于7。目前存放了三个空格符。
返 回 值:
值 意义
0 读取卡信息失败
1 读取卡信息成功
4.3.35.Routon_ReadAllGATBaseInfosPhoto (char*Name, char *Gender,char *FutureItem1, char* BirthDay,char *Address, char *Code, char *Agency, char * ExpireStart,char* ExpireEnd,char *PassID,char *SignCnt, char *FutureItem2,char *CardType,char *FutureItem3,char *Directory)
说 明:本函数用来读取港澳台居民居住证所有信息内容,照片文件保存在当前stdapi.dll文件相同目录中,照片文件名为photo.bmp。
参 数:
Name [out] 字符型指针,指向姓名信息。需要在调用时分配内存,字节数不小31。
Gender [out] 字符型指针,指向性别信息(男或者女)。需要在调用时分配内存,字节数不小3。
FututureItem1 [out] 字符型指针,指向预留项,暂无信息。需要在调用时分配内存,字节数不小5。
BirthDay [out] 字符型指针,指向出生日期信息。需要在调用时分配内存,字节数不小9,前四位为出生年,第5位到第6位是出生月,后两位是出生日,格式为:CCYYMMDD。
Address [out] 字符型指针,指向地址信息。需要在调用时分配内存,字节数不小71。
Code [out] 字符型指针,指向身份证号码信息。需要在调用时分配内存,字节数不小19。
Agency [out] 字符型指针,签发机关信息。需要在调用时分配内存,字节数不小于31。
ExpireStart [out] 字符型指针,指向有效期起始日期信息。需要在调
用时分配内存,字节数不小9, 格式为:CCYYMMDD。
ExpireEnd [out] 字符型指针,指向有效期截至日期信息。需要在调用时分配内存,字节数不小9,格式为:CCYYMMDD,有效期为长期的表示为汉字“长期”。
PassID [out] 字符型指针,指向指向通行证号码信息。需要在调用时分配内存,字节数不小于19。
SignCnt [out] 字符型指针,指向签发次数信息。需要在调用时分配内存,字节数不小于5。
FutureItem2 [out] 字符型指针,指向预留项信息。暂时无信息。需要在调用时分配内存,自己数不小于7。目前存放了三个空格符。
CardType [out] 字符型指针,指向证件类型标识。需要在调用时分配内存,字节数不小于2。港澳台居民居住证的标识为大写字母“J”。
FutureItem3 [out] 字符型指针,指向预留项信息。需要在调用时分配内存,自己数不小于7。目前存放了三个空格符。
Directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(“”),表示照片存储在当前用户的临时目录中。
返 回 值:
值 意义
0 读取卡信息失败
1 读取卡信息成功
4.3.36.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.37.SelectUSB(int index)
说 明:根据用户选择的“部标”设备和HID设备,初始化相应的设备端口。
备 注:仅针对USB接口的“部标”设备和HID设备,调用之前必须先先FindAllUSB()函数寻找USB接口设备。
参 数:
index整数,表示“部标”设备和HID设备。0代表“部标”设备,1代表HID1,2代表HID2。
返 回 值:
值 意义
1 初始化指定设备端口成功
0 初始化指定设备端口失败
4.3.38.CloseSDTandHIDComm(int index)
说 明:根据打开的“部标”设备和HID设备的端口,关闭相应的端口。
备 注:仅针对USB接口的“部标”设备和HID设备。
参 数:
index整数,表示“部标”设备和HID设备。0代表“部标”设备,1代表HID1,2代表HID2。
返 回 值:
值 意义
1 关闭指定设备端口成功
0 关闭指定设备端口失败
4.3.39.InitSDTandHIDComm(int index)
说 明:寻找当前PC连接的USB接口设备,根据用户选择的“部标”设备和HID设备,初始化相应的设备端口。
备 注:仅针对USB接口的“部标”设备和HID设备。该接口包含了FindAllUSB()和SelectUSB()的功能。
参 数:
index整数,表示“部标”设备和HID设备。0代表“部标”设备,1代表HID1,2代表HID2。
返 回 值:
值 意义
1 初始化指定设备端口成功
0 初始化指定设备端口失败
4.3.40.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格式
身份证:姓名|性别|民族|出生年月日|住址|公民身份号码|签发机关|有效期限起始日期|有效期限结束日期|有效期限
外国证: 英文姓名|中文姓名|性别|国籍或地区代号|出生年月日|永久居住证号码|签发机关|有效期限起始日期|有效期限结束日期|有效期限
4.4.eID卡相关函数
4.4.1 eID_Authenticate()
说明:寻找eID卡
参数:无
返回值:
返回值 含义
1 成功
-1 eID卡激活失败
-2 PSAM卡激活失败
-3 APDU指令发送错误
-4 eID卡返回异常
-5 选择eID应用失败
-6 找eID卡失败
备注:eID卡属于A卡中的CPU卡类型,可先调用找A卡命令将eID和身份证进行区分。
4.4.2读eID卡原始信息
函数原型:eID_ReadBaseMsg(unsigned char* ucCHMsg, unsigned int* uiCHMsgLen, unsigned char* ucPHMsg, unsigned int* uiPHMsgLen,
unsigned char* ucFPMsg, unsigned int* uiFPMsgLen, unsigned char* ucAddAddress, unsigned int* uiAddAddressLen)
说明:读eID卡原始信息,包括文本信息、图片信息、指纹信息、附加地址信息
参数:
ucCHMsg:[out]字符型指针,指向eID的文本原始信息,在调用时分配内存,内存不小于256字节。
uiCHMsgLen:[out]无符号整数指针,指向eID原始文本信息长度。正常情况下是获取的值为256。
ucPHMsg:[out]字符型指针,指向eID的头像图片原始信息,在调用时分配内存,内存不小于1024字节。
uiPHMsgLen:[out]无符号整数指针,指向eID头像照片原始信息长度。正常情况下是获取的值为1024。
ucFPMsg:[out]字符型指针,指向eID的指纹原始信息,在调用时分配内存,内存不小于1024字节。
uiFPMsgLen:[out]无符号整数指针,指向eID指纹原始信息长度。如果eID包含指纹信息,正常情况下值为1024。
ucAddAddress:[out]字符型指针,指向eID的附加地址信息,在调用时分配内存,内存不小于70字节。
uiAddAddressLen:[out]无符号整数指针,指向eID附加地址信息长度。如果eID包附加地址信息,正常情况下值为70。
返回值:
返回值 含义
1 成功
-1 命令发送失败
-2 命令执行错误
-3 追加信息读取异常
-4 指纹信息读取异常
-5 头像信息读取异常
-6 文本信息读取异常
-7 安全认证错误
-8 明文信息校验失败
4.4.3 读eID基本信息
函数原型:int STDCALL eID_ReadBaseInfos(char * Name, char * Gender, char * Folk,char *BirthDay, char * Code, char * Address,char *Agency, char * ExpireStart,char* ExpireEnd,unsigned char* FPMsg, char* AddAddress, char* 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,有效期为长期的表示为汉字“长期”。
FPMsg [out] 字符型指针,指向eID中的指纹特征值。需要在调用时分配内存,字节数不小1024。
FPMsgLen [out] 整型指针,指向eID中的指纹特征值长度。
directory [in] 字符指针,表示照片存储路径,路径最后有无“\”均可;可以给空值(NULL),表示照片存储在ProgramData目录子目录 PLSY Soft中。
返回值:
返回值 含义
1 成功
0 失败
其他 错误值参照eID_ReadBaseMsg的错误返回
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;
}
5.8.eID读卡示例
#include “sdtapi.h”
int main()
{
int ret;
int dev;
ret =InitComm (1001);//USB接口, 1-16则为串口号
if ( ret )
{
ret= eID_Authenticate ();
if (ret){
ret = eID_ReadBaseInfos(Name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd, FPMsg, AddAddress,“C:\\temp\\”);
}
}
CloseComm();
return 0;
}