问题描述
我正在尝试在我的 Nexus4 HCE 和 Arduino PN532 芯片之间建立通信.在 Arduino 的串行监视器上,我可以看到一些数据事务正在发生.但在安多里德方面,我得到
I am trying to build a communication between my Nexus4 HCE and Arduino PN532 Chip. on The Serial Monitor of Arduino,I could see some data transaction happening. But on ANdorid side, I get
CET4T: Unsupported Class byte (0x60)
CET4T: Unsupported Class byte (0xA0)
BrcmNfcNfa﹕ UICC[0x0] is not activated
下面是我的 apduservice.xml
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/servicedesc"
android:apduServiceBanner="@drawable/ic_launcher"
android:requireDeviceUnlock="false" >
<aid-group
android:category="other"
android:description="@string/aiddescription" >
<aid-filter android:name="F0010203040506" />
<aid-filter android:name="F0394148148100" />
<aid-filter android:name="4C656C616E746F73"/>
</aid-group>
</host-apdu-service>
下面是我的 Arduino Side Code
#include <PN532.h>
#include <SPI.h>
/*Chip select pin can be connected to D10 or D9 which is hareware optional*/
/*if you the version of NFC Shield from SeeedStudio is v2.0.*/
#define PN532_CS 10
PN532 nfc(PN532_CS);
uint8_t written=0;
#define NFC_DEMO_DEBUG 1
void setup(void) {
#ifdef NFC_DEMO_DEBUG
Serial.begin(9600);
Serial.println("Hello!");
#endif
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) {
#ifdef NFC_DEMO_DEBUG
Serial.print("Didn't find PN53x board");
#endif
while (1); // halt
}
#ifdef NFC_DEMO_DEBUG
// Got ok data, print it out!
Serial.print("Found chip PN5");
Serial.println((versiondata>>24) & 0xFF, HEX);
Serial.print("Firmware ver. ");
Serial.print((versiondata>>16) & 0xFF, DEC);
Serial.print('.');
Serial.println((versiondata>>8) & 0xFF, DEC);
Serial.print("Supports ");
Serial.println(versiondata & 0xFF, HEX);
#endif
// configure board to read RFID tags and cards
nfc.SAMConfig();
}
void loop(void)
{
uint32_t id;
// look for MiFare type cards
id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
if (id != 0)
{
#ifdef NFC_DEMO_DEBUG
Serial.print("Read card #");
Serial.println(id);
Serial.println();
#endif
uint8_t keys[] = {
0x00, /* CLA */
0xA4, /* INS */
0x04, /* P1 */
0x00, /* P2 */
0x08, /* Lc */
0x4C, 0x65, 0x6C, 0x61, 0x6E, 0x74, 0x6F, 0x73,
0x00 /* Le */ };
uint8_t writeBuffer[16];
for(uint8_t i = 0;i < 16;i ++)
{
writeBuffer[i]=i; //Fill buffer with 0,1,2....F
}
if(nfc.authenticateBlock(1, id ,0x08,KEY_A,keys)) //authenticate block 0x08
{
//if authentication successful
if(written == 0) //Not written
{
written = nfc.writeMemoryBlock(1,0x08,writeBuffer); // Write writeBuffer[] to block 0x08
if(written)
#ifdef NFC_DEMO_DEBUG
Serial.println("Write Successful");
#endif
}
uint8_t block[16];
//read memory block 0x08
if(nfc.readMemoryBlock(1,0x08,block))
{
#ifdef NFC_DEMO_DEBUG
Serial.println("Read block 0x08:");
//if read operation is successful
for(uint8_t i=0;i<16;i++)
{
//print memory block
Serial.print(block[i],HEX);
Serial.print(" ");
}
Serial.println();
#endif
}
}
}
delay(500);
}
以下是Arduino Serial Monitor的日志
Hello!
Found chip PN532
Firmware ver. 1.6
Supports 7
Found 1 tags
Sens Response: 0x4
Sel Response: 0x60
0x8 0x1B 0x14 0x83Read card #135992451
Write Successful
Read block 0x08:
6E 0 7C 0 AA AA AA AA AA AA AA AA AA AA AA AA
Found 1 tags
Sens Response: 0x4
Sel Response: 0x60
0x8 0x26 0x40 0x85Read card #136724613
Read block 0x08:
6E 0 7C 0 AA AA AA AA AA AA AA AA AA AA AA AA
参考:许多 SOF 答案/https://github.com/grundid/host-卡模拟样本
References : Many SOF Answers/ https://github.com/grundid/host-card-emulation-sample
任何灯都会有很大帮助.
Any lights will highly help.
推荐答案
使用 Android HCE,您可以模拟 ISO 14443-4 (ISO-DEP) 非接触式智能卡.该智能卡只能识别 ISO 7816-4 APDU 命令.因此,您的 Android 应用程序注册了某些 AID(智能卡应用程序 DF 名称).为了与您的应用程序通信,您需要通过为这些 AID 之一发出 SELECT [by DF name] APDU 来选择您的应用程序.在此 SELECT 命令之后,所有格式正确的 APDU 命令都将转发到您应用的 HCE 服务,直到使用新的 SELECT [by DF name] 命令选择另一个 AID.
With Android HCE you emulate an ISO 14443-4 (ISO-DEP) contactless smartcard. This smartcard only understands ISO 7816-4 APDU commands. So your Android app registers for certain AIDs (smartcard application DF names). In order to communicate with your app, you need to select your app by issuing a SELECT [by DF name] APDU for one of these AIDs. After this SELECT command, all properly formatted APDU commands will be forwarded to your app's HCE service until another AID is selected with a fresh SELECT [by DF name] command.
然而,您的 Arduino 应用程序会尝试访问 MIFARE Classic 卡(即它发出验证、写入和读取命令).MIFARE Classic 使用不同的协议(既不符合 ISO 14443-4 也不使用 ISO 7816-4 APDU),因此该协议不能用于与 Android HCE 模拟智能卡交互.
Your Arduino application, however, tries to access a MIFARE Classic card (i.e. it issues authenticate, write and read commands). MIFARE Classic uses a different protocol (neither compliant to ISO 14443-4 nor using ISO 7816-4 APDUs), so this protocol cannot be used to interact with an Android HCE emulated smartcard.
据我所知,用于 NFC Shield 的 Arduino 库目前没有实现 ISO-DEP 通信,因此您需要自己实现 PN532 的协议和操作模式.
As far as I know, the Arduino library for the NFC shield curently does not implement ISO-DEP communication, so you would need to implement that protocol and operation mode of the PN532 on your own.
这篇关于使用 Arduino 模拟 Android 主机卡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!