2013-11-24 5 views
1

현재 NFC 쉴드가있는 Arduino UNO와 Android 4.4를 실행중인 Nexus 4를 연결하려고합니다.호스트 카드 에뮬레이션 설정하기

서비스 설정이 있습니다. 단지 현재 로깅 중입니다. 문제는 NFC 인 텐트가 내 앱에 묶여 있지 않다는 것입니다. NFC 쉴드 내 휴대 전화로 보낼 필요가 않습니다 '메시지'어떤 사물의 아두 이노 측면에서

  • :

    11-24 02:45:46.139 4006-4027/? E/BrcmNfcNfa﹕ UICC[0x0] is not activated 
    

    그래서 여기 내 2 개 질문입니다 : 디버거는 다음과 같은 오류를보고합니다 내 휴대 전화에서 '기타'카테고리의 특정 앱을 찾고 있음을 알 수 있습니까?

  • 사물의 안드로이드 측면에서, 그 의도를 파악하기위한 aid-filter 태그 값은 무엇이 될까요? 나는 이것을 만들기 위해 어떤 종류의 ISO 스펙을 고수해야 할까?

      uint8_t message[5]; 
    
          message[0] = 0x00; 
          message[1] = 0xA4; 
          message[2] = 0x04; 
          message[3] = 0x00; 
          message[4] = 0x08;    
          message[5] = 0x4C656C616E746F73ULL; 
    

    그리고 여기 내 안드로이드 응용 프로그램에서 APDU 서비스 XML 파일입니다 : 그래서 여기

UPDATE

확인을 내 APDU를 구축 내 아두 이노 스케치의 관련 부분

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:description="@string/servicedesc" 
    android:requireDeviceUnlock="false"> 
    <aid-group android:description="@string/aiddescription" 
     android:category="other"> 
     <aid-filter android:name="4C656C616E746F73"/> 
    </aid-group> 
</host-apdu-service> 

그리고 내가 가져 가면 얻을 수있는 로그입니다. NFC 실드를 통해 내 전화 :

11-24 22:33:40.563 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: event=0x18 
11-24 22:33:40.563 4006-4027/? D/HostEmulationManager﹕ notifyHostEmulationActivated 
11-24 22:33:40.563 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: event=0x17 
11-24 22:33:40.563 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=5 
11-24 22:33:40.563 4006-4027/? D/HostEmulationManager﹕ notifyHostEmulationData 
11-24 22:33:40.563 4006-4027/? D/HostEmulationManager﹕ Dropping non-select APDU in STATE_W4_SELECT 
11-24 22:33:40.683 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: event=0x17 
11-24 22:33:40.683 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=5 
11-24 22:33:40.683 4006-4027/? D/HostEmulationManager﹕ notifyHostEmulationData 
11-24 22:33:40.683 4006-4027/? D/HostEmulationManager﹕ Dropping non-select APDU in STATE_W4_SELECT 
11-24 22:33:40.804 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: event=0x17 
11-24 22:33:40.804 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=5 
11-24 22:33:40.804 4006-4027/? D/HostEmulationManager﹕ notifyHostEmulationData 
11-24 22:33:40.804 4006-4027/? D/HostEmulationManager﹕ Dropping non-select APDU in STATE_W4_SELECT 
11-24 22:33:40.924 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: event=0x17 
11-24 22:33:40.924 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=5 
11-24 22:33:40.934 4006-4027/? D/HostEmulationManager﹕ notifyHostEmulationData 
11-24 22:33:40.934 4006-4027/? D/HostEmulationManager﹕ Dropping non-select APDU in STATE_W4_SELECT 
11-24 22:33:41.054 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: event=0x17 
11-24 22:33:41.054 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=5 
11-24 22:33:41.054 4006-4027/? D/HostEmulationManager﹕ notifyHostEmulationData 
11-24 22:33:41.054 4006-4027/? D/HostEmulationManager﹕ Dropping non-select APDU in STATE_W4_SELECT 
11-24 22:33:41.174 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: event=0x17 
11-24 22:33:41.174 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=5 
11-24 22:33:41.174 4006-4027/? D/HostEmulationManager﹕ notifyHostEmulationData 
11-24 22:33:41.174 4006-4027/? D/HostEmulationManager﹕ Dropping non-select APDU in STATE_W4_SELECT 
11-24 22:33:41.304 4006-4027/? D/BrcmNfcJni﹕ RoutingManager::stackCallback: event=0x19 
11-24 22:33:41.304 4006-4027/? D/HostEmulationManager﹕ notifyHostEmulationDeactivated 
11-24 22:33:41.304 4006-4027/? E/BrcmNfcNfa﹕ UICC[0x0] is not activated 

방법 안드로이드 내 HCE 서비스에 APDU를 라우팅하지 않는 거지?

답변

4

당신은

이 이
uint8_t message[5]; 

message[0] = 0x00; 
message[1] = 0xA4; 
message[2] = 0x04; 
message[3] = 0x00; 
message[4] = 0x08;    
message[5] = 0x4C656C616E746F73ULL; 

