身份证阅读器身份证读卡器Linux系统二次开发包(含Linux身份证相片解码库)

时间:2024-03-20 16:32:44

注意:

此身份证阅读器Linux系统SDK是最新的采用USB接口通讯的开发包,涵盖了身份证、M1、CPU、IC等多种卡片的Linux系统应用示例,包括了Linux系统上面身份证相片解码(已攻克Linux相片解码难题)。

目前测试版本:X86构架Linux,嵌入式ARM Linux未经深度测试。

应用产品:

门禁系统、道闸、考勤系统以及人脸识别系统、自助终端、机器人系统等。

身份证阅读器模组模块

支持身份证、社保卡、CPU卡、M1卡、IC卡、医保卡、磁条卡、银行卡等多种卡片识别读取,提供完善的接口SDK二次开发技术支持,可提供Linux、单片机、ARM的通讯协议以及Android、Windows等系统二次开发包,可以适用于市场上的闸机、门禁、人脸识别考勤机、机器人终端、通道闸等产品使用。

身份证阅读器Linux系统开发包下载:http://www.eastcoms.com/service/downdrive/559.html

身份证阅读器身份证读卡器Linux系统二次开发包(含Linux身份证相片解码库)
Linux系统

Linux系统SDK使用步骤:

1、连接读卡器 

long ICC_Reader_Open(char * dev_name);

参数: 

dev_name:[IN] 端口号,固定"USB1"  

返回值:返回大于0的设备句柄 

2、断开读卡器连接

long ICC_Reader_Close(long ReaderHandle);

参数: 

ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

返回值:成功返回0

具体的接口参数和返回值请查看termb.h文件中的接口说明。

1. 工具链采用arm-marvell-linux-gnueabi编译,demo和编译方法可参照main.cpp和Makefile。

2. lib目录下为编译用到的库文件,

3. 程序调用可以用如下方式:

 # LD_LIBRARY_PATH=lib ./main

 也可以将lib目录下所有库文件拷贝到系统库目录中,直接调用即可。

 

///////////////////////////////////////////////////////////////各卡片操作顺序////////////////////////////////////////////////////////////

【typeA CPU 卡操作顺序】

1 设置为TypeA卡片

2 请求卡片

3 防碰撞

4 选择卡片

5 上电

6 APDU 命令

【typeB 卡操作顺序】

1 设置为TypeB卡片

2 上电

3 选卡

4 APDU 命令

【M1卡操作顺序】

1 请求卡片

2 防碰撞

3 选择卡片

4 认证**

5 读或写

【接触CPU卡操作顺序】

1 上电复位

2 APDU 命令

【身份证操作顺序】

读取证件

获取证件类型

获取信息

Linux系统开发包核心代码:

#ifndef _EST100_BASE_H_

#define _EST100_BASE_H_

#include <stdio.h>

#include <errno.h>

#include <dlfcn.h>

#include <errno.h>

#include <unistd.h>

#include <stdlib.h>    

#include <stdarg.h>

#include <unistd.h>     

#include <sys/time.h>

#include <ctype.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <string.h>

#include <sys/types.h>

#include <stddef.h>   

#include <termios.h> 

#include <strings.h>

#include <stdbool.h>

#include <locale.h>

#include <iconv.h>

#include <sys/io.h>//chmod

#include <sys/stat.h>

#include "./include/libusb-1.0/libusb.h" 

#define IFD_OK0 //执行成功

#define IFD_ICC_TypeError-1 //卡片类型不对

#define IFD_ICC_NoExist-2 //无卡

#define IFD_ICC_NoPower-3 //有卡未上电

#define IFD_ICC_NoResponse-4     //卡片无应答

#define IFD_ConnectError-11     //读卡器连接错

#define IFD_UnConnected-12         //未建立连接(没有执行打开设备函数)

#define IFD_BadCommand-13         //(动态库)不支持该命令

#define IFD_ParameterError-14     //(发给动态库的)命令参数错

#define IFD_CheckSumError-15     //信息校验和出错

#define IFD_OutTime   -20

