1

我目前正在尝试将带有 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 服务?

4

3 回答 3

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

这意味着您的 AID ( 0x4C, 0x65, 0x6C, 0x61, 0x6E, 0x74, 0x6F) 的其余部分被有效地切断因此您的 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  */ };

此外,我建议您使用格式的 AID Fxxxxxxxxx...(即第一个字节的高半字节设置为0xF,长度在 5 到 16 个字节之间)表示专有的、未注册的 AID,否则您可能会与其他标准应用程序发生冲突。有关正确格式化 AID 的更多信息,请参阅 ISO/IEC 7816-4。

于 2013-11-25T09:59:48.597 回答
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 并获取结果中的字符串。

于 2013-11-25T12:54:32.623 回答
0
  • 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 ) 开箱即用。

于 2013-11-24T18:02:06.943 回答