我正在开发电子护照阅读器应用程序,我已经关注了一些较旧的问题,并且我已使用以下代码成功连接到护照。 我的问题是我无法理解如何读取存储在护照中的所有数据(姓名,照片......)。 这是我使用的代码,应用程序运行良好(当接近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;
}
答案 0 :(得分:12)
您需要针对您的epassport制作BAC(基本访问控制)才能阅读护照上印刷的基本信息(国家,姓名,姓氏,国籍,出生日期,性别...... )和MRZ(机读区,也就是说护照底部的两条大线)。所有这些信息都位于DG(数据组)1中,照片位于DG2中。您可以在其他DG中找到其他信息,例如DG3需要读取EAC(扩展访问控制),因为它包含敏感数据(指纹)。
您可以使用JMRTD库从Android手机中读取它。市场上有一个“演示”Android应用程序here。否则,您可以开始阅读位于here的ICAO(国际民用航空组织)的官方文件。在本文档的最后,您可以找到一些示例,以便您可以自己实现BAC。
您还可以查看the JMRTD source code以帮助您编写代码。 IMO编码非常复杂,但学习起来非常有趣。你写的代码是一个好的开始!
答案 1 :(得分:2)
这不是答案,而是路易斯上面提供的信息的补充。
以下是各种数据组参考号的列表:
以下是EAC描述的摘录:
答案 2 :(得分:-2)
通常,ePassport受到正常访问保护。因此,在阅读ePass之前,必须对数据页进行光学扫描,将其发送到安全服务器(边界控制等)。他们将检查它,进行光学数据识别(ocr)并提供对集成RFID芯片的安全访问。因此,无法创建阅读官方护照的应用程序。您可能只是阅读某些护照中的UID或只是检测到有“某事”。