待64位动态库及开发包支撑测试

This commit is contained in:
王志成 2025-01-21 17:40:05 +08:00
parent 12ae2323f7
commit 6ca1cdce4b
4 changed files with 274 additions and 96 deletions

View File

@ -20,7 +20,8 @@ public class CardReaderController {
private CardReaderService cardReaderService;
/**
* 连接设备
* 连接设备并读取身份证信息
*
* @return
*/
@GetMapping("connectedDevice")
@ -34,4 +35,21 @@ public class CardReaderController {
}
}
/**
* 连接设备并读取社保卡信息
*
* @return
*/
@GetMapping("readSocialSecurityCard")
public Result<?> readSocialSecurityCard(@RequestParam(name = "devName") String devName) {
try {
return cardReaderService.readSocialSecurityCard(devName);
} catch (Exception e) {
e.printStackTrace();
log.info("连接设备并读取社保卡信息失败 {}", e.getMessage());
return Result.error("连接设备并读取社保卡信息失败");
}
}
}

View File

@ -6,4 +6,6 @@ import com.dpkj.common.vo.Result;
public interface CardReaderService {
Result<?> connectedDevice(String devName);
Result<?> readSocialSecurityCard(String devName);
}

View File

@ -2,6 +2,7 @@ package com.dpkj.modules.cardReader.service.impl;
import com.dpkj.common.vo.Result;
import com.dpkj.modules.cardReader.service.CardReaderService;
import com.dpkj.modules.cardReader.utils.CardReaderSdk;
import com.dpkj.modules.cardReader.utils.CardReaderUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -18,8 +19,124 @@ public class CardReaderServiceImpl implements CardReaderService {
@Override
public Result<?> connectedDevice(String devName) {
Long aLong = cardReaderSdk.ICC_Reader_Open(devName);
log.info("连接状态{}", aLong);
Long aLong = null;
try {
// 连接指定设备与电脑端口即打开端口
// aLong = cardReaderSdk.ICC_Reader_Open(devName);
aLong = CardReaderSdk.INSTANCE.ICC_Reader_Open(devName);
log.info("连接指定设备与电脑端口,即打开端口:{}", aLong);
// 读取身份证物理ID号
// Long cardId = cardReaderSdk.PICC_Reader_Read_CardID(aLong);
Long cardId = CardReaderSdk.INSTANCE.PICC_Reader_Read_CardID(aLong);
log.info("读取身份证物理ID号:{}", cardId);
// 读取身份证物理ID号
// Long idCard = cardReaderSdk.PICC_Reader_ReadIDCard(aLong);
Long idCard = CardReaderSdk.INSTANCE.PICC_Reader_ReadIDCard(aLong);
log.info("读取身份证物理ID号:{}", idCard);
if (cardId != null) {
// 获取证件类型
// Integer cardType = cardReaderSdk.GetCardType(idCard.toString());
Integer cardType = CardReaderSdk.INSTANCE.GetCardType();
log.info("获取证件类型:{}", cardType);
// 姓名(类型为 1 时表示外国人中文姓名)
// Integer name = cardReaderSdk.GetName(idCard.toString());
Integer name = CardReaderSdk.INSTANCE.GetName(idCard.toString());
log.info("姓名:{}", name);
// 性别
// Integer sex = cardReaderSdk.GetSex(idCard.toString());
Integer sex = CardReaderSdk.INSTANCE.GetSex(idCard.toString());
log.info("性别:{}", sex);
// 民族
// Integer nation = cardReaderSdk.GetNation(idCard.toString());
Integer nation = CardReaderSdk.INSTANCE.GetNation(idCard.toString());
log.info("民族:{}", nation);
// 出生日期
// Integer birth = cardReaderSdk.GetBirth(idCard.toString());
Integer birth = CardReaderSdk.INSTANCE.GetBirth(idCard.toString());
log.info("出生日期:{}", birth);
// 住址
// Integer address = cardReaderSdk.GetAddress(idCard.toString());
Integer address = CardReaderSdk.INSTANCE.GetAddress(idCard.toString());
log.info("住址:{}", address);
// 公民身份证号码(类型为 1时表示外国人居留证号码)
// Integer certNo = cardReaderSdk.GetCertNo(idCard.toString());
Integer certNo = CardReaderSdk.INSTANCE.GetCertNo(idCard.toString());
log.info("公民身份证号码:{}", certNo);
// 签发机关
// Integer departemt = cardReaderSdk.GetDepartemt(idCard.toString());
Integer departemt = CardReaderSdk.INSTANCE.GetDepartemt(idCard.toString());
log.info("签发机关:{}", departemt);
// 有效起始日期
// Integer effectDate = cardReaderSdk.GetEffectDate(idCard.toString());
Integer effectDate = CardReaderSdk.INSTANCE.GetEffectDate(idCard.toString());
log.info("有效起始日期:{}", effectDate);
// 有效截止日期
// Integer expireDate = cardReaderSdk.GetExpireDate(idCard.toString());
Integer expireDate = CardReaderSdk.INSTANCE.GetExpireDate(idCard.toString());
log.info("有效截止日期:{}", expireDate);
// bmp 格式照片数据
String bmpFileData = cardReaderSdk.GetBmpFileData(cardId.toString());
log.info("bmp 格式照片数据:{}", bmpFileData);
// 生成照片
Integer bmpFile = cardReaderSdk.GetBmpFile(bmpFileData);
log.info("生成照片:{}", bmpFile);
// 是否含存在指纹信息存在时返回 512 或者 1024 不存在时返回 0
Integer isFingerExist = cardReaderSdk.IsFingerExist();
log.info("是否含存在指纹信息:{}", isFingerExist);
if (isFingerExist != 0) {
// 获取指纹数据成功时返回获取到的字节长度
Integer fingerprint = cardReaderSdk.GetFingerprint(isFingerExist.toString());
log.info("获取指纹数据:{}", fingerprint);
}
if (cardType == 1) {
// 外国人英文姓名
Integer enName = cardReaderSdk.GetEnName(cardId.toString());
log.info("外国人英文姓名:{}", enName);
// 外国人国籍代码符合GB/T2659-2000规定
Integer nationalityCode = cardReaderSdk.GetNationalityCode(cardId.toString());
log.info("外国人国籍代码:{}", nationalityCode);
// 外国人换证次数
Integer hzcs = cardReaderSdk.GetHZCS(cardId.toString());
log.info("外国人换证次数:{}", hzcs);
} else if (cardType == 2) {
// 港澳台通行证号码
Integer txzhm = cardReaderSdk.GetTXZHM(cardId.toString());
log.info("港澳台通行证号码:{}", txzhm);
// 港澳台通行证签发次数
Integer txzqfcs = cardReaderSdk.GetTXZQFCS(cardId.toString());
log.info("港澳台通行证签发次数:{}", txzqfcs);
}
}
} catch (Error e) {
log.error("Error occurred during card reader operation: ", e);
if (aLong != null) {
// 关闭端口
cardReaderSdk.ICC_Reader_Close(aLong);
}
return Result.error("操作失败:" + e.getMessage());
}
return Result.ok(aLong);
}
@Override
public Result<?> readSocialSecurityCard(String devName) {
Long aLong = null;
try {
// 连接指定设备与电脑端口即打开端口
aLong = cardReaderSdk.ICC_Reader_Open(devName);
log.info("连接指定设备与电脑端口,即打开端口:{}", aLong);
// 读基本信息
String bas = cardReaderSdk.iReadCardBas(1);
log.info("读基本信息:{}", bas);
} catch (Exception e) {
log.error("Error occurred during card reader operation: ", e);
if (aLong != null) {
// 关闭端口
cardReaderSdk.ICC_Reader_Close(aLong);
}
return Result.error("操作失败:" + e.getMessage());
}
return null;
}
}

