Android NFC从ePassport读取数据

前端之家收集整理的这篇文章主要介绍了Android NFC从ePassport读取数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发电子护照阅读器应用程序,我已经关注了一些较旧的问题,并且我已使用以下代码成功连接到护照.
我的问题是我无法理解如何读取存储在护照中的所有数据(姓名,照片……).
这是我使用过的代码,应用程序运行良好(靠近NFC标签提示).
@Override
    protected String doInBackground(Tag... params) {

        //Tag tag = params[0];

        Intent intent = getIntent();

        //Log.d(TAG,"params " + intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));

        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

        IsoDep dep = IsoDep.get(tag);

        if (dep == null) {
            // IsoDep is not supported by this Tag. 
            return null;
        }

        byte[] CMD = {
                    (byte)0x00,/* CLA = 00 (first interindustry command set) */
                    (byte)0xA4,/* INS = A4 (SELECT) */
                    (byte)0x04,/* P1  = 04 (select file by DF name) */
                    (byte)0x0C,/* P2  = 0C (first or only file; no FCI) */
                    (byte)0x07,/* Lc  = 7  (data/AID has 7 bytes) */
                    /* AID = A0000002471001: */
                    (byte)0xA0,(byte)0x00,(byte)0x02,(byte)0x47,(byte)0x10,(byte)0x01
            };

        byte[] GET_RANDOM = { 
                (byte) 0x00,// CLA Class        
                (byte) 0x84,// INS Instruction
                (byte) 0x00,// P1  Parameter 1
                (byte) 0x00,// P2  Parameter 2
                (byte) 0x0E  // LE  maximal number of bytes expected in result
            };

            try {
                dep.connect();

                byte[] result = dep.transceive(CMD);// CONNECT

                Log.d(TAG,"result " + result[0] + " " + (byte)0x90);

                if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00))
                        throw new IOException("could not select applet");

                if(dep.isConnected()==true)
                    Log.d(TAG,"IS CONNECTED!");
                else
                    Log.d(TAG,"ISN'T CONNECTED!");

                    result = dep.transceive(GET_RANDOM); // EXEC A CMD
                    int len = result.length;
                    if (!(result[len-2]==(byte)0x90 && result[len-1]==(byte) 0x00))
                       throw new RuntimeException("could not retrieve msisdn");

                    byte[] data = new byte[len-2];
                    System.arraycopy(result,data,len-2);
                    String str = new String(data);

                    Log.d(TAG,str);

                    dep.close();

            } catch (IOException e1) {
                e1.printStackTrace();
            }



        return null;
    }

解决方法

您需要针对您的epassport制作 BAC(基本访问控制),以便能够阅读护照上印刷的基本信息(国家,姓名,姓氏,国籍,出生日期,性别……)和机读区(机读)区域,也就是护照底部的两条大线).所有这些信息都位于DG(数据组)1中,照片位于DG2中.您可以在其他DG中找到其他信息,例如DG3需要读取EAC(扩展访问控制),因为它包含敏感数据(指纹).

您可以使用JMRTD库从Android手机中读取它.市场上有一个“演示”Android应用程序here.否则,您可以开始阅读位于here的ICAO(国际民用航空组织)的官方文档.在本文档的末尾,您可以找到一些示例,以便您可以自己实施的BAC.

您还可以查看the JMRTD source code以帮助您编写代码. IMO编码非常复杂,但学习起来非常有趣.你写的代码是一个好的开始!

猜你在找的Android相关文章