实例介绍
【实例简介】SSSE32动态库&&说明文档(2018)
读写器接口说明文档
1 、状态码
#define IFD_OK 0 执行成功
#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 信息校验和出错
Ps:卡片基本操作顺序可查看文档底部附录
2 、通用函数
2.1 连接读卡器.
1) long WINAPI ICC_Reader_Open(char* dev_Name);
2) long WINAPI ICC_Reader_OpenEx(char* dev_Name,unsigned int VID, unsigned int PID);
用途:
打开指定的电脑接口.
参数:
dev_name :IN 以 0 结尾的字符串用于描述接口名字,如”USB1”.
VID:读卡器的PID,默认为 0x072F
PID:读卡器的PID,默认为 0x90D5
函数2在一台电脑上同时接多台读卡器的情况下可用,避免互相干扰。
返回值:
其值为电脑接口句柄,大于 0 表示连接设备成功,否则表示连接失败(值无意 义).
例子:
long hReader = ICC_Reader_Open (“USB1”); //打开 USB1 口
long hReader = ICC_Reader_OpenEx (“USB1”, 0x90D5, 0x072F ); //打开 USB1 口
2.2 long WINAPI ICC_Reader_Close(long ReaderHandle);
用途:
关闭已打开的电脑接口.
参数:
ReaderHandle :IN 接口句柄,由 ICC_Reader_Open函数所返回的值.
返回值:
等于 0 表示关闭设备成功,否则表示关闭失败. 例子:
long hReader = ICC_Reader_Open (“USB1”); //打开 USB1 口 ICC_Reader_Close(hReader); //关闭 USB1 口
2.3 long WINAPI ICC_PosBeep(long ReaderHandle, unsigned char time);
用途:
让读写器产生蜂鸣. 参数:
ReaderHandle:IN 接口句柄, 接口句柄由 ICC_Reader_Open函数所返回的值.
Time:IN 蜂鸣的时间,以毫秒为单位.
返回值:
等于 0 表示执行成功,否则表示执行失败. 例子:
ICC_PosBeep(hReader, 0x10); //让读写器蜂鸣.
2.4 long WINAPI ICC_Reader_ReadEEPROM (long ReaderHandle,int offset,int length,unsigned char *buffer);
用途:
从EEprom读取数据
参数:
ReaderHandle:IN 接口句柄;
Offset:IN 偏移地址;
Length:IN 要读取的数据的长度;
Buffer:OUT 读取的数据;
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
Char buff[20]={0};
Re =ICC_Reader_ReadEEPROM(hReader,0,10,buff);//表示从0位置开始读取10个字节长度的数据
2.5 long WINAPI ICC_Reader_WriteEEPROM (long ReaderHandle,int offset,int length,unsigned char *buffer);
用途:
往EEprom写入数据
参数:
ReaderHandle:IN 接口句柄;
Offset:IN 偏移地址;
Length:IN 要写入的数据的长度;
Buffer:IN 待写入的数据;
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
Char buff[20]={0};
Strcpy(buff,”1234567890”);
Re =ICC_Reader_WriteEEPROM(hReader,0,10,buff);//表示从0位置开始写入10个字节长度的数据
2.6 long WINAPI ICC_Reader_GetDeviceVersion(long ReaderHandle,char *Version);
用途:
获取读写器版本
参数:
ReaderHandle:IN 接口句柄;
Version:OUT 读写器版本信息;
返回值:
大于 0 表示执行成功,否则表示执行失败.
2.7 long WINAPI ICC_Reader_GetDeviceCSN(long ReaderHandle,char* dev_Ser);
用途:
获取唯一序列号,从芯片获取,全球唯一,不可更改
参数:
ReaderHandle:IN 接口句柄;
dev_Ser:OUT 设备序列号;
返回值:
大于 0 表示执行成功,返回序列号数据长度.
2.8 long WINAPI ICC_Reader_GetDeviceSN(long ReaderHandle,char* dev_Ser)
用途:
获取设备序列号,可更改
参数:
ReaderHandle:IN 接口句柄;
dev_Ser:OUT 成功返回设备序列号;
返回值:
大于 0 表示执行成功,返回序列号数据长度.
2.9 long WINAPI ICC_Reader_SetDeviceSN(long ReaderHandle,char* dev_Ser);
用途:
用于设置设备序列号
参数:
ReaderHandle:IN 接口句柄;
dev_Ser:IN设备序列号;
返回值:
等于 0 表示执行成功.
例子:
Char buff[20]={0};
Strcpy(buff,”1234567890”);
Re = ICC_Reader_SetDeviceSN (hReader, buff);//表示将设备序列号设置为” 1234567890”
2.10 long WINAPI ICC_Reader_GetKeyBoardVersion(long ReaderHandle,char* ver);
用途:
用于获取密码键盘版本号
参数:
ReaderHandle:IN 接口句柄;
ver:OUT 键盘设备序列号;
返回值:
大于 0 表示执行成功,返回版本数据长度
2.11 long WINAPI ICC_Reader_DisCardType(long ReaderHandle)
用途:
用于获取插入大卡座卡片类型
参数:
ReaderHandle:IN 接口句柄;
返回值:
大于 0 表示执行成功,返回1:表示是CPU卡;2:表示是4428卡;3:表示是4442卡;其他值表示失败
2.12 long WINAPI ICC_Reader_GetMagCardMode(long ReaderHandle,unsigned short *Mode,unsigned short *Track,unsigned short *fOutType,unsigned short *fEnter)
用途:
用于获取磁卡输出模式
参数:
ReaderHandle:IN 接口句柄;
Mode:OUT Mode=1 通过软件控制读取 Mode=2模拟键盘
Track:OUT 磁条轨道,当为模拟键盘输出时有效,分别对应1/2/3 全轨时为4
fOutType:OUT 输出模式 0=全部输出 1=去除起始字符 2=只输出数字
fEnter: OUT 是否换行标志 01=换行 00=不换行
返回值:
等于 0 表示执行成功;其他值表示失败
2.13 long WINAPI ICC_Reader_SetMagCardMode (long ReaderHandle,unsigned short Mode,unsigned short Track,unsigned short fOutType,unsigned short fEnter)
用途:
用于设置磁卡读卡模式
参数:
ReaderHandle:IN 接口句柄;
Mode:IN Mode=1 通过软件控制读取 Mode=2模拟键盘
Track:IN 磁条轨道,当为模拟键盘输出时有效,分别对应1/2/3 全轨时为4
fOutType:IN 输出模式 0=全部输出 1=去除起始字符 2=只输出数字
fEnter: IN 是否换行标志 01=换行 00=不换行
返回值:
等于 0 表示执行成功;其他值表示失败
2.14 long WINAPI ICC_Reader_ChangeSlot(long ReaderHandle,unsigned char slot )
用途:
用于切换卡座(针对于我司有副卡座的设备,可以启用副卡座)
参数:
ReaderHandle:IN 接口句柄;
slot:IN slot =0x01 设置工作卡座为主卡座,slot =0x02 设置工作卡座为副卡座(备用卡座)
返回值:
等于 0 表示执行成功;其他值表示失败
3 、接触CPU卡操作函数
3.1 long WINAPI ICC_Reader_PowerOn(long ReaderHandle,unsigned char ICC_Slot_No,unsigned char* Response)
用途:
接触 CPU 卡上电复位,返回值数据格式为十六进制
参数:
ReaderHandle:IN 接口句柄.
ICC_Slot_No:IN 0x01 :大卡座 ;0x02 :副卡座 ;0x11:SAM1卡座;0x12:SAM2卡座;0x13:SAM3卡座;0x14:SAM4卡座;
Response:OUT 上电后,卡片返回的数据.
返回值:
大于 0 表示成功,其值为 Response 数据长度.否则表示上电失败
例子:
unsigned char Res[256];
int len = ICC_Reader_PowerOn(hReader, 0x01, Res);
//大卡座CPU卡上电复位
这里 res[0]=0x3b; res[1]=0xxx;……
3.2 long WINAPI ICC_Reader_PowerOnHEX(long ReaderHandle,unsigned char ICC_Slot_No,unsigned char* Response)
用途:
接触 CPU 卡上电复位,返回值为十六进制字符串形式
参数:
ReaderHandle:IN 接口句柄.
ICC_Slot_No:IN 0x01 :大卡座 ;0x02 :副卡座 ;0x11:SAM1卡座;0x12:SAM2卡座;0x13:SAM3卡座;0x14:SAM4卡座;
Response:OUT 上电后,卡片返回的数据.
返回值:
大于 0 表示成功,其值为 Response 数据长度.否则表示上电失败
例子:
unsigned char Res[256];
int len = ICC_Reader_PowerOnHEX(hReader, 0x01, Res);
//大卡座CPU卡上电复位
这里res=”3Bxxxxx”
3.3 long WINAPI ICC_Reader_PowerOff(long ReaderHandle,unsigned char ICC_Slot_No);
用途:
让接触 CPU 卡下电. 参数:
ReaderHandle:IN 接口句柄.
ICC_Slot_No:IN
卡座参数,具体表示如下
大卡座 :0x01;副卡座:0x02;SAM1:0x11;SAM2:0x12;SAM3:0x13;SAM4:0x14;
返回值
等于 0 表示下电成功,否则表示下电失败.
3.4 long WINAPI ICC_Reader_GetStatus(long ReaderHandle,unsigned char ICC_Slot_No);
用途:
获取卡座状态. 参数:
ReaderHandle :IN 接口句柄
ICC_Slot_No:IN 卡座参数,具体表示如下
大卡座 :0x01;副卡座:0x02;SAM1:0x11;SAM2:0x12;SAM3:0x13;SAM4:0x14;
返回值:
等于 0 表示卡座有卡,否则见状态码
例子:
int len = ICC_Reader_GetStatus(hReader, 0x01); //获取大卡座状态
3.5 long WINAPI ICC_Reader_Application(long ReaderHandle, unsigned char ICC_Slot_No,long Lenth_of_Command_APDU, unsigned char* Command_APDU, unsigned char* Response_APDU);
用途:
接触 CPU 卡执行 apdu 命令
参数:
ReaderHandle IN 接口句柄.
ICC_Slot_No:IN 卡座参数,具体表示如下
大卡座 :0x01;副卡座:0x02;SAM1:0x11;SAM2:0x12;SAM3:0x13;SAM4:0x14;
Lenth_of_Command_APDU:IN apdu命令长度
Command_APDU:IN APDU命令数据
Response_APDU:OUT apdu 命令执行后,响应的数据.
返回值:
大于 0 表示执行成功,其值为 Response_APDU 的数据长度.否则表示执行失败
例子:大卡座CPU卡执行命令
unsigned char cmd[8] = {0x00, 0xa4, 0x00, 0x00, 0x02, 0xEF, 0x11};
int len = ICC_Reader_Application(hReader, 0x01, 7, cmd, PowerRes);
3.6 long WINAPI ICC_Reader_ApplicationHEX(long ReaderHandle, unsigned char ICC_Slot_No , unsigned char* Command_APDU, unsigned char* Response_APDU);
用途:
接触 CPU 卡执行 apdu 命令 ,命令和返回数据都是以HEX字符串形式传入传出
参数:
ReaderHandle IN 接口句柄.
ICC_Slot_No:IN 卡座参数,具体表示如下
大卡座 :0x01;副卡座:0x02;SAM1:0x11;SAM2:0x12;SAM3:0x13;SAM4:0x14;
Command_APDU:IN APDU命令数据
Response_APDU:OUT apdu 命令执行后,响应的数据.
返回值:
大于 0 表示执行成功,其值为 Response_APDU 的数据长度.否则表示执行失败
例子:大卡座CPU卡执行命令
unsigned char cmd[8] = {“00a4000002EF11”};
int len = ICC_Reader_ApplicationHEX(hReader, 0x01, cmd, PowerRes);
3.7 long WINAPI ICC_SetCpupara(long ReaderHandle,unsigned char ICC_Slot_No,unsigned char cpupro,unsigned char cpuetu)
用途:
设置接触 CPU 卡波特率. 参数:
ReaderHandle:IN 接口句柄.
ICC_Slot_No:IN 卡座参数,具体表示如下
大卡座 :0x01;副卡座:0x02;SAM1:0x11;SAM2:0x12;SAM3:0x13;SAM4:0x14;
Cpupro:IN 卡的协议类型 =0 表示 T=0 协议 =1 表示 T=1 协议
Cpuetu :IN cpuetu=01、02、03、04 代表的波特率分别为 9600、19200、38400、115200
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
//使用 T=0 协议,设置大卡座卡片波特率为 9600
ICC_SetCpupara(hReader, 0x01, 0x00, 0x01);
4 、4442卡片操作
4.1 long WINAPI ICC_Reader_4442_PowerOn(long ReaderHandle,unsigned char *data);
用途:
4442 卡上电.
参数:
ReaderHandle:IN 接口句柄
Data:OUT 上电返回数据内容 ,为4字节的厂商代码
返回值:
等于 0 表示执行成功.否则表示执行失败.
例子:
unsigned char data[256]; ICC_Reader_4442_PowerOn(hReader, data); //4442 卡上电
data[0]=0x92; data[1]=0x23; data[2]=0x10; data[3]=0x91;
4.2 long WINAPI ICC_Reader_4442_PowerOnHEX(long ReaderHandle,unsigned char *dataHex);
用途:
4442 卡上电,返回上电信息以HEX串形式
参数:
ReaderHandle:IN 接口句柄
dataHex:OUT 上电返回数据内容 ,为4字节的厂商代码
返回值:
等于 0 表示执行成功.否则表示执行失败.
例子:
unsigned char data[256];
ICC_Reader_4442_PowerOnHEX(hReader, data);//4442 卡上电
data=”92231091”;//伪代码
4.3 long WINAPI ICC_Reader_4442_PowerOff(long ReaderHandle);
用途:
4442 卡下电.
参数:
ReaderHandle :IN 接口句柄
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
ICC_Reader_4442_PowerOff (hReader); //4442 卡下电
4.4 long WINAPI ICC_Reader_4442_Read(long ReaderHandle,int offset,intlen,unsigned char *data);
用途:
读取 4442 卡的指定字段内容.
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
Data:OUT 数据内容(传出参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char data[8];
//读取 4442 卡从 0X10 位开始的 8 个字节数据
ICC_Reader_4442_Read(hReader, 0x10, 0x08, data);
4.5 long WINAPI ICC_Reader_4442_ReadHEX(long ReaderHandle,int offset,int len,unsigned char *dataHex);
用途:
读取 4442 卡的指定字段内容,返回数据以HEX串形式.
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
dataHex:OUT 数据内容(传出参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char data[8];
//读取 4442 卡从 0X10 位开始的 8 个字节数据
ICC_Reader_4442_ReadHEX(hReader, 0x10, 0x08, data);
Data=”1122334455667788”;
4.6 long WINAPI ICC_Reader_4442_ Write (long ReaderHandle,int offset,intlen,unsigned char *data);
用途:
写 4442 卡的指定字段内容.
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
Data:IN 数据内容(传入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char data[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
//写4442 卡从 0X10 位开始的 8 个字节数据
ICC_Reader_4442_Write(hReader, 0x10, 0x08, data);
4.7 long WINAPI ICC_Reader_4442_WriteHEX(long ReaderHandle,int offset,int len,unsigned char *dataHex);
用途:
写 4442 卡的指定字段内容,传入待写数据为HEX串形式
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
dataHex:IN 数据内容(传入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char data[18]=”1122334455667788”;//伪代码
//写4442 卡从 0X10 位开始的 8 个字节数据
ICC_Reader_4442_WriteHEX(hReader, 0x10, 0x08, data);
4.8 long WINAPI ICC_Reader_4442_Verify(long ReaderHandle,unsigned char*key);
用途:
4442 卡认证密钥
参数
ReaderHandle : IN 接口句柄
Key :IN 密钥数据(传入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char Key[4]={0xff,0xff,0xff};
//认证密钥,假设密钥值为ffffff
Int re = ICC_Reader_4442_Verify (hReader, Key);
4.9 long WINAPI ICC_Reader_4442_VerifyHEX(long ReaderHandle,unsigned char *keyHex);
用途:
4442 卡认证密钥,传入密钥为HEX串形式
参数
ReaderHandle : IN 接口句柄
keyHex:IN 密钥数据(传入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char Key[4]=“ffffff”;//伪代码
//认证密钥,假设密钥值为ffffff
Int re = ICC_Reader_4442_Verify HEX(hReader, Key);
4.10 long WINAPI ICC_Reader_4442_Change(long ReaderHandle,unsigned char*newkey);
用途:
4442 卡修改密钥 ,修改之前需先认证密钥
参数:
ReaderHandle:IN 接口句柄
Newkey:IN 新的密钥数据(传入参数)
返回值
等于 0 表示修改密钥成功,否则表示修改密钥失败.
例子:
unsigned char newKey[4]={0xff,0xff,0xff};
//认证密钥,假设密钥值为ffffff
Int re = ICC_Reader_4442_Change (hReader, newKey);
4.11 long WINAPI ICC_Reader_4442_ReadProtect(long ReaderHandle,int offset,int len,unsigned char *data);
用途:
读 4442 卡保护数据.
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址 需小于32
Len :IN 数据长度 需小于32 Offset Len 需小于32
Data:OUT 数据内容(传出参数) ,返回值为一串00或01的数据串,如果为00代表已写保护,如果为01代表未写保护。
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
Unsigned char data[35]={0};
Int re = ICC_Reader_4442_ReadProtect(hRead,0,32,data);
4.12 long WINAPI ICC_Reader_4442_WriteProtect(long ReaderHandle,int offset,int len,unsigned char *data);
用途:
向 4442 卡写保护数据 ,即固化数据,一旦写保护,数据将不能再修改
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址 需小于32
Len :IN 数据长度 需小于32 Offset Len 需小于32
Data:IN 数据内容(传入参数) ,数据值需和当前卡片内已存的数据一致,否则会导致写保护失败。
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:从20位置开始写保护
Unsigned char data[35]={0x11,0x22,0x33,0x44};
Int re = ICC_Reader_4442_WriteProtect(hRead,20,4,data);
4.13 long WINAPI ICC_Reader_4442_ReadCount(long ReaderHandle,int *count);
用途:
读取 4442 卡密钥剩余认证次
参数:
ReaderHandle:IN 接口句柄
Count:OUT 剩余密匙认证次数(传出参数)
返回值
等于 0 表示执行成功,否则表示执行失败.
例子:
//获取 4442 卡密钥剩余认证次数
int pCount = 0;
ICC_Reader_4442_ReadCount(hReader, &pCount);
5 、4428卡片操作
5.1 long WINAPI ICC_Reader_4428_PowerOn(long ReaderHandle,unsigned char *data);
用途:
4428 卡上电.
参数:
ReaderHandle:IN 接口句柄
Data:OUT 上电返回数据内容 ,为4字节的厂商代码
返回值:
等于 0 表示执行成功.否则表示执行失败.
例子:
unsigned char data[256]; ICC_Reader_4428_PowerOn(hReader, data); //4428 卡上电
5.2 long WINAPI ICC_Reader_4428_PowerOnHEX(long ReaderHandle,unsigned char *dataHex);
用途:
4428 卡上电,返回上电信息以HEX串形式
参数:
ReaderHandle:IN 接口句柄
dataHex:OUT 上电返回数据内容 ,为4字节的厂商代码
返回值:
等于 0 表示执行成功.否则表示执行失败.
例子:
unsigned char data[256];
ICC_Reader_4428_PowerOnHEX(hReader, data);//4428 卡上电
data=”92231091”;//伪代码
5.3 long WINAPI ICC_Reader_4428_PowerOff(long ReaderHandle);
用途:
4428 卡下电.
参数:
ReaderHandle :IN 接口句柄
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
ICC_Reader_4428_PowerOff (hReader); //4428 卡下电
5.4 long WINAPI ICC_Reader_4428_Read(long ReaderHandle,int offset,intlen,unsigned char *data);
用途:
读取 4428 卡的指定字段内容.
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
Data:OUT 数据内容(传出参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char data[8];
//读取 4428 卡从 0X10 位开始的 8 个字节数据
ICC_Reader_4428_Read(hReader, 0x10, 0x08, data);
Data={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};伪代码
【实例截图】
【核心代码】
5.5 long WINAPI ICC_Reader_4428_ReadHEX(long ReaderHandle,int offset,int len,unsigned char *dataHex);
用途:
读取 4428 卡的指定字段内容,返回数据以HEX串形式.
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
dataHex:OUT 数据内容(传出参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char data[8];
//读取 4428 卡从 0X10 位开始的 8 个字节数据
ICC_Reader_4428_ReadHEX(hReader, 0x10, 0x08, data);
Data=”1122334455667788”;
5.6 long WINAPI ICC_Reader_4428_ Write (long ReaderHandle,int offset,intlen,unsigned char *data);
用途:
写 4428 卡的指定字段内容.
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
Data:IN 数据内容(传入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char data[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
//写4428 卡从 0X10 位开始的 8 个字节数据
ICC_Reader_4428_Write(hReader, 0x10, 0x08, data);
5.7 long WINAPI ICC_Reader_4428_WriteHEX(long ReaderHandle,int offset,int len,unsigned char *dataHex);
用途:
写 4428 卡的指定字段内容,传入待写数据为HEX串形式
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
dataHex:IN 数据内容(传入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char data[18]=”1122334455667788”;//伪代码
//写4428 卡从 0X10 位开始的 8 个字节数据
ICC_Reader_4428_WriteHEX(hReader, 0x10, 0x08, data);
5.8 long WINAPI ICC_Reader_4428_Verify(long ReaderHandle,unsigned char*key);
用途:
4428 卡认证密钥
参数
ReaderHandle : IN 接口句柄
Key :IN 密钥数据(传入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char Key[4]={0xff,0xff};
//认证密钥,假设密钥值为fffff
Int re = ICC_Reader_4428_Verify (hReader, Key);
5.9 long WINAPI ICC_Reader_4428_VerifyHEX(long ReaderHandle,unsigned char *keyHex);
用途:
4428 卡认证密钥,传入密钥为HEX串形式
参数
ReaderHandle : IN 接口句柄
keyHex:IN 密钥数据(传入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
unsigned char Key[4]=“ffffff”;//伪代码
//认证密钥,假设密钥值为ffffff
Int re = ICC_Reader_4428_Verify HEX(hReader, Key);
5.10 long WINAPI ICC_Reader_4428_Change(long ReaderHandle,unsigned char*newkey);
用途:
4428卡修改密钥 ,修改之前需先认证密钥
参数:
ReaderHandle:IN 接口句柄
Newkey:IN 新的密钥数据(传入参数)
返回值
等于 0 表示修改密钥成功,否则表示修改密钥失败.
例子:
unsigned char newKey[4]={0xff,0xff};
//认证密钥,假设密钥值为ffff
Int re = ICC_Reader_4428_Change (hReader, newKey);
5.11 long WINAPI ICC_Reader_4428_ReadProtect(long ReaderHandle,int offset,int len,unsigned char *data);
用途:
读 4428 卡保护数据.
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址 需小于1024
Len :IN 数据长度 需小于1024 Offset Len 需小于1024
Data:OUT 数据内容(传出参数) ,返回值为一串00或01的数据串,如果为00代表已写保护,如果为01代表未写保护。
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
Unsigned char data[35]={0};
Int re = ICC_Reader_4428_ReadProtect(hRead,0,32,data);
5.12 long WINAPI ICC_Reader_4428_WriteProtect(long ReaderHandle,int offset,int len,unsigned char *data);
用途:
向 4428 卡写保护数据 ,即固化数据,一旦写保护,数据将不能再修改
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址 需小于1024
Len :IN 数据长度 需小于1024 Offset Len 需小于1024
Data:IN 数据内容(传入参数) ,数据值需和当前卡片内已存的数据一致,否则会导致写保护失败。
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:从20位置开始写保护
Unsigned char data[35]={0x11,0x22,0x33,0x44};
Int re = ICC_Reader_4428_WriteProtect(hRead,20,4,data);
5.13 long WINAPI ICC_Reader_4428_ReadCount(long ReaderHandle,int *count);
用途:
读取 4428 卡密钥剩余认证次
参数:
ReaderHandle:IN 接口句柄
Count:OUT 剩余密匙认证次数(传出参数)
返回值
等于 0 表示执行成功,否则表示执行失败.
例子:
//获取 4428 卡密钥剩余认证次数
int pCount = 0;
ICC_Reader_4428_ReadCount(hReader, &pCount);
6 、24CXX卡片操作
6.1 long WINAPI ICC_Reader_24c_PowerOn(long ReaderHandle,unsigned char *data,unsigned char flag);
用途:
24CXX卡上电.
参数:
ReaderHandle:IN 接口句柄
Data:OUT 上电返回数据内容 ,为4字节的厂商代码
Flag: IN flag=0为24C01~16 flag=1为24C32~1024
返回值:
等于 0 表示执行成功.否则表示执行失败.
6.2 long WINAPI ICC_Reader_24c_PowerOff(long ReaderHandle,unsigned char flag);
用途:
24CXX卡下电.
参数:
ReaderHandle:IN 接口句柄
Flag: IN flag=0为24C01~16 flag=1为24C32~1024
返回值:
等于 0 表示执行成功.否则表示执行失败.
6.3 long WINAPI ICC_Reader_24c_Read(long ReaderHandle,int offset,int len,unsigned char *data,unsigned char flag);
用途:
24CXX卡读卡 ,从指定位置开始读取指定个数的数据
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
Data:OUT 数据内容(传出参数)
Flag: IN flag=0为24C01~16 flag=1为24C32~1024
返回值:
等于 0 表示执行成功,否则表示执行失败.
6.4 long WINAPI ICC_Reader_24c_Write (long ReaderHandle,int offset,int len,unsigned char *data,unsigned char flag);
用途:
24CXX卡写卡 ,从指定位置开始写入指定个数的数据
参数:
ReaderHandle:IN 接口句柄
Offset:IN 起始地址
Len :IN 数据长度
Data:IN 数据内容(传入参数)
Flag: IN flag=0为24C01~16 flag=1为24C32~1024
返回值:
等于 0 表示执行成功,否则表示执行失败.
7 、非接基本操作函数(非接前置步骤)
7.1 long WINAPI PICC_Reader_SetTypeA(long ReaderHandle);
函数功能:
设置读写器为读 typeA 卡
参数:
ReaderHandle :IN 设备句柄,设备打开函数 ICC_Reader_Open的返回值
返回值:
等于 0 表示执行成功,否则表示执行失败.
7.2 long WINAPI PICC_Reader_SetTypeB(long ReaderHandle);
函数功能:
设置读写器为读 typeB 卡
参数:
ReaderHandle :IN 设备句柄,设备打开函数 ICC_Reader_Open的返回值
返回值:
等于 0 表示执行成功,否则表示执行失败.
7.3 long WINAPI PICC_Reader_Select(long ReaderHandle,unsigned char cardtype);
函数功能:
选择卡片
参数:
ReaderHandle :IN 设备句柄,设备打开函数 ICC_Reader_Open的返回值
Cardtype:IN 卡片类型(0x41 表示 typeA 及M1 卡,0x42 表示 typeB卡)
返回值:
等于 0 表示执行成功,否则表示执行失败.
7.4 long WINAPI PICC_Reader_Request(long ReaderHandle);
函数功能:
请求卡片
参数:
ReaderHandle :IN 设备句柄
返回值:
等于 0 表示执行成功,否则表示执行失败.
7.5 long WINAPI PICC_Reader_anticoll(long ReaderHandle,unsigned char *uid);
函数功能:
防碰撞
参数:
ReaderHandle:IN 设备句柄
Uid:OUT 输出参数(卡片 序列号)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
Unsigned char uid[10]={0};
Int re = PICC_Reader_anticoll(hRead,uid);
7.6 long WINAPI PICC_Reader_RFControl(long ReaderHandle, short flag );
函数功能:
非接天线关闭与开启
参数:
ReaderHandle :IN 设备句柄
flag :IN flag=0 表示关闭天线场强,flag=1表示开启天线
返回值:
等于 0 表示执行成功,否则表示执行失败.
7.7 long WINAPI PICC_Reader_FindCard (long ReaderHandle);
函数功能:
寻找读写器磁场区域是否有非接卡片
参数:
ReaderHandle:IN 设备句柄
返回值:
等于 0 表示执行成功,表示有卡片在磁场区域,非0,表示无卡.
例子:
Int re = PICC_Reader_FindCard(hRead);
8 、M1卡基本操作函数
8.1 long WINAPI PICC_Reader_Authentication(long ReaderHandle,unsigned charMode, unsigned char SecNr); //不推荐使用
函数功能:
M1卡认证密钥,该函数自动调用存储于设备里面的Key进行认证;
参数:
ReaderHandle IN 设备句柄
Mode:IN 模式 (认证KeyA时为0,认证KeyB时为4)
SecNr :IN 扇区号 (0~15)
返回值:
等于 0 表示执行成功,否则表示执行失败.
例子:
Int re = PICC_Reader_Authentication(hReader,0,0);//认证0扇区的KeyA
8.2 long WINAPI PICC_Reader_Authentication _Pass (long ReaderHandle, unsigned charMode, unsigned char SecNr , unsigned char *PassWord); //推荐使用
函数功能:
M1卡认证密钥,该函数将使用参数PassWord传入的Key进行认证;
参数:
ReaderHandle IN 设备句柄
Mode:IN 模式 (认证KeyA时为0x60,认证KeyB时为0x61)
SecNr :IN 扇区号 (0~15)
PassWord:IN 6字节密钥
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char key[10]={0xff,0xff,0xff,0xff,0xff,0xff};
Int re = PICC_Reader_Authentication_Pass(hReader,0x60,0,key);//认证0扇区的KeyA
8.3 long WINAPI PICC_Reader_Read(long ReaderHandle,unsigned charAddr, unsigned char *Data);
函数功能:
读取M1卡片块数据
参数:
ReaderHandle :IN 设备句柄
Addr:IN 块号(S50该值范围0~63;S70该值范围0~255)
Data:OUT 输出参数(读取的数据)
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char data[20]={0};
Int re = PICC_Reader_Read(hReader ,10,data);//读取第10块数据
8.4 long WINAPI PICC_Reader_ReadHEX(long ReaderHandle,unsigned char Addr,unsigned char *DataHex);
函数功能:
读取M1卡块数据,返回数据格式是HEX字符串形式
参数:
ReaderHandle :IN 设备句柄
Addr:IN 块号(S50该值范围0~63;S70该值范围0~255)
DataHex:OUT 输出参数(读取的数据)
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char datahex[40]={0};
Int re = PICC_Reader_ReadHex(hReader ,10,datahex);//读取第10块数据
8.5 long WINAPI PICC_Reader_Write(long ReaderHandle,unsigned charAddr, unsigned char *Data);
函数功能:
写M1卡片块数据
参数:
ReaderHandle :IN 设备句柄
Addr:IN 块号(S50该值范围0~63;S70该值范围0~255)
Data:IN 输入参数(需要写入的数据)
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char data[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0a, 0x0b,0x0c,0x0d,0x0e,0x0f,0x00};//16字节
Int re = PICC_Reader_Write(hReader ,10,data);//写入第10块数据
8.6 long WINAPI PICC_Reader_WriteHEX(long ReaderHandle,unsigned charAddr, unsigned char *DataHex);
函数功能:
写M1卡片块数据,传入数据格式为HEX字符串
参数:
ReaderHandle :IN 设备句柄
Addr:IN 块号(S50该值范围0~63;S70该值范围0~255)
DataHex:IN 输入参数(需要写入的数据)
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char data[40]={“0102030405060708090a0b0c0d0e0f00”};//伪代码
Int re = PICC_Reader_WriteHEX(hReader ,10,data);//写入第10块数据
8.7 long WINAPI PICC_Reader_LoadKey(long ReaderHandle,unsigned char Mode,unsigned char SecNr,unsigned char *Key);//不推荐使用
函数功能:
装载密钥至设备里
参数:
ReaderHandle:IN 设备句柄
Mode:IN 密钥模式 KeyA 或 KeyB ,0 为 KeyA ,4 为 KeyB
SecNr:IN 扇区号(取值范围0~15)
Key:IN 待下载到设备的密钥 (输入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char key[10]={0xff,0xff,0xff,0xff,0xff,0xff};
Int re = PICC_Reader_LoadKey(hReader,0,0,key);//下载扇区0的KeyA密钥至设备里
8.8 long WINAPI PICC_Reader_LoadKeyHEX(long ReaderHandle,unsigned char Mode,unsigned char SecNr,unsigned char *KeyHex); //不推荐使用
函数功能:
装载密钥至设备里,密钥以HEX字符串形式传入
参数:
ReaderHandle:IN 设备句柄
Mode:IN 密钥模式 KeyA 或 KeyB ,0 为 KeyA ,4 为 KeyB
SecNr:IN 扇区号(取值范围0~15)
KeyHex:IN 待下载到设备的密钥 (输入参数)
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char keyHex[10]={“ffffffffffff”};//伪代码
Int re = PICC_Reader_LoadKeyHEX(hReader,0,0,keyHex);//下载扇区0的KeyA密钥至设备里
9 、非接CPU卡基本操作函数
9.1 long WINAPI PICC_Reader_PowerOnTypeA(long ReaderHandle,unsigned char* Response);
函数功能:
非接TypeA CPU卡上电复位
参数:
ReaderHandle :IN 设备句柄
Response:OUT 输出上电成功返回的卡片复位信息(ATR)
返回值:
成功大于0,返回参数 Response 的长度,小于等于 0 表示失败
9.2 long WINAPI PICC_Reader_PowerOnTypeB(long ReaderHandle,unsigned char* Response);
函数功能:
非接TypeB CPU卡上电复位
参数:
ReaderHandle :IN 设备句柄
Response:OUT 输出上电成功返回的卡片复位信息(ATR)
返回值:
成功大于0,返回参数 Response 的长度,小于等于 0 表示失败
9.3 long WINAPI PICC_Reader_Application(long ReaderHandle,long Lenth_of_Command_APDU, unsigned char* Command_APDU, unsigned char* Response_APDU);
函数功能:
TypeA/B 非接 CPU 卡执行 apdu 命令
参数:
ReaderHandle IN 接口句柄.
Lenth_of_Command_APDU:IN apdu命令长度
Command_APDU:IN APDU命令数据
Response_APDU:OUT apdu 命令执行后,响应的数据.
返回值:
大于 0 表示执行成功,其值为 Response_APDU 的数据长度.否则表示执行失败
例子:大卡座CPU卡执行命令
unsigned char cmd[8] = {0x00, 0xa4, 0x00, 0x00, 0x02, 0xEF, 0x11};
int len = PICC_Reader_Application(hReader, 7, cmd, PowerRes);
10 、磁条卡基本操作函数
10.1 long WINAPI Rcard(long ReaderHandle,unsigned char ctime,int track,unsigned char *rlen,char *getdata);
函数功能:
读磁条卡
参数:
ReaderHandle :IN 设备句柄
Ctime :IN 超时值
Track :IN 磁道,支持1~3轨的读
Rlen :OUT 返回的数据长度
Getdata :OUT 返回的磁条轨道数据
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char data[100]={0};//伪代码
Unsigned char len=0;
Int re = Rcard(hReader,20,2,&len,data);//读取磁卡2轨数据
11 、液晶屏基本操作函数
11.1 long WINAPI ICC_DispInfo(long ReaderHandle,unsigned char row,unsigned char list,char *data);
函数功能:
液晶屏显示信息
参数:
ReaderHandle :IN 设备句柄
Row:IN 将信息显示在液晶屏的第几行(0~7)
List:IN 将信息从第几列开始显示
Data:IN 要显示的信息
返回值:
等于 0 表示执行成功,否则表示执行失败
11.2 long WINAPI ICC_CtlLight(long ReaderHandle);
函数功能:
液晶屏清屏
参数:
ReaderHandle :IN 设备句柄
返回值:
等于 0 表示执行成功,否则表示执行失败
11.3 long WINAPI ICC_ChangeLight(long ReaderHandle,unsigned char mode);//改变屏幕亮度 mode=1 调亮 mode=0调暗
函数功能:
液晶屏清屏
参数:
ReaderHandle :IN 设备句柄
Mode:IN mode=1 调亮 mode=0调暗
返回值:
等于 0 表示执行成功,否则表示执行失败
12 、语音基本操作函数
12.1 long WINAPI ICC_DispSound(long ReaderHandle,unsigned char type,unsigned char nMode);
函数功能:
语音播报
参数:
ReaderHandle :IN 设备句柄
type:IN 语音类型取值范围(1~14) 1、请插卡 2、请刷卡 3、读卡错误 4、请输入密码 5、密码错误 6、操作成功 7、操作超时 8、操作失败 9、请取回卡 10、请重新输入密码 11、请再次输入密码 12、请输入新密码 13、请输入旧密码 14、请确认新密码
nMode:IN nMode=0内置键盘语音(键盘和设备集成一体),nMode=1外置键盘语音(键盘通过线外接)
返回值:
等于 0 表示执行成功,否则表示执行失败
13 、密码键盘基本操作函数
13.1 long WINAPI ICC_GetInputPass(long ReaderHandle, unsigned char ctime, unsigned char *rlen, unsigned char start,unsigned char stop,unsigned char * cpass);
函数功能:
通过密码键盘获取密码,该函数需要和语音函数协同使用,具体流程见附6
参数:
ReaderHandle :IN 设备句柄
Ctime :IN 超时值
Rlen :OUT 返回的数据长度
Start:IN start=0用内置键盘,start=1用外置键盘
Stop:IN 固定为Stop =1
cpass:OUT 从键盘获取的密码
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
Unsigned char pass[100]={0};//伪代码
Unsigned char len=0;
Int re = ICC_GetInputPass (hReader,20 ,&len, 0,1,pass);//内置键盘获取密码
14 、二代证基本操作函数
14.1 long WINAPI PICC_Reader_ReadIDMsg(long ReaderHandle, const char* pBmpFile, char *pName, char *pSex, char *pNation, char *pBirth, char *pAddress, char *pCertNo, char *pDepartment , char *pEffectData, char *pExpire,char * pErrMsg);
函数功能:
读取身份证信息
参数:
ReaderHandle :IN 设备句柄
pBmpFile:IN 如果pBmpFile==NULL,则不生成照片,如需生成照片,这里请传入路径。例如:C:/zhaopian/zp.bmp
pName:OUT 姓名
pSex:OUT 性别
pNation:OUT 民族
pBirth:OUT 出生日期
pAddress:OUT 家庭住址
pCertNo:OUT 身份证号
pDepartment:OUT 发证机关
pEffectData:OUT 发证日期
pExpire:OUT 有效日期
返回值:
等于 0 表示执行成功,否则表示执行失败
14.2 long WINAPI PICC_Reader_ReadIDInfo(long ReaderHandle, char* pBmpFileData, char *pName, char *pSex, char *pNation, char *pBirth, char *pAddress, char *pCertNo, char *pDepartment , char *pEffectData, char *pExpire,char * pErrMsg);
函数功能:
读取身份证信息
参数:
ReaderHandle :IN 设备句柄
pBmpFileData:IN 如果pBmpFileData==NULL,则不生成照片,如需生成照片,这里输出照片BMP数据十六进制数据流信息,需分配77725字节空间
pName:OUT 姓名
pSex:OUT 性别
pNation:OUT 民族
pBirth:OUT 出生日期
pAddress:OUT 家庭住址
pCertNo:OUT 身份证号
pDepartment:OUT 发证机关
pEffectData:OUT 发证日期
pExpire:OUT 有效日期
返回值:
等于 0 表示执行成功,否则表示执行失败
14.3 long WINAPI PICC_Reader_ReadIDPhotoInfo (long ReaderHandle, char* pBmpFileData, char *pName, char *pSex, char *pNation, char *pBirth, char *pAddress, char *pCertNo, char *pDepartment , char *pEffectData, char *pExpire,char * pErrMsg);
函数功能:
读取身份证信息
参数:
ReaderHandle :IN 设备句柄
pBmpFileData:IN 如果pBmpFileData==NULL,则不生成照片,如需生成照片,这里输出照片BASE64编码数据信息,需分配6025字节空间
pName:OUT 姓名
pSex:OUT 性别
pNation:OUT 民族
pBirth:OUT 出生日期
pAddress:OUT 家庭住址
pCertNo:OUT 身份证号
pDepartment:OUT 发证机关
pEffectData:OUT 发证日期
pExpire:OUT 有效日期
返回值:
等于 0 表示执行成功,否则表示执行失败
14.4 long WINAPI PICC_Reader_ID_ReadUID(long ReaderHandle, char* Response);
函数功能:
读身份证ID
参数:
ReaderHandle:IN 设备句柄
Response:OUT 身份证ID ,8字节共16位字符串数据流
返回值:
等于 0 表示执行成功,否则表示执行失败
15 、辅助功能函数
15.1 long WINAPI StrToHex(unsigned char *strIn,int inLen,unsigned char *strOut);
函数功能:
将字符命令流转为16进制流
参数:
strIn:IN 输入的待转换数据,格式例如:”11223344”
inLen:IN 输入数据的长度
strOut:OUT 输出的数据,输出数据的长度为输入数据长度的一半。
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
strIn = “11223344”;
inLen = 8 ;
int re = StrToHex(strIn,inLen,strOut);
结果:strOut[0]=0x11;
strOut[1]=0x22;
strOut[2]=0x33;
strOut[3]=0x44;
15.2 long WINAPI HexToStr (unsigned char *strIn,int inLen,unsigned char *strOut);
函数功能:
将16进制命令流转为字符流
参数:
strIn:IN 输入的待转换数据
inLen:IN 输入数据的长度
strOut:OUT 输出的数据,输出数据的长度为输入数据长度的2倍。
返回值:
等于 0 表示执行成功,否则表示执行失败
例子:
strIn = {0x11,0x22,0x33,0x44};
inLen = 4;
int re = HexToStr (strIn,inLen,strOut);
结果:strOut=”11223344”;
16 、附录卡片操作要点
常见卡 类型大致区分:
1. 社会保障卡:接触CPU卡
2. 就诊卡:M1卡或者磁条卡
3. 银行卡:接触/非接CPU、磁条
4. 会员卡:M1/磁条卡/其它
5. 交通卡:非接CPU卡
16.1 附1:typeACPU 卡操作顺序
1 设置为TypeA卡片
2 请求卡片
3 防碰撞
4 选择卡片
5 上电
6 APDU 命令
16.2 附2:typeB 卡操作顺序
1 设置为TypeB卡片
2 上电
3 选卡
4 APDU 命令
16.3 附3:M1卡操作顺序
1 设置为TypeA卡片
2 请求卡片
3 防碰撞
4 选择卡片
5 认证密钥
6 读或写
16.4 附4:4442/4428卡片操作顺序
1 上电复位
2 认证
3 读或写
16.5 附5:接触CPU卡操作顺序
1 上电
2 APDU 命令
16.6 附6:获取密码键盘流程
1 调用语音函数播放需要的类型的语音
2 调用获取密码键盘函数
【实例截图】
【核心代码】
.
├── SSSE32动态库(2018)
│ ├── BmpToJpg.dll
│ ├── SSSE32.H
│ ├── SSSE32.dll
│ ├── SSSE32.lib
│ ├── UnPack.dll
│ └── 读写器SSSE32函数说明文档2018.doc
└── 好例子网_SSSE32动态库__说明文档(2018).zip
1 directory, 7 files
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论