2014-04-14 10 views
3

ISO 7816-4 명령으로 Android에서 PN532와 HCE 사이의 통신을 시도 할 때 성공적으로 AID (DF)를 선택했지만 아래에서 EF를 선택할 때 DF, 그리고 그 EF에 레코드를 기록 (EF가 존재하지 않는, 그래서 선택 명령은 EF가 있음을 만들 것이라고 가정)하지만 다음과 같이 표시한다 :ISO 7816-4 APDU 명령 파일 선택 및 기록 작성

inList passive target 
write: 4A 1 0 
read: 4B 1 1 0 4 60 4 8 23 5A 4D 5 75 80 70 2 
write: 40 1 0 A4 4 0 7 F0 1 2 3 4 5 6 0 
read: 41 0 48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 

Successfully hehe 

48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 Hello Desktop! 
write: 40 1 0 A4 2 C 1 1 0 
read: 41 0 48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 
Not enough space 
write: 40 1 0 D2 0 0 7 42 41 4F 47 49 41 40 0 
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 30 
Not enough space 
write: 40 1 0 D2 0 2 4 44 4F 41 4E 0 
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 31 
Not enough space 
write: 40 1 0 B2 0 0 7 42 41 4F 47 49 
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 32 
Not enough space 
write: 40 1 0 B2 0 2 4 44 4F 41 4E 0 
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 33 
Not enough space 

나는 내가 모르는 여기 잘못있는거야?

안드로이드에서 로그는 다음과 같습니다

