android - 设置主机卡仿真

标签 android arduino nfc apdu hce

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

我有服务设置,目前只是在记录。问题是,NFC Intent 未绑定(bind)到我的应用程序。调试器报如下错误:

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

所以这是我的 2 个问题:

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

  • 在 android 方面,aid-filter 标签的值是多少才能捕捉到该 Intent ?我可以定制一个吗?还是我需要遵守某种 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 服务?

最佳答案

你确实意识到了

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 的其余部分(0x4C0x650x6C0x610x6E, 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  */ };

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

关于android - 设置主机卡仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20173181/

相关文章:

android - NDEF 与 APDU NFC 安卓

javascript - 出示 NFC 卡时触发事件

android - 在哪里放置android BindingAdapter 方法?

android - 建议使用哪种协议(protocol)将 GPS 数据从 Android 应用程序发送到服务器

android - 如何知道 WebView 渲染何时完成

arduino - I2C onReceive-handler 只调用一次

android - 使用 Maven 创建默认 AVD?

android - Arduino LED 闪烁问题

c++ - Arduino代码错误,用户输入的LED闪烁

android - HCE Android 的 NDEF 消息