#ifdef __cplusplus

extern "C" {

#endif

/******************************************************************************************************************************************\

\   /

/设备类   \

\   /

\******************************************************************************************************************************************/

 

/*****************************************

* 功能:连接读卡器 

* 参数: 

*dev_name:[IN] 端口号,固定"USB1"  

* 返回值: 

*返回大于0的设备句柄 

******************************************/

long ICC_Reader_Open(char * dev_name);

/*****************************************

* 功能:断开读卡器连接

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

* 返回值: 

*成功返回0

***************************************************************/

long ICC_Reader_Close(long ReaderHandle);

/*****************************************

* 功能: 蜂鸣 

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*timeout: [IN] 超时时间,固定为5

* 返回值: 

*成功返回0 

******************************************/

long ICC_PosBeep(long ReaderHandle, unsigned char timeOut);

/******************************************************************************************************************************************\

\   /

/接CPU   \

\   /

\******************************************************************************************************************************************/

/*****************************************

* 功能: 接触CPU卡上电(冷复位)

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*ICC_Slot_No:[IN] 卡座号 0x01(大卡座),0x11~0x14(SAM1~SAM4)

*Response:[OUT] ATR

* 返回值: 

*成功返回数据长度

***************************************************************/

long ICC_Reader_pre_PowerOn(long ReaderHandle, unsigned char ICC_Slot_No, unsigned char* Response);

/*****************************************

* 功能: 接触CPU卡下电

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*ICC_Slot_No:[IN] 卡座号 0x01(大卡座),0x11~0x14(SAM1~SAM4)

* 返回值: 

*成功返回0

***************************************************************/

long ICC_Reader_PowerOff(long ReaderHandle,unsigned char ICC_Slot_No);

/*****************************************

* 功能: 接触CPU卡执行APDU命令

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*ICC_Slot_No:[IN] 卡座号 0x01(大卡座),0x11~0x14(SAM1~SAM4)

*Lenth_of_Command_APDU: [IN] APDU命令的长度

*Command_APDU:[IN] APDU命令

*Response_APDU: [OUT] 响应信息

* 返回值: 

*成功返回响应信息数据的长度

***************************************************************/

long ICC_Reader_Application(long ReaderHandle,unsigned char ICC_Slot_No, long Lenth_of_Command_APDU,unsigned char* Command_APDU,unsigned char* Response_APDU);  //执行apdu命令  返回数据长

/******************************************************************************************************************************************\

\   /

/非接类   \

\   /

\******************************************************************************************************************************************/

/****************************************

* 功能: 设置为操作TypeA卡

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

* 返回值: 

*成功返回0

***************************************************************/

long PICC_Reader_SetTypeA(long ReaderHandle);

/*****************************************

* 功能: 设置为操作TypeB卡

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

* 返回值: 

*成功返回0

***************************************************************/

long PICC_Reader_SetTypeB(long ReaderHandle);

/*****************************************

* 功能: 请求卡片

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

* 返回值: 

*成功返回0

***************************************************************/

long PICC_Reader_Request(long ReaderHandle);

/*****************************************

* 功能: 防碰撞

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*UID: [OUT] 4字节UID

* 返回值: 

*成功返回0

***************************************************************/

long PICC_Reader_anticoll(long ReaderHandle,unsigned char *uid);

/*****************************************

* 功能: 选择卡片

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*cardtype:[IN] 0x41表示TypeA & M1, 0x42表示TypeB

* 返回值: 

*成功返回0

***************************************************************/

long PICC_Reader_Select(long ReaderHandle,unsigned char cardtype);

/*****************************************

* 功能: TypeA卡上电

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*Response: [OUT] 上电返回数据

* 返回值: 

*成功返回数据长度

***************************************************************/

long PICC_Reader_PowerOnTypeA(long ReaderHandle,unsigned char* Response);

/*****************************************

* 功能: TypeB卡上电

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*Response: [OUT] 上电返回数据

* 返回值: 

*成功返回数据长度

***************************************************************/

long PICC_Reader_PowerOnTypeB(long ReaderHandle,unsigned char* Response);

/*****************************************

* 功能: TypeA & B 卡执行APDU命令

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*Lenth_of_Command_APDU: [IN] APDU命令的长度

*Command_APDU:[IN] APDU命令

*Response_APDU: [OUT] 响应信息

* 返回值: 

*成功返回响应信息数据的长度

***************************************************************/

long PICC_Reader_Application(long ReaderHandle,long Lenth_of_Command_APDU,unsigned char* Command_APDU,unsigned char* Response_APDU);

/*****************************************

* 功能: M1卡认证秘钥

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*Mode: [IN] 0x60 表示认证KeyA, 0x61表示认证KeyB

*SecNr:[IN] 扇区号 S50系列卡 0~15, S70系列卡 0~63

*Key: [IN] 6字节秘钥

* 返回值: 

*成功返回0

***************************************************************/

long PICC_Reader_Authentication_Pass(long ReaderHandle,unsigned char Mode, unsigned char SecNr,unsigned char *PassWord);

/*****************************************

* 功能: M1读卡

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*Addr:[IN] 块地址 S50系列卡 0~63, S70系列卡 0~255, 例如:1扇区1块,这里Addr=5=1*4 + 1(扇区号*4 + 块号)

*Data:[OUT] 16字节块数据

* 返回值: 

*成功返回0

*****************************************************************************************************************/

long PICC_Reader_Read(long ReaderHandle,unsigned char Addr,unsigned char *Data);

/*****************************************

* 功能: M1写卡

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*Addr:[IN] 块地址 S50系列卡 0~63, S70系列卡 0~255, 例如:1扇区1块,这里Addr=5=1*4 + 1(扇区号*4 + 块号)

*Data: [IN] 16字节待写入数据

* 返回值: 

*成功返回0

***************************************************************************************************************/

long PICC_Reader_Write(long ReaderHandle,unsigned char Addr,unsigned char *Data);

/******************************************************************************************************************************************\

\   /

/磁条卡   \

\   /

\******************************************************************************************************************************************/

/*****************************************

* 功能: 读磁条卡

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

*ctime:[IN] 等待刷卡的超时时间,单位:秒

*track:[IN] 磁道 1~3

*rlen: [OUT] 返回的磁道数据长度

*Data: [OUT] 返回的磁道数据

* 返回值: 

*成功返回0

****************************************************************/

long Rcard(long ReaderHandle,unsigned char ctime,int track,unsigned char *rlen,char *Data);

long ICC_GetTimeOut(long ReaderHandle, unsigned char flag);//内部调用

/******************************************************************************************************************************************\

\   /

/身份证   \

\   /

\******************************************************************************************************************************************/

/*****************************************

* 功能: 读取证件(居民身份证 + 外国人永久居留证 + 港澳台居民居住证)

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

* 返回值: 

*成功返回0,执行成功后可调用下列get函数获取相应的信息

***********************************************************************/

long PICC_ReadIDCard(long ReaderHandle);

/*****************************************

* 功能: 读取证件,包含指纹(居民身份证 + 外国人永久居留证 + 港澳台居民居住证)

* 参数: 

*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值

* 返回值: 

*成功返回0,执行成功后可调用下列get函数获取相应的信息

***********************************************************************/

long PICC_ReadIDCardFP(long ReaderHandle);

/*****************************************

* 功能: 获取证件类型

* 参数: 

*无

* 返回值: 

*0:表示居民身份证

*1:表示外国人永久居留证

*2:表示港澳台居民居住证

*****************************************/

int GetCardType();

/*****************************************

* 功能: 获取姓名

* 参数: 

*pName: [OUT] 姓名

* 返回值: 

*成功返回0

* 包含证件类型:0、1、2

*****************************************/

int GetName(char* pName);

/*****************************************

* 功能: 获取性别

* 参数: 

*pSex: [OUT] 性别

* 返回值: 

*成功返回0

* 包含证件类型:0、1、2

*****************************************/

int GetSex(char* pSex);

/*****************************************

* 功能: 获取民族

* 参数: 

*pNation: [OUT] 民族

* 返回值: 

*成功返回0

* 包含证件类型:0

*****************************************/

int GetNation(char* pNation);

/*****************************************

* 功能: 获取出生日期

* 参数: 

*pBirth: [OUT] 出生日期

* 返回值: 

*成功返回0

* 包含证件类型:0、1、2

*****************************************/

int GetBirth(char* pBirth);

/*****************************************

* 功能: 获取住址

* 参数: 

*pAddress: [OUT] 住址

* 返回值: 

*成功返回0

* 包含证件类型:0、2

*****************************************/

int GetAddress(char* pAddress);

/*****************************************

* 功能: 获取证件号码

* 参数: 

*pCertNo: [OUT] 证件号码

* 返回值: 

*成功返回0

* 包含证件类型:0、1、2

*****************************************/

int GetCertNo(char* pCertNo);

/*****************************************

* 功能: 获取签发机关

* 参数: 

*pDepartemt: [OUT] 签发机关

* 返回值: 

*成功返回0

* 包含证件类型:0、2

*****************************************/

int GetDepartemt(char* pDepartemt);

/*****************************************

* 功能: 获取有效起始日期

* 参数: 

*pEffectDate: [OUT] 有效起始日期

* 返回值: 

*成功返回0

* 包含证件类型:0、1、2

*****************************************/

int GetEffectDate(char* pEffectDate);

/*****************************************

* 功能: 获取有效截止日期

* 参数: 

*pExpireDate: [OUT] 有效截止日期

* 返回值: 

*成功返回0

* 包含证件类型:0、1、2

*****************************************/

int GetExpireDate(char* pExpireDate);

/*****************************************

* 功能: 获取通行证号码

* 参数: 

*pTXZHM: [OUT] 通行证号码

* 返回值: 

*成功返回0

* 包含证件类型:2

*****************************************/

int GetTXZHM(char* pTXZHM);

/*****************************************

* 功能: 获取通行证签发次数

* 参数: 

*pTXZQFCS: [OUT] 通行证签发次数

* 返回值: 

*成功返回0

* 包含证件类型:2

*****************************************/

int GetTXZQFCS(char* pTXZQFCS);

/*****************************************

* 功能: 获取英文名

* 参数: 

*pEnName: [OUT] 外国人英文名

* 返回值: 

*成功返回0

* 包含证件类型:1

*****************************************/

int GetEnName(char* pEnName);

/*****************************************

* 功能: 获取国籍代码

* 参数: 

*pNationalityCode: [OUT] 外国人国籍代码

* 返回值: 

*成功返回0

* 包含证件类型:1

*****************************************/

int GetNationalityCode(char* pNationalityCode);

/*****************************************

* 功能: 获取证件版本

* 参数: 

*pCardVersion: [OUT] 外国人居留证证件版本

* 返回值: 

*成功返回0

* 包含证件类型:1

*****************************************/

int GetCardVersion(char* pCardVersion);

/*****************************************

* 功能: 获取照片

* 参数: 

*dlpath: [IN] so路径, 例如:"../lib/libwltdecode.so"

*pBmpfilepath: [IN] 照片路径, 例如:"../list/zp.bmp"

* 返回值: 

*成功返回0

* 包含证件类型:0、1、2

*****************************************/

int GetBmpFile(const char* dlpath, char* pBmpfilepath);

/*****************************************

* 功能: 是否含指纹信息

* 参数: 

*无

* 返回值: 

*成功返回指纹数据长度,0表示没有

* 包含证件类型:0、1、2

*****************************************/

int IsFingerExist();

/*****************************************

* 功能: 获取指纹信息

* 参数: 

*fpInfo: [OUT] 指纹数据

* 返回值: 

*成功返回获取到的指纹数据长度,0表示没有

* 包含证件类型:0、1、2

*****************************************/

int GetFingerprint(unsigned char* fpInfo);

#ifdef __cplusplus

}

#endif

#endif