【问题标题】:Setting up host card emulation设置主机卡仿真
【发布时间】:2013-12-09 00:07:11
【问题描述】:

我目前正在尝试将带有 NFC Shield 的 Arduino UNO 连接到运行 Android 4.4 的 Nexus 4。

我已经设置了服务,它现在只是在记录。问题是,NFC 意图没有绑定到我的应用程序。调试器报以下错误:

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

这是我的两个问题:

  • 在 Arduino 方面,NFC 屏蔽需要向我的手机发送什么样的“消息”,以便我的手机了解我正在寻找“其他”类别中的某个应用程序?

  • 在 android 方面,捕获该意图的辅助过滤器标记值是多少?我可以制作一个自定义的,还是我需要遵守某种 ISO 规范才能让它工作?

更新

好的,这是我构建 APDU 的 Arduino 草图的相关部分:

            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 服务?

【问题讨论】:

    标签: android arduino nfc apdu hce


    【解决方案1】:

    你确实意识到了

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

    这意味着你的 AID 的剩余部分(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... 形式的 AID(即第一个字节的高半字节设置为 0xF,长度在 5 到 16 个字节之间)表示专有的未注册 AID,否则您可能与其他标准应用程序发生冲突。有关正确格式化 AID 的更多信息,请参阅 ISO/IEC 7816-4。

    【讨论】:

    • 嗨,雷克斯...你能帮我解决你已经准备好的东西吗? M 试图在 Arduino 和 Android HCE 服务之间建立通信。 M 得到相同的错误:UICC[0x0] 未激活。 M采用PN532芯片。您能否帮我提供一个示例 C 程序。提前致谢
    【解决方案2】:

    这可以通过选择在专有范围 i 内的 AID="F0394148148100" 来完成。 e.第一个字节的第 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并获取结果中的字符串。

    【讨论】:

      【解决方案3】:
      • AID 需要在长度方面满足 ISO 标准,例如:aid-filter android:name="F0010203040506"
      • Arduino 需要向 Nexus 发送格式良好的 APDU。 (CLA/INS/P1/P2/Len)
      • 关于错误:它表明您的消息被路由到 UICC。如果 HCE 应用程序未定义您使用 Aduino 板选择的正确 AID,则可能是这种情况。

      此处的示例 (http://developer.android.com/guide/topics/connectivity/nfc/hce.html) 开箱即用。

      【讨论】:

      • 好的,所以我现在的问题是,我如何想出这个 AID?它是我自己为我的应用程序生成的随机数,还是在某处为不同类型的应用程序提供了 AID 列表?请原谅我的困惑,这对我来说是全新的。我一直在尝试阅读我能阅读的所有文档,但其中很多都在我的脑海中。
      • 关于我的 NFC 屏蔽发送的 APDU,我知道如何构建它,但我在哪里可以找到每个字节的可能选项列表?我找不到那个。
      猜你喜欢
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 2013-11-14
      • 2015-09-19
      相关资源
      最近更新 更多