护照读取流程

  1. 初始化护照阅读器接口
  2. 设置读取配置
  3. 检测护照放入状态(只有护照放入才能读取)
  4. 读取护照
  5. 获取需要的信息
  6. 释放护照阅读器资源

定义接口

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协议 。转载请注明出处!