EST系列身份证读卡器Linux串口COM系列SDK开发包(含libwlt2bmp.so身份证照片解码库)
此SDK为best365英国在线体育官网Linux串口系列身份证阅读器,支持Linux相片解码以及获取身份证文字信息,另外还包括了非接IC卡、M1卡、CPU等卡的读取指令,含Linux系统libwlt2bmp.so相片解码库。

版本:V2018.11.07
相片解码说明:
#ifndef _dev_serial_H
#define _dev_serial_H
#define IC_UnConnect -1001 /*设备通讯超时*/
#define NoOpenCom -120 /* 串口没打开*/
#define SendDataError -121 /* 发送数据失败*/
#define TermParaError -122/* 终端参数错*/
#define TermTypeError -123 /* 终端类型错误*/
#define RevTimeOut -101/* 接收数据超时*/
#define IFD_SendAgain -40 /*如果返回此错误,需重发数据*/
#define IFD_TypeA_Find_Error -28/*TYPE A寻卡错误*/
#define IFD_TypeA_MoreCard_Error -27/*TYPE A检测到多张卡片*/
#define IFD_TypeA_Anticoll_Error -26/*TYPE A防碰撞错误*/
#define IFD_TypeA_Select_Error -25/*TYPE A选卡错误*/
#define IFD_TypeA_RATS_Error -24/*TYPE A RATS错误*/
#define IFD_M1_Auth_Error -23/*Mifare one Auth错误*/
#define IFD_TypeB_Find_Error -22/*TYPE B寻卡错误*/
#define IFD_TypeB_attrib_Error -21/*TYPE B attrib错误*/
/*状态码*/
#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 /*信息校验和出错*/
#ifdef __cplusplus
extern "C" {
#endif
/******************************************************************************************************************************************\
\ /
/身份证 \
\ /
\******************************************************************************************************************************************/
/*****************************************
* 功能: 读取证件(居民身份证 + 外国人永久居留证 + 港澳台居民居住证)
* 参数:
*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);
/******************************************************************************************************************************************\
\ /
/设备类 \
\ /
\******************************************************************************************************************************************/
/*****************************************
* 功能:连接读卡器
* 参数:
*comm:[IN] 串口号,例如"/dev/ttyS3"
* 返回值:
*返回大于0的设备句柄
******************************************/
long ICC_Reader_Open(char * comm);
/*****************************************
* 功能:断开读卡器连接
* 参数:
*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);
/******************************************************************************************************************************************\
\ /
/非接类 \
\ /
\******************************************************************************************************************************************/
/*****************************************
* 功能: 获取卡片UID(M1 & TypeA)
* 参数:
*ReaderHandle:[IN] 执行ICC_Reader_Open 函数成功时的返回值
*UID: [OUT] 4字节UID
* 返回值:
*成功返回0
***************************************************************/
long PICC_Reader_GetUID(long fd,unsigned char* UID);
/*****************************************
* 功能: 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 *Key);
/*****************************************
* 功能: 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);
/*****************************************
* 功能: 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);
/******************************************************************************************************************************************\
\ /
/磁条卡 \
\ /
\******************************************************************************************************************************************/
/*****************************************
* 功能: 读磁条卡
* 参数:
*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);
#ifdef __cplusplus
}
#endif
#endif
#include "../inc/dev_serial.h"
#include
#include
static long handle;
static void printchar(char ch, int len)
{
while(len--)
{
printf("%c", ch);
}
printf("\n");
}
static void printchar_txt(char ch, char *pText)
{
printf("%c\t%s\n", ch, pText);
}
static void printByteArray(char *Tag, unsigned char *pSrc, int ilen)
{
inti = 0;
printf( "%s", Tag );
while( i { printf( "%02X ", pSrc[i] ); i++; } printf( "\n" ); } static void ShowToEdit(const char* tag, const char* msg) { printf( "%s\t%s\n", tag, msg ); } static void CertCard_Test() { intnRt, i; char pName[50]={0}; char pSex[10]={0}; char pNation[10]={0}; char pBirth[50]={0}; char pAddress[100]={0}; char pCertNo[50]={0}; char pDepartment[100]={0}; char pEffectData[50]={0}; char pExpire[20]={0}; char pErrMsg[50]={0}; char pEnName[150] = { 0 }; char pEnNation[50] = { 0 }; char pAuthorCode[150] = { 0 }; char pCardVersion[150] = { 0 }; char pTXZHM[50] = { 0 }; char pTXZQFCS[10] = { 0 }; nRt = PICC_ReadIDCard(handle); if ( nRt != 0 ) { printf( "ReadCertCard fail! nRet=%d\n", nRt ); return; } if(GetCardType() == 0) { GetName(pName); GetSex(pSex); GetNation(pNation); GetBirth(pBirth); GetAddress(pAddress); GetCertNo(pCertNo); GetDepartemt(pDepartment); GetEffectDate(pEffectData); GetExpireDate(pExpire); ShowToEdit( "姓名:", (pName)); ShowToEdit( "性别:", (pSex)); ShowToEdit( "民族:", (pNation)); ShowToEdit( "出生日期:", (pBirth)); ShowToEdit( "地址:", (pAddress)); ShowToEdit( "身份证号:", (pCertNo)); ShowToEdit( "签发机关:", (pDepartment)); ShowToEdit( "有效起始日期:", (pEffectData)); ShowToEdit( "有效截止日期:", (pExpire)); } if(GetCardType() == 1) { GetName(pName); GetEnName(pEnName); GetSex(pSex); GetNationalityCode(pEnNation); GetBirth(pBirth); GetCertNo(pCertNo); GetEffectDate(pEffectData); GetExpireDate(pExpire); GetCardVersion(pCardVersion); ShowToEdit( "中文姓名:", (pName)); ShowToEdit( "英文姓名:", (pEnName)); ShowToEdit( "性别:", (pSex)); ShowToEdit( "国籍代码:", (pEnNation)); ShowToEdit( "永久居留证号码:", (pCertNo)); ShowToEdit( "出生日期:", (pBirth)); ShowToEdit( "证件签发日期:", (pEffectData)); ShowToEdit( "证件终止日期:", (pExpire)); ShowToEdit( "证件版本:", (pCardVersion)); } if(GetCardType() == 2) { GetName(pName); GetSex(pSex); GetBirth(pBirth); GetAddress(pAddress); GetCertNo(pCertNo); GetDepartemt(pDepartment); GetEffectDate(pEffectData); GetExpireDate(pExpire); GetTXZHM(pTXZHM); GetTXZQFCS(pTXZQFCS); ShowToEdit( "姓名:", (pName)); ShowToEdit( "性别:", (pSex)); ShowToEdit( "出生日期:", (pBirth)); ShowToEdit( "地址:", (pAddress)); ShowToEdit( "身份证号:", (pCertNo)); ShowToEdit( "签发机关:", (pDepartment)); ShowToEdit( "有效起始日期:", (pEffectData)); ShowToEdit( "有效截止日期:", (pExpire)); ShowToEdit( "通行证号码:", (pTXZHM)); ShowToEdit( "通行证签发次数:", (pTXZQFCS)); } char szPhotoPath[255] = { 0 }; sprintf(szPhotoPath, "../list/%s.bmp", pCertNo); GetBmpFile("../lib/libwltdecode.so", szPhotoPath); } static void ICC_CPUCard_Test() { intnRt, i; unsigned char slot = 0x01; unsigned char cmd[255] = { 0 }; unsigned charresp[255]= { 0 }; unsigned charATR[60] = { 0 }; intlenth_of_cmd; // Get 8 byte Random cmd[0] = 0x00; cmd[1] = 0x84; cmd[2] = 0x00; cmd[3] = 0x00; cmd[4] = 0x08; lenth_of_cmd = 5; //CPU Card PowerOn nRt = ICC_Reader_pre_PowerOn( handle, slot, resp ); if( nRt < 0 ) { printf( "CPU Card PowerOn fail! ret=%d\n", nRt ); return; } printByteArray( "ATR: ", resp, nRt ); printByteArray( "CMD: ", cmd, lenth_of_cmd ); //Send APDU CMD memset( resp, 0, 250 ); nRt = ICC_Reader_Application( handle, slot, lenth_of_cmd, cmd, resp ); if( nRt < 0 ) { printf( "send APDU CMD fail! ret=%d\n", nRt ); return; } printByteArray( "Resp: ", resp, nRt ); } static void PICC_CPUCard_Test() { int nRt, i; unsigned char uid[15] = { 0 }; unsigned char cmd[255] = { 0 }; unsigned char resp[255]= { 0 }; unsigned char ATR[60] = { 0 }; int lenth_of_cmd; // Get 8 byte Random cmd[0] = 0x00; cmd[1] = 0x84; cmd[2] = 0x00; cmd[3] = 0x00; cmd[4] = 0x08; lenth_of_cmd = 5; //CPU Card PowerOn nRt = PICC_Reader_PowerOnTypeA( handle, resp ); if( nRt < 0 ) { printf( "TypeA CPU Card PowerOn fail! ret=%d\n", nRt ); return; } printByteArray( "ATR: ", resp, nRt ); printByteArray( "CMD: ", cmd, lenth_of_cmd ); memset( resp, 0, 250 ); nRt = PICC_Reader_Application( handle, lenth_of_cmd, cmd, resp ); if( nRt < 0 ) { printf( "send APDU CMD fail! ret=%d\n", nRt ); return; } printByteArray( "Resp: ", resp, nRt ); } static void M1Card_Test() { int nRt, i; unsigned char uid[15]= { 0 }; unsigned char password[7] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 }; unsigned char resp[255]= { 0 }; unsigned charaddr= 0x04; unsigned charsncr= 0x01; unsigned charmode= 0x61; if( PICC_Reader_GetUID( handle, uid ) <= 0 ) { printf( "PICC_Reader_anticoll fail! ret=%d\n", nRt ); return; } printByteArray( "UID: ", uid, 4 ); nRt = PICC_Reader_Authentication_Pass( handle, mode, sncr, password ); if ( nRt != 0 ) { printf( "PICC_Reader_Authentication_Pass fail! ret=%d\n", nRt ); return; } nRt = PICC_Reader_Read( handle, addr, resp ); if( nRt != 0 ) { printf( "PICC_Reader_Read fail! ret=%d\n", nRt ); return; } printByteArray( "Data: ", resp, 16 ); } int main(void) { long nRt; intnval; handle = ICC_Reader_Open( "/dev/ttyUSB0" ); if( handle <= 0 ) { printf( "open fail! \n" ); return 0; } printchar( '#', 80 ); printchar_txt( '#', "please choose the action you want:" ); printchar_txt( '#', "1.opt ICC CPU Card." ); printchar_txt( '#', "2.opt PICC CPU(A) Card." ); printchar_txt( '#', "3.opt M1 Card." ); printchar_txt( '#', "4.opt CertCard." ); printchar( '#', 80 ); scanf( "%d", &nval ); //nRt = ICC_PosBeep( handle, 10 ); switch( nval ) { case 1: { printf( "\tICC_CPU_CARD.\n" ); ICC_CPUCard_Test(); } break; case 2: { printf( "\tPICC_CPU(A)_CARD.\n" ); PICC_CPUCard_Test(); } break; case 3: { printf( "\tM1_CARD.\n" ); M1Card_Test(); } break; case 4: { printf( "\tCertCard.\n" ); CertCard_Test(); } break; default: printf( "enter err!\n" ); break; } ICC_PosBeep(handle, 10); ICC_Reader_Close(handle); return 0; }








































