package com.dpkj.modules.cardReader.utils; import com.dpkj.modules.autoReplyPrint.utils.AutoReplyPrint; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; public interface CardReaderSdk extends Library { CardReaderSdk INSTANCE = (CardReaderSdk) Native.loadLibrary(GetLibraryPath_Helper.GetLibraryPath(), CardReaderSdk.class); /** * 连接指定设备与电脑端口,即打开端口 * * @param devName 接口名称,如”USB1” * @return >0成功,<=0失败 */ int ICC_Reader_Open(String devName); /** * 关闭已打开的电脑接口 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @return =0成功,非0失败 */ int ICC_Reader_Close(int ReaderHandle); /** * 读写器产生蜂鸣 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param time 蜂鸣时间,以毫秒为单位 * @return =0成功,非0失败 */ int ICC_PosBeep(int ReaderHandle, int time); /** * 获取动态库及设备版本信息 * * @return 设备及动态库版本信息 =0成功,非0失败 */ int ICC_Reader_Libinfo(); /** * 从EEPROM读取数据 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param offset 偏移地址(起始地址) * @param length 要读取的数据的长度 * @return 读取的数据 =0成功,非0失败 */ int ICC_Reader_ReadEEPROM(int ReaderHandle, int offset, int length); /** * 往EEPROM写入数据 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param offset 偏移地址(起始地址) * @param length 要写入的数据的长度 * @param buffer 待写入的数据 * @return =0成功,非0失败 */ int ICC_Reader_WriteEEPROM(int ReaderHandle, int offset, int length, String buffer); /** * 播放语音(SSSE32.dll暴露函数中未发现该函数,但是文档中有) * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param voiceType 语音类型: * 1、请插卡 * 2、请刷卡 * 3、读卡错误 * 4、请输入密码 * 5、密码错误 * 6、操作成功 * 7、操作超时 * 8、操作失败 * 9、请取回卡 * 10、请重新输入密码 * 11、请再次输入密码 * 12、请输入新密码 * 13、请输入旧密码 * 14、请确认新密码 * @return =0成功,非0失败 */ @Deprecated int ICC_Reader_DispSound(int ReaderHandle, String voiceType); /** * 接触 CPU 卡上电复位,返回值数据格式为十六进制字符串 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param ICCSlotNo ICC插槽号 0x01 :大卡座 ; * 0x02 :副卡座 ; * 0x11:SAM1卡座; * 0x12:SAM2卡座; * 0x13:SAM3卡座; * 0x14:SAM4卡座 * 0x3x:非接CPU卡 * @return 上电返回ATR值,数据格式为十六进制字符串 */ int ICC_Reader_PowerOnHEX(int ReaderHandle, String ICCSlotNo); /** * CPU 卡下电 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param ICCSlotNo ICC插槽号 0x01 :大卡座 ; * 0x02 :副卡座 ; * 0x11:SAM1卡座; * 0x12:SAM2卡座; * 0x13:SAM3卡座; * 0x14:SAM4卡座 * 0x3x:非接CPU卡 * @return =0成功,非0失败 */ int ICC_Reader_PowerOff(int ReaderHandle, String ICCSlotNo); /** * 获取卡座状态 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param ICCSlotNo ICC插槽号 0x01 :大卡座 ; * 0x02 :副卡座 ; * 0x11:SAM1卡座; * 0x12:SAM2卡座; * 0x13:SAM3卡座; * 0x14:SAM4卡座 * 0x3x:非接CPU卡 * @return = 0 表示卡座有卡,其他见状态码 */ int ICC_Reader_GetStatus(int ReaderHandle, String ICCSlotNo); /** * 接触 CPU 卡执行APDU命令 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param ICCSlotNo ICC插槽号 0x01 :大卡座 ; * 0x02 :副卡座 ; * 0x11:SAM1卡座; * 0x12:SAM2卡座; * 0x13:SAM3卡座; * 0x14:SAM4卡座 * 0x3x:非接CPU卡 * @param CommandAPDU APDU命令数据,以十六进制字符串形式输入 * @return 大于 0 表示执行成功,其值为 Response_APDU 的数据长度.否则表示执行失败 */ int ICC_Reader_ApplicationHEX(int ReaderHandle, String ICCSlotNo, String CommandAPDU); /** * 4442卡片上电,数据以十六进制字符串输出 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @return 返回卡片上电信息 = 0 表示成功,非0失败 */ int ICC_Reader_4428_PowerOnHEX(int ReaderHandle); /** * 4442卡片下电 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @return = 0 表示成功,非0失败 */ int ICC_Reader_4442_PowerOff(int ReaderHandle); /** * 读取4442卡的指定字段内容,以十六进制字符串输出 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param offset 起始地址,需小于256 * @param len 数据长度,offset+len需小于256 * @return 返回卡片读取信息 = 0 表示成功,非0失败 */ int ICC_Reader_4428_ReadHEX(int ReaderHandle, int offset, int len); /** * 写 4442 卡的指定字段内容,以十六进制字符串输入参数 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param offset 起始地址,需小于256 * @param len 数据长度,offset+len需小于256 * @param data 待写入卡片数据 * @return 返回卡片读取信息 = 0 表示成功,非0失败 */ int ICC_Reader_4428_WriteHEX(int ReaderHandle, int offset, int len, String data); /** * 4442卡认证密钥 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param keyHex 卡密钥 * @return = 0 表示成功,非0失败 */ int ICC_Reader_4442_Verify(int ReaderHandle, String keyHex); /** ----- 非接触操作函数 -------------- */ /** * 查找天线磁场区域内有无卡,只有卡片上电后才能查找到 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @return = 0 表示成功,非0失败 */ int PICC_Reader_Request(int ReaderHandle); /** * 天线操作 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param flag 00-关场强 01-开场强 * @return = 0 表示成功,非0失败 */ int PICC_Reader_RFControl(int ReaderHandle, String flag); /** --------------- 非接 CPU 卡操作函数 ------------ */ /** * 非接TypeA CPU卡上电复位,输出十六进制字符串(SSSE32.dll暴露函数中未发现该函数,但是文档中有) * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @return 输出上电成功返回的卡片复位信息(ATS) 返回ATS长度,大于0 表示成功,其他失败 */ @Deprecated int PICC_Reader_PowerOnTypeAHEX(int ReaderHandle); /** * 非接TypeB CPU卡上电复位,输出十六进制字符串(SSSE32.dll暴露函数中未发现该函数,但是文档中有) * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @return 输出上电成功返回的卡片复位信息(ATS) 返回ATS长度,大于0 表示成功,其他失败 */ @Deprecated int PICC_Reader_PowerOnTypeBHEX(int ReaderHandle); /** * 非接触 CPU 卡执行APDU命令,命令以十六进制字符串传输(SSSE32.dll暴露函数中未发现该函数,但是文档中有) * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @param CommandAPDU APDU命令数据,以十六进制字符串形式输入 * @return APDU命令执行后, 响应的数据, 返回数据为十六进制字符串 * 大于 0 表示执行成功,其值为 Response_APDU 的数据长度.否则表示执行失败 */ @Deprecated int PICC_Reader_ApplicationHEX(int ReaderHandle, String CommandAPDU); /** ---------------- 二代证/外国人居留证/港澳台居住证 --------------- */ /** * 读取身份证物理ID号 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @return 返回身份证物理ID信息 = 0 表示成功,非0失败 */ int PICC_Reader_Read_CardID(int ReaderHandle, byte[] response); /** * 读取身份证物理ID号 * * @param ReaderHandle ICCReaderOpen函数所返回的值 * @return 返回错误信息 = 0 表示成功,非0失败 */ int PICC_Reader_ReadIDCard(int ReaderHandle, byte[] response); /** 以下函数须在 “PICC_Reader_ReadIDCard” 函数执行成功之后调用,否则获取不到有效信息 */ /** * 获取证件类型 * * @return 0:居民身份证 * 1:外国人永久居留证 * 2:港澳台居民居住证 * 4:新外国人永久居留证 */ int GetCardType(); /** * 姓名(类型为 1 时表示:外国人中文姓名) */ int GetName(byte[] outParam); /** * 性别 */ int GetSex(byte[] outParam); /** * 民族 */ int GetNation(byte[] outParam); /** * 出生日期 */ int GetBirth(byte[] outParam); /** * 住址 */ int GetAddress(byte[] outParam); /** * 公民身份证号码(类型为 1时表示:外国人居留证号码) */ int GetCertNo(byte[] outParam); /** * 签发机关 */ int GetDepartemt(byte[] outParam); /** * 有效起始日期 */ int GetEffectDate(byte[] outParam); /** * 有效截止日期 */ int GetExpireDate(byte[] outParam); /** * bmp 格式照片数据 */ int GetBmpFileData(byte[] outParam); /** * 生成照片 * TODO 入参参考文中3.4.1 */ int GetBmpFile(byte[] outParam); /** * 是否含存在指纹信息:存在时返回 512 或者 1024 * 不存在时返回 0 */ int IsFingerExist(); /** * 获取指纹数据:成功时返回获取到的字节长度 */ int GetFingerprint(byte[] outParam); /** * 外国人英文姓名 */ int GetEnName(byte[] outParam); /** * 外国人国籍代码,符合GB/T2659-2000规定 */ int GetNationalityCode(byte[] outParam); /** * 港澳台通行证号码 */ int GetTXZHM(byte[] outParam); /** * 港澳台通行证签发次数 */ int GetTXZQFCS(byte[] outParam); /** * 外国人换证次数 */ int GetHZCS(byte[] outParam); /** ------------ 社保卡 ---------*/ /** * 选择社保卡社会保障系统环境后,通过 PSAM 卡对社保卡进行内部认证,通过后将卡内的基本信息读出返回。 * * @param iType 操作卡的类型 * 1-接触式操作卡; * 2-非接触式操作卡; * 3-自动寻卡,接触式操作卡优先; * 4-自动寻卡,非接触式操作卡优先 * @return */ int iReadCardBas(int iType, byte[] data); /** * 基于加密机的读基本信息(步骤一) * 选择社会保障系统环境后,返回内部认证和外部认证所需信息。 * * @param iType 操作卡的类型 * 1-接触式操作卡; * 2-非接触式操作卡; * 3-自动寻卡,接触式操作卡优先; * 4-自动寻卡,非接触式操作卡优先 * @return */ int iReadCardBas_HSM_Step1(int iType, byte[] data); /** * 基于加密机的读基本信息(步骤二) * 根据加密机返回的内部认证和外部认证结果数据对社保卡进行内部认证和外部认证,通过后将卡内的基本信息读出返回。 * * @param pKey 加密机返回的内部认证和外部认证结果数据,依次为:内部认证结果数据 * (即内部认证鉴别数据(16 位)和内部认证鉴别所需的原始信息(16 位)拼接组 * 成)、外部认证结果数据(即外部认证鉴别数据(16 位)和外部认证鉴别所需的 * 原始信息(16 位)拼接组成)。各数据项之间以“|”分割,且最后一个数据项以“|”结尾。 * @return */ public int iReadCardBas_HSM_Step2(byte[] pKey, byte[] pOutInfo); public static class GetLibraryPath_Helper { public GetLibraryPath_Helper() { } private static String GetLibraryPath() { // if (Platform.isWindows()) { // return Platform.is64Bit() ? "/win32-x86-64/QXSSSE32_x64.dll" : "/win32-x86-64/QXSSSE32_x64.dll"; // } else if (Platform.isLinux()) { // return Platform.is64Bit() ? "/win32-x86-64/QXSSSE32_x64.so" : "/win32-x86-64/QXSSSE32_x64.so"; // } else { // return Platform.isMac() ? "/win32-x86-64/QXSSSE32_x64.so" : "/win32-x86-64/QXSSSE32_x64.so"; // } return "/win32-x86-64/SSSE32.dll"; } } //社保卡 public int PICC_Reader_SSCardInfo1(int ReaderHandle, byte[] SBKH, byte[] SHBZHM, byte[] XM, byte[] XB, byte[] CSRQ ); //身份证 public int PICC_Reader_ReadIDInfo(int ReaderHandle, String filepath, byte[] pName, byte[] pSex, byte[] pNation, byte[] pBirth, byte[] pAddress, byte[] pCertNo, byte[] pDepartment , byte[] pEffectData, byte[] pExpire, byte[] pErrMsg); public int ICC_SelscetScan(int ReaderHandle, byte[] pCodeInfo , int [] lent); public int iGetDevUID(byte[] pOutInfo); }