gpt4 book ai didi

Android NFC 从电子护照读取数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:34:48 68 4
gpt4 key购买 nike

我正在开发电子护照阅读器应用程序,我已经关注了一些较早的问题,并且我已经使用以下代码成功连接到护照。我的问题是我无法理解如何读取存储在护照中的所有数据(姓名、姓氏、照片……)。这是我使用过的代码,该应用运行良好(靠近 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)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, 0, data, 0, len-2);
String str = new String(data);

Log.d(TAG, str);

dep.close();

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



return null;
}

最佳答案

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

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

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

关于Android NFC 从电子护照读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21849601/

68 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com