실제로 다음과 같습니다 배열됩니다 실현합니까? 당신의 AID의 나머지 부분 (0x4C, 0x65, 0x6C, 0x61, 0x6E, 0x740x6F)이 효과적으로 을 차단하고 결과적으로 당신의 APDU는 잘못된 길이를 가지고 있다는 것을 의미

uint8_t message[] = { 0x00, 0xA4, 0x04, 0x00, 0x08, 0x73 }; 

(LC) 필드 .

그래서 당신이 제대로 SELECT APDU 포맷 할 수 있습니다 또한

uint8_t message[] = { 
    0x00, /* CLA */ 
    0xA4, /* INS */ 
    0x04, /* P1 */ 
    0x00, /* P2 */ 
    0x08, /* Lc */ 
    0x4C, 0x65, 0x6C, 0x61, 0x6E, 0x74, 0x6F, 0x73, 
    0x00 /* Le */ }; 

을, 나는 양식 Fxxxxxxxxx... (0xF로 설정 첫 번째 바이트의 즉, 상위 니블, 길이 사이의 AID를 사용하는 것이 좋습니다 5 바이트 및 16 바이트)를 사용하면 다른 표준 응용 프로그램과 충돌 할 수 있습니다. AID 형식을 올바르게 지정하는 방법에 대한 자세한 내용은 ISO/IEC 7816-4를 참조하십시오.

+0

Magica! 그것은 효과가있다! 정말 고맙습니다! – ReX357

+0

안녕하세요 렉스 ... 이미 가지고 계신 것을 도와주세요. M은 Arduino와 ANdroid HCE Service 사이의 통신을 구축하려고합니다. 동일한 오류가 발생하는 M : UICC [0x0]이 (가) 활성화되지 않았습니다. M은 PN532 칩을 사용합니다. 아마도 C 프로그램 예제를 도와 주시겠습니까? 미리 감사드립니다. –

0
  • 도움이 길이에 관해서는,와 ISO 기준을 충족해야합니다 예 : 원조 필터 안드로이드 : 이름 = "F0010203040506"아두 이노가 잘 형식 APDU하여 넥서스를 보낼 필요
  • . (CLA/INS/P1/P2/Len)
  • 오류와 관련하여 메시지가 UICC로 라우팅된다는 사실을 알 수 있습니다. HCE 응용 프로그램이 Aduino 보드로 선택한 올바른 AID를 정의하지 않은 경우이 경우 일 수 있습니다.

여기의 예제 (http://developer.android.com/guide/topics/connectivity/nfc/hce.html)는 기본적으로 작동합니다.

+1

이제 내 질문에이 AID를 어떻게 제시 할까? 그것은 내가 내 애플 리케이션에 대한 자신을 생성 임의의 숫자인가요 아니면 어딘가에 다양한 종류의 애플 리케이션에 대한 AID의 목록인가? 제 혼란을 용서해주십시오, 이것은 나에게 모두 새로운 것입니다. 내가 할 수있는 모든 문서를 읽으려고 노력했지만 그 중 많은 것이 내 머리 위로있다. – ReX357

+0

그리고 내 NFC 방패가 보내는 APDU에 관해서는 빌드 방법을 알고 있지만 각 바이트에 대해 가능한 옵션 목록은 어디에서 찾을 수 있습니까? 나는 그것을 찾는 데 어려움을 겪고있다. – ReX357

1

이것은 독점권 범위 i 내에있는 AID = "F0394148148100"을 선택할 수 있습니다. 이자형. 제 1 바이트의 비트 8-5는 각각 '1'로 설정되어야한다. 'F'인 경우 arudino의 APDU에서 다음과 같이 AID를 사용합니다.

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" 
       android:description="@string/ServiceMe" 
       android:requireDeviceUnlock="false"> 
     <aid-group android:description="@string/NfcService" 
        android:category="other"> 
      <aid-filter android:name="F0394148148100"/> 

     </aid-group> 
</host-apdu-service> 

을 다음과 같이

private static byte[] AID={ 
       (byte)0x00 
      , (byte)0xA4 
      , (byte)0x04 
      , (byte)0x00 
      , (byte)0x07 
      , (byte)0xF0, (byte)0x39, (byte)0x41, (byte)0x48, (byte)0x14, (byte)0x81, (byte)0x00 
      , (byte)0x00 
    }; 

그런 다음 응답을 다음

public class MyHostApduService extends HostApduService 
{ 

    @Override 
    public void onDeactivated(int reason) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) 
    { 
     // TODO Auto-generated method stub 
     String n1="Hi there this is working"; 
     byte[] response=n1.getBytes(); 
     System.err.println(response); 
     return response; 
    } 

} 

다음 응용 프로그램의 매니페스트의 서비스 태그에 정의 된 서비스를 사용하는 것입니다 apduxml이 AID를 사용 APDU와 결과 내에서 문자열을 가져옵니다.

관련 문제