2013-11-24 189 views
1

我目前正試圖將帶有NFC屏蔽的Arduino UNO連接到運行Android 4.4的Nexus 4。設置主機卡模擬

我有服務設置,現在只是簡單的登錄。問題是,NFC意圖沒有被綁定到我的應用程序。調試器報告以下錯誤:

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

因此,這裏是我的2個問題:

  • 對事物的Arduino的一側,並在NFC盾需要發送到我的手機是什麼樣的「消息」爲了讓我的手機瞭解我正在尋找類別爲「其他」的某個應用程序?

  • 在android的一面,會有什麼援助過濾器標記值來捕捉這個意圖?我可以自己組裝一個自定義的,還是需要堅持某種ISO規範才能使其工作?

UPDATE

所以這裏確定是我的Arduino草圖的相關部分,我建我的APDU:

  uint8_t message[5]; 

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

下面是在我的Android應用程序的APDU服務XML文件:

<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 

Android怎麼沒有將APDU路由到我的HCE服務?

回答

4

你知道那

uint8_t message[5]; 

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

實際上會導致陣列看起來像這樣?

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

這意味着你的援助的剩餘部分(0x4C0x650x6C0x610x6E0x740x6F)被有效切斷因此您的APDU也有一個錯誤的長度(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,否則您可能會與其他標準應用程序發生衝突。有關正確格式化AID的更多信息,請參閱ISO/IEC 7816-4。

+0

Magica!有效!非常感謝! – ReX357

+0

嗨雷克斯...你能幫我一下,你已經有了什麼。 M嘗試在Arduino和ANdroid HCE服務之間建立通信。 M得到相同的錯誤:UICC [0x0]未被激活。 M使用PN532芯片。你能幫我做一個C程序示例嗎?提前致謝 –

0
  • 的援助需要滿足ISO標準方面的長度,例如:輔助過濾器的android:NAME =「F0010203040506」
  • Arduino的需要發送一個精心格式APDU的Nexus的。 (CLA/INS/P1/P2/Len)
  • 關於錯誤:它接到你的消息被路由到UICC。如果HCE應用程序未定義您通過Aduino Board選擇的正確AID,則可能是這種情況。

這裏的示例(http://developer.android.com/guide/topics/connectivity/nfc/hce.html)開箱即用。

+1

好的,所以我現在的問題是,我如何拿出這個援助?它是我自己爲我的應用生成的一個隨機數字,還是在某個AID列表的某個列表中顯示不同種類的應用?請原諒我的困惑,這對我來說是全新的。我一直在嘗試閱讀所有可能的文檔,但很多都是在我的頭上。 – ReX357

+0

關於我的NFC盾牌發送的APDU,我知道如何構建它,但我在哪裏可以找到每個字節的可能選項列表?我很難找到。 – ReX357

1

這可以通過選擇專有範圍內的AID =「F0394148148100」來完成。即第一個字節的第8-5位必須都設置爲'1'。這是'F'然後使用Arudino的APDU中的AID如下。

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 
    }; 

然後在apduxml這是使用這個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> 

然後用它在你的應用程序清單的服務標籤定義

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; 
    } 

} 

那麼服務得到的迴應APDU並得到結果中的字符串。