Android 专有 NCI 命令

NFC 控制器接口 (NCI) 用于与 NFC 控制器 (NFCC) 互动。本页面介绍了 Android 专有 NCI 命令的规范。

NCI 定义

Android 专有 NCI 命令使用专有群组 ID (GID) 0xF 和 Android 操作码标识符 (OID) 代码空间 0xC

通用数据包格式

Android NCI 数据包格式遵循 NCI 规范,使用专有的 Group_ID 0xFOpcode_ID 0x0C 处理控制数据包。对于每个 Android 专有消息,数据包负载的第一个字节必须设置为 Android 操作码 (0x0C)。Android 控制数据包使用 Message_TypePBF 来识别命令、响应和通知,方式与标准命令类似。

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_NTFNCI_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(观察模式启用)