设置主卡仿真(Setting up host card emulation)

2019-10-19 00:54发布

我目前正在尝试一个Arduino UNO与NFC盾之间连接到我的Nexus 4运行Android 4.4。

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

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

因此,这里是我的2个问题:

  • 对事物的Arduino的一侧,并在NFC盾需要发送到我的手机我的手机要明白,我在类别“其他”寻找某些应用什么样的“消息”?

  • 对事物的机器人方面,会是怎样的援助过滤器标签值赶上意图是什么? 我可以做一个自定义一个或做我需要坚持某种ISO规格的这个工作?

UPDATE

OK所以这里是我的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服务?

Answer 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  */ };

此外,我建议大家使用以下形式的AID Fxxxxxxxxx... (即设定为第一字节的高4位0xF ,长度为5个16字节之间),其指示一个专有的,未登记的AID,否则你可能与其它标准碰撞应用。 见ISO / IEC 7816-4的更多信息,正确格式化辅助。



Answer 2:

这是可以做到选择AID =“F0394148148100”,其是私有的范围内即比特的第一个字节的8-5必须在每个被设置为“1”。 这是“F”然后用AID在arudino的APDU如下。

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

然后按如下方式使用这个AID在apduxml这是

<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并获得结果中的字符串。



Answer 3:

  • 该援助需要满足ISO标准方面的长度,例如:辅助过滤器的android:NAME =“F0010203040506”
  • Arduino的需要发送一个精心格式APDU的Nexus的。 (CLA / INS / P1 / P2 / LEN)
  • 对于错误:它煤层您的邮件路由到UICC。 这可能是这种情况,如果HCE应用程序没有定义你与Aduino董事会选择正确的AID。

这里的例子( http://developer.android.com/guide/topics/connectivity/nfc/hce.html )开箱的。



文章来源: Setting up host card emulation