设置主机卡仿真 [英] Setting up host card emulation
问题描述
我目前正在尝试将带有 NFC Shield 的 Arduino UNO 连接到运行 Android 4.4 的 Nexus 4.
I am currently attempting to connect between an Arduino UNO with NFC Shield to my Nexus 4 running Android 4.4.
我有服务设置,目前只是在记录.问题是,NFC 意图没有绑定到我的应用程序.调试器报如下错误:
I have the service setup, it's simply logging at the moment. Problem is, the NFC intent doesn't get bound to my app. The debugger reports the following error:
11-24 02:45:46.139 4006-4027/? E/BrcmNfcNfa﹕ UICC[0x0] is not activated
所以这是我的两个问题:
So here's my 2 questions:
在 Arduino 方面,NFC 屏蔽需要向我的手机发送什么样的消息",以便我的手机了解我正在寻找其他"类别中的某个应用程序?
On the Arduino side of things, what kind of 'message' does the NFC shield needs to send to my phone for my phone to understand that I'm looking for a certain app in category 'Other'?
在安卓方面,捕捉该意图的辅助过滤器标签值是什么?我可以定制一个还是需要遵守某种 ISO 规范才能使其正常工作?
On the android side of things, what will be the aid-filter tag value to catch that intent? Can I make up a custom one or do I need to stick to some kind of ISO specification for this to work?
更新
好的,这是我构建 APDU 的 Arduino 草图的相关部分:
OK so here's the relevant part of my Arduino sketch where I build my 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 文件:
And here's the APDU service XML file in my android app:
<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 防护罩上时得到的日志:
And this is the log I get when I hover my phone over the NFC shield:
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 服务?
How come Android isn't routing the APDU to my HCE Service?
推荐答案
你确实意识到
uint8_t message[5];
message[0] = 0x00;
message[1] = 0xA4;
message[2] = 0x04;
message[3] = 0x00;
message[4] = 0x08;
message[5] = 0x4C656C616E746F73ULL;
实际上会产生一个看起来像这样的数组吗?
will actually result in an array that looks like this?
uint8_t message[] = { 0x00, 0xA4, 0x04, 0x00, 0x08, 0x73 };
这意味着您的 AID 的其余部分(0x4C
、0x65
、0x6C
、0x61
、0x6E
, 0x74
, 0x6F
) 被有效地切断和,因此您的 APDU 也有错误的长度 (Lc) 字段.
Which means that the remaining parts of your AID (0x4C
, 0x65
, 0x6C
, 0x61
, 0x6E
, 0x74
, 0x6F
) are effectively cut off and consequently your APDU also has a wrong length (Lc) field.
因此您可能希望正确格式化 SELECT APDU:
So you may want to properly format the 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.
Moreover, I suggest that you use an AID of the form Fxxxxxxxxx...
(i.e. the upper nibble of the first byte set to 0xF
, length between 5 and 16 bytes) indicating a proprietary, unregistered AID, otherwise you might collide with other standard applications. See ISO/IEC 7816-4 for more information on properly formatting AIDs.
这篇关于设置主机卡仿真的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!