NFC 控制器接口 (NCI) 用于与 NFC 控制器 (NFCC) 互动。本页面介绍了 Android 专有 NCI 命令的规范。
NCI 定义
Android 专有 NCI 命令使用专有群组 ID (GID) 0xF
和 Android 操作码标识符 (OID) 代码空间 0xC
。
通用数据包格式
Android NCI 数据包格式遵循 NCI 规范,使用专有的 Group_ID 0xF
和 Opcode_ID 0x0C
处理控制数据包。对于每个 Android 专有消息,数据包负载的第一个字节必须设置为 Android 操作码 (0x0C
)。Android 控制数据包使用 Message_Type
和 PBF
来识别命令、响应和通知,方式与标准命令类似。
Android 数据包格式如下表所示
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Message_Type(消息类型)
|
PBF
|
Group_ID = 0xF (专有)
|
|||||
保留供将来使用 (RFU) | Opcode_ID = 0x0C (ANDROID)
|
||||||
Payload_Length(负载长度)
|
|||||||
Android_Opcode_ID(Android 操作码 ID)
|
|||||||
Android_Payload(Android 负载)
|
|||||||
指定的 Android 操作码标识符在下表中列出。每个数据包的规范将在后续章节中介绍。
Android OID | Message type(消息类型) | Message name(消息名称) |
---|---|---|
0x00 | NCI_MT_CMD | NCI_ANDROID_GET_CAPS_CMD |
NCI_MT_RSP | NCI_ANDROID_GET_CAPS_RSP
|
|
0x01 | NCI_MT_CMD | NCI_ANDROID_POWER_SAVING_CMD
|
NCI_MT_RSP | NCI_ANDROID_POWER_SAVING_RSP
|
|
0x02 | NCI_MT_CMD | NCI_ANDROID_PASSIVE_OBSERVE_MODE_CMD |
NCI_MT_RSP | NCI_ANDROID_PASSIVE_OBSERVE_MODE_RSP
|
|
0x03 | NCI_MT_NTF | NCI_ANDROID_POLLING_FRAME_NTF
|
0x04 | NCI_MT_CMD | NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_CMD |
NCI_MT_RSP | NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_RSP |
获取功能命令
主机使用 NCI_ANDROID_GET_CAPS_CMD
查询 NFCC 支持的 Android 专有功能列表。NCI_ANDROID_GET_CAPS_CMD
命令不接受任何参数。
NFCC 必须使用 NCI_ANDROID_GET_CAPS_RSP
响应,状态为 STATUS_OK
,并包含支持的功能和特性列表。
如果 NFCC 不支持 NCI_ANDROID_GET_CAPS_CMD
,主机必须假定每个功能的默认值为指定值。如果 NFCC 在响应中未返回指定的功能,主机必须假定该功能具有指定的默认值。
NCI_ANDROID_GET_CAPS_CMD
负载字段 | Size(大小) | Value/description(值/描述) | |||||
---|---|---|---|---|---|---|---|
N/A | 0 octets(字节) |
NCI_ANDROID_GET_CAPS_RSP
负载字段 | Size(大小) | Value/description(值/描述) | |||||
---|---|---|---|---|---|---|---|
Status(状态) | 1 octet(字节) | 请参阅 NCI 规范的表 140 中的状态代码。 | |||||
Android_Version(Android 版本)
|
2 octets(字节) | 标识 NFCC 实现的 Android 要求版本。 | |||||
0x0000 | Android 15 | ||||||
Number of capabilities(功能数量) | 1 octet(字节) | 支持的功能数量 (n) | |||||
Capabilities[0..n](功能[0..n]) | (m + 2) * n octets(字节) | 支持的功能 | |||||
Type(类型) | 1 octet(字节) | 功能的标识符 | |||||
Len(长度) | 1 octet(字节) | 值的长度 (m) | |||||
Value(值) | m octets(字节) | 功能的值 |
Android 专有功能
Capability name(功能名称) | ID | Size(大小) | Value/description(值/描述) | |||||
---|---|---|---|---|---|---|---|---|
Observe mode(观察模式) | 0x00 | 1 octet(字节) | 支持观察模式。 0x00 (默认) - 不支持此功能。 0x01 - 支持此功能,主机可进行 RF 停用(Android 15 或更高版本需要)。 所有其他值均为 RFU。 |
|||||
Polling frame notification(轮询帧通知) | 0x01 | 1 octet(字节) | 支持轮询帧通知。如果支持,则为 0x01;如果不支持,则为 0x00(默认)。所有其他值均为 RFU。 | |||||
Power saving mode(省电模式) | 0x02 | 1 octet(字节) | 支持省电模式。如果支持,则为 0x01;如果不支持,则为 0x00(默认)。所有其他值均为 RFU。 | |||||
Auotransact polling loop filter(自动事务轮询循环过滤器) | 0x03 | 1 octet(字节) | 支持固件中的轮询循环过滤器,以便在全局启用观察模式时绕过特定模式的观察模式。 0x00 (默认) - 不支持此功能 0x01 - 支持轮询循环过滤器 所有其他值均为 RFU |
|||||
0x04..0xFF | 0 octets(字节) | 保留供将来使用 |
Power saving command(省电命令)
为了使 NFCC 转换为省电模式,主机可以使用 NCI_ANDROID_POWER_SAVING_CMD
命令。NFCC 必须使用 NCI_ANDROID_POWER_SAVING_RSP
响应,并包含指示成功或失败的状态代码。
在省电模式下,主机不得向 NFCC 发送任何命令,NFCC 也不得向主机发送任何通知或响应。NFCC 或嵌入式安全元件 (eSE) 可以根据启用省电模式之前设置的路由配置自动接受传入的支付请求。
要返回全功率模式,主机可以重置或重新初始化 NFCC。
NCI_ANDROID_POWER_SAVING_CMD
负载字段 | Size(大小) | Value/description(值/描述) | |
---|---|---|---|
Power saving mode(省电模式) | 1 octet(字节) | 0x00 | 禁用省电模式 |
0x01 | 启用省电模式 |
NCI_ANDROID_POWER_SAVING_RSP
负载字段 | Size(大小) | Value/description(值/描述) | |||||
---|---|---|---|---|---|---|---|
Status(状态) | 1 octet(字节) | 请参阅 NCI 规范的表 140 中的状态代码, |
Set observe mode command(设置观察模式命令)
要激活或停用观察模式,主机可以使用 NCI_ANDROID_PASSIVE_OBSERVE_MODE_CMD
命令。NFCC 必须使用 NCI_ANDROID_PASSIVE_OBSERVE_MODE_RSP
响应,并包含指示成功或失败的状态代码。
当观察模式禁用时,NFCC 必须按照活动技术规范实现标准侦听模式活动。
当观察模式激活时,NFCC 在侦听模式的轮询循环期间不得响应任何轮询请求,除非获得主机明确授权。当检测到场激活时,NFCC 必须发送 RF_FIELD_INFO_NTF
通知(如 NCI 规范的第 5.3 节所定义)。如果轮询模式发现处于活动状态,NFCC 必须按照活动技术规范实现轮询模式活动。NFCC 可以缓存轮询信息,以便在观察模式停用后立即继续进行设备激活。
如果主机因任何原因(例如,电池耗尽或用户启动关机)而关闭,NFCC 应关闭观察模式,以便 SE 交易可以继续进行。
NCI_ANDROID_PASSIVE_OBSERVE_MODE_CMD
负载字段 | Size(大小) | Value/description(值/描述) | |
---|---|---|---|
observe mode(观察模式) | 1 octet(字节) | 0x00 | Disable observe mode (default)(禁用观察模式(默认)) |
0x01 | Enable observe mode(启用观察模式) |
NCI_ANDROID_PASSIVE_OBSERVE_MODE_RSP
负载字段 | Size(大小) | Value/description(值/描述) | |||||
---|---|---|---|---|---|---|---|
Status(状态) | 1 octet(字节) | 请参阅 NCI 规范的表 140 中的状态代码。 |
Polling loop notification(轮询循环通知)
NFCC 必须在每个轮询循环帧之后向主机发送 NCI_ANDROID_POLLING_FRAME_NTF
通知。当生成 RF_FIELD_INFO_NTF
和 NCI_ANDROID_POLLING_FRAME_NTF
通知时,NFCC 必须在 RF_FIELD_INFO_NTF
之后发送 NCI_ANDROID_POLLING_FRAME_NTF
。
NCI_ANDROID_POLLING_FRAME_NTF
通知独立于观察模式是否处于活动状态。当观察模式处于活动状态时,NFCC 必须始终在继续交易之前发送 NCI_ANDROID_POLLING_FRAME_NTF
通知。
NCI_ANDROID_POLLING_FRAME_NTF
负载字段 | Size(大小) | Value/description(值/描述) | |||||
---|---|---|---|---|---|---|---|
Polling Data[0..n](轮询数据[0..n]) | (m +3) * n octets(字节) | 自上次通知以来收到的轮询请求列表。每个结果都提供接收到的请求的类型(技术)和来自请求的可识别数据,具体取决于技术。 | |||||
Type(类型) | 1 octet(字节) | 请参阅帧类型。 | |||||
Flags(标志) | 1 octet(字节) | 请参阅标志字节。 | |||||
Length(长度) | 1 octet(字节) | 轮询数据报告的长度 (m),包括时间戳和增益字段。 | |||||
Timestamp(时间戳) | 4 octets(字节) | 接收轮询请求的时间戳,以毫秒为单位测量,大端序。 | |||||
Gain(增益) | 1 octet(字节) | 轮询请求的强度。 0xFF 表示该值不可用。 |
|||||
数据 | m - 5 octets(字节) | 返回轮询请求中存在的标识数据 |
Frame types(帧类型)
Polling frame(轮询帧) | Type(类型) | Size(大小) | Value/Description(值/描述) | |
---|---|---|---|---|
Remote field(远程场) | 0x00 | 1 octet(字节) | 0x00 | Field off(场关闭) |
0x01 | Field on(场开启) | |||
0x02..0xFF | RFU | |||
NFC-A | 0x01 | n octets(字节) | 值必须包含 ISO 14443-3 命令(例如,REQ 或 WUP) | |
NFC-B | 0x02 | n octets(字节) | 值必须包含 AIF 字节和 ISO 14443-3 命令(例如,REQ 或 WUP) | |
NFC-F | 0x03 | n octets(字节) | 值必须包含 ISO 14443-3 命令(例如,REQ 或 WUP) | |
NFC-V | 0x04 | n octets(字节) | 值必须包含 ISO 14443-3 命令(例如,REQ 或 WUP) | |
Unknown(未知) | 0x07 | n octets(字节) | Raw frame data(原始帧数据) |
Flag byte definition(标志字节定义)
Flags(标志) | ||||||||
---|---|---|---|---|---|---|---|---|
b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7 | |
0 | Short frame(短帧) | RFU | RFU | RFU | RFU | RFU | RFU | RFU |
1 | Long frame(长帧) |
Query observe mode status command(查询观察模式状态命令)
要检索被动观察模式的当前状态,主机可以使用 NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_CMD
命令。NFCC 必须使用 NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_RSP
响应,并包含指示成功或失败的状态代码。
NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_CMD
负载字段 | Size(大小) | Value/description(值/描述) | |||||
---|---|---|---|---|---|---|---|
N/A | 0 octets(字节) |
NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_RSP
负载字段 | Size(大小) | Value/description(值/描述) | |
---|---|---|---|
Status(状态) | 1 octet(字节) | 请参阅 NCI 规范的表 140 中的状态代码, | |
observe mode(观察模式) | 1 octet(字节) | 0x00 | Observe mode disabled(观察模式禁用) |
0x01 | Observe mode enabled(观察模式启用) |