04-15 09:36:54.024: D/HostEmulationManager(929): notifyHostEmulationData 
04-15 09:36:54.024: W/System.err(17710): [[email protected] 
04-15 09:36:54.024: I/HCEDEMO(17710): Received: ???????BAOGI 
04-15 09:36:54.024: D/HostEmulationManager(929): Sending data 
04-15 09:36:54.164: D/BrcmNfcJni(929): RoutingManager::stackCallback: event=0x17 
04-15 09:36:54.164: D/BrcmNfcJni(929): RoutingManager::stackCallback: NFA_CE_DATA_EVT;  h=0x302; data len=10 
04-15 09:36:54.164: D/HostEmulationManager(929): notifyHostEmulationData 
04-15 09:36:54.164: W/System.err(17710): [[email protected] 
04-15 09:36:54.164: I/HCEDEMO(17710): Received: ?????DOAN?? 
04-15 09:36:54.174: D/HostEmulationManager(929): Sending data 
04-15 09:36:54.885: D/BrcmNfcJni(929): RoutingManager::stackCallback: event=0x19 
04-15 09:36:54.885: D/HostEmulationManager(929): notifyHostEmulationDeactivated 
04-15 09:36:54.885: I/HCEDEMO(17710): Deactivated: 0 
04-15 09:36:54.885: D/HostEmulationManager(929): Unbinding from service ComponentInfo{de.grundid.hcedemo/de.grundid.hcedemo.MyHostApduService} 
04-15 09:36:54.895: E/BrcmNfcNfa(929): UICC[0x0] is not activated 

내가 읽은 기록을 사용하는 경우, 그것은 않습니다, PN532에서, 그것은 몇 가지 데이터를 수신 할 수 있음을 표시하지만 그것이 내가 전달하고자하는 일부 요소를 벗어났습니다 만, 이 데이터를 표시하지 않습니까?

+0

EF가 없으면 Select 명령으로 해당 EF를 생성한다고 가정하지 마십시오. CREATE FILE 명령을 사용하여 EF를 작성해야합니다. – David

+0

죄송합니다. 그러나 FILE 명령을 만들지 못했습니다. SELECT FILE 명령 만 사용할 수 있습니까? –

+0

내가 사용하는 명령의 링크는 다음과 같습니다. http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_6_basic_interindustry_commands.aspx –

답변

5

귀하의 안드로이드 HCE 에뮬레이트 스마트 카드 응용 프로그램이 이해하고 처리하는 명령은 (유효한 ISO 7816-4 APDU로 포맷 된 경우) 귀하가 전적으로 귀하에게 달려 있습니다. 귀하의 경우에는

, 당신의 안드로이드 HCE 서비스는 분명,

00 A4 04 00 07 F0010203040506 00 

을 APDU (DF 이름으로)를 SELECT를 처리하고 응답으로이 제공 :

48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 ("Hello Desktop!" when interpreted as ASCII) 

가 (이 응답이 있습니다

다음에 보낼 명령은 유효하지 않은 SELECT (by EF) 명령입니다.

(ISO 7816-4에 따라 유효한 응답 APDU가 아님)

ISO 7816-4를 따르는 경우 Lc는 2이고 EF 식별자는 2 바이트로 구성되어야합니다. 그에 대응하여, 안드로이드 HCE 서비스를 다시

48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 ("Hello Desktop!" when interpreted as ASCII) 

가 (이 상태 워드 부족으로 ISO 7816-4에 따라 APDU이 응답이 유효한 응답하지 않습니다.) 전송 그래서

나는 것 안드로이드 HCE 서비스가이 같은 검사를 수행 것을 추측 :

public byte[] processCommandApdu(byte[] apdu, Bundle extras) { 
    if (apdu[1] == (byte)0xA4) { 
     return "Hello Desktop!".getBytes("US-ASCII"); 
    } 
} 

는 "BAOGIA을 @"쓸 cuirrently 선택한 파일의 첫 번째 레코드에서 시도 잘못된 쓰기 RECORD 명령입니다 (전송 다음 명령 WRITE RECORD 명령이 정상적으로 n 그것으로 ISO 7816-4에 따라 APDU

4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 30 ("Message from android: 0" when interpreted as ASCII) 

(이 응답은 다시 유효한 응답 않음을 유의하십시오 : 당신의 안드로이드 HCE 서비스가 보내는 응답으로

00 D2 00 00 07 42 41 4F 47 49 41 40 00 

: OT는 르 필드)가 상태 단어가 없습니다.)

그런 다음 다른 레코드 페이로드로 쓰기 RECORD 명령을 반복하고 그 후 두 개의 잘못된 읽기 RECORD 명령을 보내

4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 xx ("Message from android: X" when interpreted as ASCII) 
: 안드로이드 HCE 서비스가 보내는 응답으로

00 D2 00 02 04 44 4F 41 4E 00 
00 B2 00 00 07 42 41 4F 47 49 
00 B2 00 02 04 44 4F 41 4E 00 

여기서 xx는받은 각 명령에 대해 증가하는 ASCII 숫자 X 인 것으로 보입니다.

그래서 나는 당신의 안드로이드 HCE 서비스는 다음과 같습니다 것을 추측 것 :

private int mCommandCounter = 0; 
public byte[] processCommandApdu(byte[] apdu, Bundle extras) { 
    String response; 
    if (apdu[1] == (byte)0xA4) { 
     response = "Hello Desktop!"; 
    } else { 
     response = "Message from android: " + Integer.toString(mCommandCounter); 
     ++mCommandCounter; 
    } 
    return response.getBytes("US-ASCII"); 
} 

그래서,이 요약, 안드로이드 HCE 서비스가 이해하고 처리 당신에게 해당 명령 (또는 그것을 개발하는 사람이라면 누구나) 구현할 수 있습니다. HCE 장치에 보낼 수있는 명령은 무엇입니까? 파일 시스템이 이고 파일 시스템이이 아닙니다. ISO 7816-4 만 은 스마트 카드 응용 프로그램 용 파일 시스템 레이아웃을 제안합니다.

+0

당신은 맞습니다. 마이클입니다. 그러나 어떻게 저 자신의 명령을 구축하는 대신 7816-4의 존재 구조를 사용할 수 있습니까? –

+0

Android HCE 에뮬레이트 된 스마트 카드 응용 프로그램에는 ** 기존 파일 구조가 없습니다 **. ** 당신이 ** 당신의 ** HCE 응용 프로그램이 특정 명령을 받아들이 길 원한다면 ** 당신은 안드로이드 쪽에서 구현해야합니다. 이 명령은 물론 **, 파일 시스템 구조를 모방하는 명령 일 수 있습니다. –