护照读取流程
- 初始化护照阅读器接口
- 设置读取配置
- 检测护照放入状态(只有护照放入才能读取)
- 读取护照
- 获取需要的信息
- 释放护照阅读器资源
定义接口
public interface PassportService extends Library {
PassportService INSTANCE = Native.load("IDCard", PassportService.class, W32APIOptions.UNICODE_OPTIONS);
/**
* 初始化sdk
* @param cArrUserID
* @param nType
* @param cArrDirectory lib 路径
* @return
*/
int InitIDCard(WString cArrUserID, int nType, WString cArrDirectory);
/**
* 检测是否有证件放入
* -1 核心尚未初始化
* 0 未检测到证件放入或拿出
* 1 检测到有证件放入
* 2 检测到证件被拿出
* 3 检测到手机条码(仅支持 AR、 KR 系列设备)
* @return
*/
int DetectDocument();
int GetRecogResultEx(int attr,int nIndex, byte[] cArrBuffer, IntByReference nBufferLen);
int SaveImage(String cArrFileName);
void FreeIDCard();
int RecogGeneralMRZCard(boolean bRecogVIZ, int nSaveImageType);
/**
* 加载证件识读选项
* @param lpConfigFile
* @return 0 成功 其他失败
*/
int SetConfigByFile(WString lpConfigFile);
/**
* 自动处理
* @param nCardType 返回证件类型
* 1 表示证件带有电子芯片
* 2 表示证件不带电子芯片
* 4 表示检测到条码
* 5 表示证件带有电子芯片且检测到条码证件识别 SDK 开发手册
* 6 表示证件不带电子芯片但检测到条码
* @return
*/
int AutoProcessIDCard(IntByReference nCardType);
}
接口实现
public class PassportServiceImpl {
private static int status = 0;
@Resource
private DataExchangeService dataExchangeService;
private static final String MULTI_BYTE_ENCODING = "UTF-16LE";
private WString userId = new WString("硬件厂商提供的用户ID");
private String libdir;
@PostConstruct
public void init() {
ApplicationHome applicationHome = new ApplicationHome();
Path libPath = Paths.get(applicationHome.toString(), "cardLib");
libdir = libPath.toString();
// 初始化
int nRet = -1;
libdir = StringUtils.isEmpty(libdir) ? "C:\\Users\\Administrator\\Documents\\workspace\\wit-fids\\cardLib" : libdir;
WString dir = new WString(libdir);
nRet = PassportService.INSTANCE.InitIDCard(userId, 1, dir);
if (nRet != 0) {
log.error("初始化护照阅读器错误,nRet={}", nRet);
return;
}
// 设置配置文件 IDCardConfig.ini
Path path = Paths.get(libdir, "IDCardConfig.ini");
nRet = PassportService.INSTANCE.SetConfigByFile(new WString(path.toString()));
if (nRet != 0) {
log.error("加载护照配置出错,nRet={}", nRet);
return;
}
}
@PreDestroy
public void unInit(){
PassportService.INSTANCE.FreeIDCard();
}
public void readPassport() {
int nRet = -1;
if (1 == status) {
IntByReference intByReference = new IntByReference();
nRet = PassportService.INSTANCE.AutoProcessIDCard(intByReference);
if (nRet > 0) {
log.debug("检测到护照,nRet={}",nRet);
readCard();
} else {
log.debug("没有读取到护照");
}
}
}
private void readCard() {
JSONObject result = new JSONObject();
result.put("cardNumber", getPassportField(1));
result.put("name", getPassportField(2));
result.put("nameEng", getPassportField(3));
result.put("sex", getPassportField(4));
result.put("birthday", getPassportField(5));
log.debug("护照解析结果::{}", result);
dataExchangeService.send(DataExchangeService.PASSPORT_CMD, result);
}
private String getPassportField(int index) {
IntByReference maxNum = new IntByReference(128);
byte[] cArrFieldValue = new byte[maxNum.getValue()];
int nRet = PassportService.INSTANCE.GetRecogResultEx(1, index, cArrFieldValue, maxNum);
try {
String value = new String(cArrFieldValue, MULTI_BYTE_ENCODING);
if (StringUtils.isNotEmpty(value)) {
value = value.trim();
}
return value;
} catch (UnsupportedEncodingException e) {
log.error("读取证件出错", e);
}
return null;
}
@Scheduled(fixedRate = 200)
public void detectPassport() {
int s = PassportService.INSTANCE.DetectDocument();
if (1 == s) {
log.debug("检测到证件放入");
status=1;
}else if(2==s){
log.debug("检测到证件拿出");
status=0;
}
}
}
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!