View File

@ -2,6 +2,7 @@ package com.dpkj.modules.cardReader.utils;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@ -15,9 +16,8 @@ public class CardReaderUtil {
*/
public static CardReaderSdk getCardReaderSDK() throws CardReaderRegistrationException {
try {
return Native.load("UnPack", CardReaderSdk.class);
//return Native.load("SSSE32", CardReaderSdk.class);
//return Native.load("autoreplyprint", CardReaderSdk.class);
// return Native.load("UnPack", CardReaderSdk.class);
return Native.load("SSSE32", CardReaderSdk.class);
} catch (UnsatisfiedLinkError e) {
log.info("[CardReader][AutoReplyPrint2.getCardReaderSDK] SDK注册失败 {}", e.getMessage());
throw new CardReaderRegistrationException("Failed to load CardReaderSdk library: ", e);
@ -35,15 +35,16 @@ public class CardReaderUtil {
public interface CardReaderSdk extends Library {
/**
* 连接指定设备与电脑端口即打开端口
*
* @param devName 接口名称USB1
* @return >0成功<=0失败
*/
Long ICC_Reader_Open(String devName);
/**
* 关闭已打开的电脑接口
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @return =0成功非0失败
*/
@ -52,8 +53,9 @@ public class CardReaderUtil {
/**
* 读写器产生蜂鸣
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param time 蜂鸣时间以毫秒为单位
* @param time 蜂鸣时间以毫秒为单位
* @return =0成功非0失败
*/
Long ICC_PosBeep(Long ReaderHandle, Long time);
@ -61,6 +63,7 @@ public class CardReaderUtil {
/**
* 获取动态库及设备版本信息
*
* @return 设备及动态库版本信息 =0成功非0失败
*/
Long ICC_Reader_Libinfo();
@ -68,9 +71,10 @@ public class CardReaderUtil {
/**
* 从EEPROM读取数据
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param offset 偏移地址(起始地址)
* @param length 要读取的数据的长度
* @param offset 偏移地址(起始地址)
* @param length 要读取的数据的长度
* @return 读取的数据 =0成功非0失败
*/
Long ICC_Reader_ReadEEPROM(Long ReaderHandle, int offset, int length);
@ -78,10 +82,11 @@ public class CardReaderUtil {
/**
* 往EEPROM写入数据
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param offset 偏移地址(起始地址)
* @param length 要写入的数据的长度
* @param buffer 待写入的数据
* @param offset 偏移地址(起始地址)
* @param length 要写入的数据的长度
* @param buffer 待写入的数据
* @return =0成功非0失败
*/
Long ICC_Reader_WriteEEPROM(Long ReaderHandle, int offset, int length, String buffer);
@ -89,22 +94,23 @@ public class CardReaderUtil {
/**
* 播放语音SSSE32.dll暴露函数中未发现该函数但是文档中有
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param voiceType 语音类型
* 1请插卡
* 2请刷卡
* 3读卡错误
* 4请输入密码
* 5密码错误
* 6操作成功
* 7操作超时
* 8操作失败
* 9请取回卡
* 10请重新输入密码
* 11请再次输入密码
* 12请输入新密码
* 13请输入旧密码
* 14请确认新密码
* @param voiceType 语音类型
* 1请插卡
* 2请刷卡
* 3读卡错误
* 4请输入密码
* 5密码错误
* 6操作成功
* 7操作超时
* 8操作失败
* 9请取回卡
* 10请重新输入密码
* 11请再次输入密码
* 12请输入新密码
* 13请输入旧密码
* 14请确认新密码
* @return =0成功非0失败
*/
@Deprecated
@ -113,14 +119,15 @@ public class CardReaderUtil {
/**
* 接触 CPU 卡上电复位返回值数据格式为十六进制字符串
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param ICCSlotNo ICC插槽号 0x01 大卡座
* 0x02 副卡座
* 0x11SAM1卡座
* 0x12SAM2卡座
* 0x13SAM3卡座
* 0x14SAM4卡座
* 0x3x非接CPU卡
* @param ICCSlotNo ICC插槽号 0x01 大卡座
* 0x02 副卡座
* 0x11SAM1卡座
* 0x12SAM2卡座
* 0x13SAM3卡座
* 0x14SAM4卡座
* 0x3x非接CPU卡
* @return 上电返回ATR值数据格式为十六进制字符串
*/
Long ICC_Reader_PowerOnHEX(Long ReaderHandle, String ICCSlotNo);
@ -128,14 +135,15 @@ public class CardReaderUtil {
/**
* CPU 卡下电
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param ICCSlotNo ICC插槽号 0x01 大卡座
* 0x02 副卡座
* 0x11SAM1卡座
* 0x12SAM2卡座
* 0x13SAM3卡座
* 0x14SAM4卡座
* 0x3x非接CPU卡
* @param ICCSlotNo ICC插槽号 0x01 大卡座
* 0x02 副卡座
* 0x11SAM1卡座
* 0x12SAM2卡座
* 0x13SAM3卡座
* 0x14SAM4卡座
* 0x3x非接CPU卡
* @return =0成功非0失败
*/
Long ICC_Reader_PowerOff(Long ReaderHandle, String ICCSlotNo);
@ -143,14 +151,15 @@ public class CardReaderUtil {
/**
* 获取卡座状态
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param ICCSlotNo ICC插槽号 0x01 大卡座
* 0x02 副卡座
* 0x11SAM1卡座
* 0x12SAM2卡座
* 0x13SAM3卡座
* 0x14SAM4卡座
* 0x3x非接CPU卡
* @param ICCSlotNo ICC插槽号 0x01 大卡座
* 0x02 副卡座
* 0x11SAM1卡座
* 0x12SAM2卡座
* 0x13SAM3卡座
* 0x14SAM4卡座
* 0x3x非接CPU卡
* @return = 0 表示卡座有卡,其他见状态码
*/
Long ICC_Reader_GetStatus(Long ReaderHandle, String ICCSlotNo);
@ -158,15 +167,16 @@ public class CardReaderUtil {
/**
* 接触 CPU 卡执行APDU命令
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param ICCSlotNo ICC插槽号 0x01 大卡座
* 0x02 副卡座
* 0x11SAM1卡座
* 0x12SAM2卡座
* 0x13SAM3卡座
* 0x14SAM4卡座
* 0x3x非接CPU卡
* @param CommandAPDU APDU命令数据以十六进制字符串形式输入
* @param ICCSlotNo ICC插槽号 0x01 大卡座
* 0x02 副卡座
* 0x11SAM1卡座
* 0x12SAM2卡座
* 0x13SAM3卡座
* 0x14SAM4卡座
* 0x3x非接CPU卡
* @param CommandAPDU APDU命令数据以十六进制字符串形式输入
* @return 大于 0 表示执行成功,其值为 Response_APDU 的数据长度.否则表示执行失败
*/
Long ICC_Reader_ApplicationHEX(Long ReaderHandle, String ICCSlotNo, String CommandAPDU);
@ -174,6 +184,7 @@ public class CardReaderUtil {
/**
* 4442卡片上电数据以十六进制字符串输出
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @return 返回卡片上电信息 = 0 表示成功,非0失败
*/
@ -182,6 +193,7 @@ public class CardReaderUtil {
/**
* 4442卡片下电
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @return = 0 表示成功,非0失败
*/
@ -190,9 +202,10 @@ public class CardReaderUtil {
/**
* 读取4442卡的指定字段内容,以十六进制字符串输出
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param offset 起始地址需小于256
* @param len 数据长度offset+len需小于256
* @param offset 起始地址需小于256
* @param len 数据长度offset+len需小于256
* @return 返回卡片读取信息 = 0 表示成功,非0失败
*/
Long ICC_Reader_4428_ReadHEX(Long ReaderHandle, int offset, int len);
@ -200,10 +213,11 @@ public class CardReaderUtil {
/**
* 4442 卡的指定字段内容以十六进制字符串输入参数
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param offset 起始地址需小于256
* @param len 数据长度offset+len需小于256
* @param data 待写入卡片数据
* @param offset 起始地址需小于256
* @param len 数据长度offset+len需小于256
* @param data 待写入卡片数据
* @return 返回卡片读取信息 = 0 表示成功,非0失败
*/
Long ICC_Reader_4428_WriteHEX(Long ReaderHandle, int offset, int len, String data);
@ -211,8 +225,9 @@ public class CardReaderUtil {
/**
* 4442卡认证密钥
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param keyHex 卡密钥
* @param keyHex 卡密钥
* @return = 0 表示成功,非0失败
*/
Long ICC_Reader_4442_Verify(Long ReaderHandle, String keyHex);
@ -220,6 +235,7 @@ public class CardReaderUtil {
/** ----- 非接触操作函数 -------------- */
/**
* 查找天线磁场区域内有无卡只有卡片上电后才能查找到
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @return = 0 表示成功,非0失败
*/
@ -228,8 +244,9 @@ public class CardReaderUtil {
/**
* 天线操作
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param flag 00-关场强 01-开场强
* @param flag 00-关场强 01-开场强
* @return = 0 表示成功,非0失败
*/
Long PICC_Reader_RFControl(Long ReaderHandle, String flag);
@ -238,6 +255,7 @@ public class CardReaderUtil {
/** --------------- 非接 CPU 卡操作函数 ------------ */
/**
* 非接TypeA CPU卡上电复位输出十六进制字符串SSSE32.dll暴露函数中未发现该函数但是文档中有
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @return 输出上电成功返回的卡片复位信息(ATS) 返回ATS长度大于0 表示成功,其他失败
*/
@ -247,6 +265,7 @@ public class CardReaderUtil {
/**
* 非接TypeB CPU卡上电复位输出十六进制字符串SSSE32.dll暴露函数中未发现该函数但是文档中有
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @return 输出上电成功返回的卡片复位信息(ATS) 返回ATS长度大于0 表示成功,其他失败
*/
@ -255,10 +274,11 @@ public class CardReaderUtil {
/**
* 非接触 CPU 卡执行APDU命令命令以十六进制字符串传输SSSE32.dll暴露函数中未发现该函数但是文档中有
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @param CommandAPDU APDU命令数据以十六进制字符串形式输入
* @return APDU命令执行后,响应的数据,返回数据为十六进制字符串
* 大于 0 表示执行成功,其值为 Response_APDU 的数据长度.否则表示执行失败
* @param CommandAPDU APDU命令数据以十六进制字符串形式输入
* @return APDU命令执行后, 响应的数据, 返回数据为十六进制字符串
* 大于 0 表示执行成功,其值为 Response_APDU 的数据长度.否则表示执行失败
*/
@Deprecated
Long PICC_Reader_ApplicationHEX(Long ReaderHandle, String CommandAPDU);
@ -267,6 +287,7 @@ public class CardReaderUtil {
/** ---------------- 二代证/外国人居留证/港澳台居住证 --------------- */
/**
* 读取身份证物理ID号
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @return 返回身份证物理ID信息 = 0 表示成功,非0失败
*/
@ -275,101 +296,119 @@ public class CardReaderUtil {
/**
* 读取身份证物理ID号
*
* @param ReaderHandle ICCReaderOpen函数所返回的值
* @return 返回错误信息 = 0 表示成功,非0失败
*/
Long PICC_Reader_ReadIDCard(Long ReaderHandle);
/** 以下函数须在 “PICCReaderReadIDCard” 函数执行成功之后调用,否则获取不到有效信息 */
/** 以下函数须在 “PICC_Reader_ReadIDCard” 函数执行成功之后调用,否则获取不到有效信息 */
/**
* 获取证件类型
* @return
* 0居民身份证
* 1外国人永久居留证
* 2港澳台居民居住证
* 4新外国人永久居留证
*
* @return 0居民身份证
* 1外国人永久居留证
* 2港澳台居民居住证
* 4新外国人永久居留证
*/
Integer GetCardType();
Integer GetCardType(Pointer pointer);
/**
* 姓名(类型为 1 时表示外国人中文姓名)
*/
Integer GetName();
Integer GetName(Pointer pointer);
/**
* 性别
*/
Integer GetSex();
Integer GetSex(Pointer pointer);
/**
* 民族
*/
Integer GetNation();
Integer GetNation(Pointer pointer);
/**
* 出生日期
*/
Integer GetBirth();
Integer GetBirth(Pointer pointer);
/**
* 住址
*/
Integer GetAddress();
Integer GetAddress(Pointer pointer);
/**
* 公民身份证号码(类型为 1时表示外国人居留证号码)
*/
Integer GetCertNo();
Integer GetCertNo(Pointer pointer);
/**
* 签发机关
*/
Integer GetDepartemt();
Integer GetDepartemt(Pointer pointer);
/**
* 有效起始日期
*/
Integer GetEffectDate();
Integer GetEffectDate(Pointer pointer);
/**
* 有效截止日期
*/
Integer GetExpireDate();
Integer GetExpireDate(Pointer pointer);
/**
* bmp 格式照片数据
*/
Integer GetBmpFileData();
String GetBmpFileData(String IDCard);
/**
* 生成照片
* TODO 入参参考文中3.4.1
*/
Integer GetBmpFile();
Integer GetBmpFile(String pBmpfilepath);
/**
* 是否含存在指纹信息存在时返回 512 或者 1024
* 不存在时返回 0
*/
Integer IsFingerExist();
/**
* 获取指纹数据成功时返回获取到的字节长度
*/
Integer GetFingerprint();
Integer GetFingerprint(String fpInfo);
/**
* 外国人英文姓名
*/
Integer GetEnName();
Integer GetEnName(String IDCard);
/**
* 外国人国籍代码符合GB/T2659-2000规定
*/
Integer GetNationalityCode();
Integer GetNationalityCode(String IDCard);
/**
* 港澳台通行证号码
*/
Integer GetTXZHM();
Integer GetTXZHM(String IDCard);
/**
* 港澳台通行证签发次数
*/
Integer GetTXZQFCS();
Integer GetTXZQFCS(String IDCard);
/**
* 外国人换证次数
*/
Integer GetHZCS();
Integer GetHZCS(String IDCard);
/** ------------ 社保卡 ---------*/
/**
* 选择社保卡社会保障系统环境后通过 PSAM 卡对社保卡进行内部认证通过后将卡内的基本信息读出返回
*
* @param iType 操作卡的类型
* 1-接触式操作卡
* 2-非接触式操作卡
@ -377,11 +416,12 @@ public class CardReaderUtil {
* 4-自动寻卡非接触式操作卡优先
* @return
*/
Long iReadCardBas(Integer iType);
String iReadCardBas(Integer iType);
/**
* 基于加密机的读基本信息步骤一
* 选择社会保障系统环境后返回内部认证和外部认证所需信息
*
* @param iType 操作卡的类型
* 1-接触式操作卡
* 2-非接触式操作卡
@ -394,10 +434,11 @@ public class CardReaderUtil {
/**
* 基于加密机的读基本信息步骤二
* 根据加密机返回的内部认证和外部认证结果数据对社保卡进行内部认证和外部认证通过后将卡内的基本信息读出返回
* @param pKey 加密机返回的内部认证和外部认证结果数据依次为内部认证结果数据
* 即内部认证鉴别数据16 和内部认证鉴别所需的原始信息16 拼接组
* 外部认证结果数据即外部认证鉴别数据16 和外部认证鉴别所需的
* 原始信息16 拼接组成各数据项之间以|分割且最后一个数据项以|结尾
*
* @param pKey 加密机返回的内部认证和外部认证结果数据依次为内部认证结果数据
* 即内部认证鉴别数据16 和内部认证鉴别所需的原始信息16 拼接组
* 外部认证结果数据即外部认证鉴别数据16 和外部认证鉴别所需的
* 原始信息16 拼接组成各数据项之间以|分割且最后一个数据项以|结尾
* @return
*/
Long iReadCardBas_HSM_Step2(String pKey);