尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

第 38 章:NFC—— 近场通信

第 38 章:NFC—— 近场通信 近场通信(NFC)是工作在 13.56 MHz 的短距离无线技术,典型通信距离仅数厘米。它基于非接触式智能卡所使用的 ISO/IEC 14443 与 FeliCa 标准,同时新增了点对点通信能力。Android 从 API 9(Android 2.3 Gingerbread)开始支持 NFC,其协议栈历经多代架构演进。NFC 最核心的特征就是通信距离极短,通常为 0‑4 厘米。物理接触靠近天然构成了一种认证因子:用户必须主动触碰才能完成支付、数据分享或者身份认证。射频链路本身是被动式的:一台设备(读写器 / 发起方)产生射频场,另一台设备(标签 / 卡片 / 目标设备)通过调制射频场完成通信。38.1 NFC 架构38.1.1 NFC 标准与工作模式NFC 包含多项 ISO 标准及行业标准,在 AOSP 源码中每一项标准都对应一种 “技术类型”:标准AOSP 技术类型常见用途ISO 14443‑3ANfcAMIFARE、绝大多数标签ISO 14443‑3BNfcB电子护照、部分交通卡ISO 14443‑4IsoDep智能卡、HCE 主机卡模拟JIS X 6319‑4NfcFFeliCa(日本交通卡、支付卡)ISO 15693NfcV图书标签、仓库货签ISO 14443‑3A 变体MifareClassic传统门禁卡ISO 14443‑3A 变体MifareUltralight活动门票NFC‑DEP(ISO 18092)(已废弃)旧版 Android BeamAndroid 的 NFC 有三种基础工作模式:读写器模式:手机产生射频场,与被动标签或智能卡通信。卡模拟模式:手机模拟一张非接触智能卡,响应外部读写器的射频场。分为 HCE 主机卡模拟(由应用处理器处理)与非主机卡模拟(由安全单元 SE 处理)。点对点模式:两台 NFC 设备双向交换数据。该模式曾用于 Android Beam,Android 10 中已废弃。38.1.2 AOSP NFC 协议栈:分层结构Android NFC 实现为一套分层协议栈,从应用层 Java 代码一直延伸到厂商硬件:38.1.3 核心源码目录AOSP 中 NFC 实现分布在多个源码目录:目录用途packages/modules/Nfc/framework/公开 API:NfcAdapter、NdefMessage、NdefRecord、各类 tech 类packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService、NfcDispatcher 以及核心系统逻辑packages/modules/Nfc/NfcNci/src/com/android/nfc/cardemulation/HCE 与卡模拟子系统packages/modules/Nfc/NfcNci/nci/src/com/android/nfc/dhimpl/NativeNfcManager 本地接口packages/modules/Nfc/NfcNci/nci/jni/连接 Java 与 libnfc‑nci 的 JNI C++ 代码packages/modules/Nfc/libnfc‑nci/NCI 协议栈 C 库hardware/interfaces/nfc/aidl/AIDL HAL 接口定义hardware/interfaces/nfc/1.0/ ~ 1.2/旧版 HIDL HAL 接口packages/modules/Nfc/apex/Mainline APEX 打包配置38.1.4 NfcAdapter:应用程序入口NfcAdapter 是面向应用的单例类,管控全部 NFC 操作。应用通过一个静态方法获取实例://源码路径:packages/modules/Nfc/framework/java/android/nfc/NfcAdapter.java public final class NfcAdapter { // 三种标签分发Intent,按优先级排序 public static final String ACTION_NDEF_DISCOVERED = "android.nfc.action.NDEF_DISCOVERED"; public static final String ACTION_TECH_DISCOVERED = "android.nfc.action.TECH_DISCOVERED"; public static final String ACTION_TAG_DISCOVERED = "android.nfc.action.TAG_DISCOVERED"; // 读写器模式标志位 public static final int FLAG_READER_NFC_A = 0x1; public static final int FLAG_READER_NFC_B = 0x2; public static final int FLAG_READER_NFC_F = 0x4; public static final int FLAG_READER_NFC_V = 0x8; public static final int FLAG_READER_NFC_BARCODE = 0x10; public static final int FLAG_READER_SKIP_NDEF_CHECK = 0x80; public static final int FLAG_READER_NO_PLATFORM_SOUNDS = 0x100; ... }适配器通过 Binder 接口(INfcAdapter.aidl)和 NfcService 通信。关键方法:enableReaderMode () /disableReaderMode ():独占式标签读取enableForegroundDispatch () /disableForegroundDispatch ():前台 Activity 优先接收标签事件isEnabled ():查询 NFC 硬件开关状态ignore ():防抖,忽略指定标签38.1.5 NfcService:系统服务组件NfcService 是 NFC 的核心守护进程,代码量超过 6666 行,属于体量较大的系统服务。运行在com.android.nfc进程,共享 UID 为android.uid.nfc,参见 NfcNci/AndroidManifest.xml。它并不运行在 system_server,拥有独立进程。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java public class NfcService implements DeviceHostListener, ForegroundUtils.Callback { static final String TAG = "NfcService"; public static final String SERVICE_NAME = "nfc"; ... }NfcService 职责:通过 NCI 协议栈初始化、管理 NFC 硬件处理屏幕状态变更(屏幕关闭时关闭轮询)将识别到的标签分发给对应应用管理 HCE 主机卡模拟子系统维护 NFCC 控制器路由表对外提供 NfcAdapter 调用的 Binder API38.1.6 NFC HAL:硬件抽象层HAL 介于 NCI 协议栈与厂商 NFC 控制器驱动之间。当前使用基于 AIDL 的接口android.hardware.nfc.INfc,带有@VintfStability注解,适配 Mainline 模块化更新。HAL 对外仅暴露 NCI 主机所需的操作集合。//源码路径:hardware/interfaces/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/INfc.aidl @VintfStability interface INfc { void open(in INfcClientCallback clientCallback); void close(in NfcCloseType type); void coreInitialized(); void factoryReset(); NfcConfig getConfig(); void powerCycle(); void preDiscover(); int write(in byte[] data); void setEnableVerboseLogging(in boolean enable); boolean isVerboseLoggingEnabled(); NfcStatus controlGranted(); }38.1.7 NCI:NFC 控制器接口NCI(NFC Controller Interface)是主机(应用处理器)和 NFC 控制器 NFCC 之间的标准化协议。AOSP 实现在 libnfc‑nci 这个 C 库,实现 NCI 1.0 与 2.0 规范。NCI 协议采用命令‑响应‑通知模型:NCI 消息由 GID(组 ID)与 OID(操作码 ID)分类:GID用途0x00NCI 核心(复位、初始化、配置设置)0x01射频管理(发现、激活)0x02NFCEE 安全单元管理0x0F厂商私有扩展38.1.8 NFC 作为 Mainline 模块(APEX)新版 Android 将 NFC 协议栈打包为 Mainline 模块com.android.nfcservices,Google 可独立更新 NFC 组件,无需完整系统 OTA。该 APEX 包包含:NfcNci APK(NfcService、卡模拟、事件分发逻辑)NFC 框架类libnfc‑nci 原生库JNI 桥接层APEX 清单文件路径:packages/modules/Nfc/apex/manifest.json38.1.9 端到端流程:从射频场到 Intent手机触碰 NFC 标签时完整数据流:38.2 NfcService38.2.1 服务生命周期NfcService 不是传统 Android Service 子类。由 NfcApplication 在 onCreate () 中实例化,并以服务名nfc注册为系统服务,在 NFC 进程的整个生命周期常驻。生命周期状态流转:NfcService 内部状态变量复用 NfcAdapter 定义的状态常量://源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java int mState; // NfcAdapter.STATE_ON, STATE_TURNING_ON, // STATE_OFF, STATE_TURNING_OFF38.2.2 NfcApplication:启动入口NFC 进程由 NfcApplication 启动,它是 Manifest 中声明的 Application 子类。//源码路径:packages/modules/Nfc/NfcNci/AndroidManifest.xml application android:name=".NfcApplication" android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.Material.Light"进程以 UIDandroid.uid.nfc运行,拥有访问 NFC 硬件的特权。启动时 NfcApplication.onCreate () 构造 NfcService 单例并完成注册。38.2.3 EnableDisableTask 状态机NFC 硬件初始化由 AsyncTask 子类 EnableDisableTask 完成,避免固件下载、控制器初始化等耗时操作阻塞主线程。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java static final int TASK_ENABLE = 1; static final int TASK_DISABLE = 2; static final int TASK_BOOT = 3; static final int TASK_ENABLE_ALWAYS_ON = 4; static final int TASK_DISABLE_ALWAYS_ON = 5;开启 NFC 流程:固件校验(mDeviceHost.checkFirmware (),可能触发固件下载)NFC 控制器初始化(mDeviceHost.initialize ())应用路由表启动标签轮询看门狗定时器INIT_WATCHDOG_MS = 90000(90 秒),防止固件下载卡死。部分硬件固件下载耗时较长,因此设置较大超时时间。38.2.4 屏幕状态管理NFC 轮询行为与屏幕状态强绑定。屏幕关闭时,系统会降低或停止 NFC 轮询以节约功耗。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java // 开启NFC轮询的最低屏幕状态 static final int NFC_POLLING_MODE = ScreenStateHelper.SCREEN_STATE_OFF_UNLOCKED;ScreenStateHelper 将显示状态映射为 5 个掩码值(并非顺序递增),文件:packages/modules/Nfc/NfcNci/src/com/android/nfc/ScreenStateHelper.java屏幕状态数值轮询行为SCREEN_STATE_UNKNOWN0x00视作屏幕关闭SCREEN_STATE_OFF_UNLOCKED0x01屏幕熄灭但设备已解锁(轮询阈值)SCREEN_STATE_OFF_LOCKED0x02屏幕熄灭且设备锁定SCREEN_STATE_ON_LOCKED0x04有限轮询(锁屏支付)SCREEN_STATE_ON_UNLOCKED0x08完整轮询判断条件为screenState = NFC_POLLING_MODE。NFC_POLLING_MODE等于SCREEN_STATE_OFF_UNLOCKED(0x01),所有大于等于 0x01 的状态均允许轮询,仅 0x00 不允许。因为是位掩码,不是顺序数值,轮询由数值比较决定,不是简单判断屏幕是否点亮。屏幕状态变更会发送 MSG_APPLY_SCREEN_STATE 消息,重新计算发现参数,更新到 NFCC 控制器。38.2.5 Handler 消息处理器NfcService 依靠 Handler 消息循环处理事件,所有关键业务逻辑都通过消息分发://源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java static final int MSG_NDEF_TAG = 0; static final int MSG_MOCK_NDEF = 3; static final int MSG_ROUTE_AID = 5; static final int MSG_UNROUTE_AID = 6; static final int MSG_COMMIT_ROUTING = 7; static final int MSG_RF_FIELD_ACTIVATED = 9; static final int MSG_RF_FIELD_DEACTIVATED = 10; static final int MSG_RESUME_POLLING = 11; static final int MSG_REGISTER_T3T_IDENTIFIER = 12; static final int MSG_DEREGISTER_T3T_IDENTIFIER = 13; static final int MSG_TAG_DEBOUNCE = 14; static final int MSG_APPLY_SCREEN_STATE = 16; static final int MSG_TRANSACTION_EVENT = 17; static final int MSG_PREFERRED_PAYMENT_CHANGED = 18; static final int MSG_TOAST_DEBOUNCE_EVENT = 19; static final int MSG_DELAY_POLLING = 20; static final int MSG_CLEAR_ROUTING_TABLE = 21; static final int MSG_UPDATE_ISODEP_PROTOCOL_ROUTE = 22; static final int MSG_UPDATE_TECHNOLOGY_ABF_ROUTE = 23;Handler 串行执行 NFC 操作,避免标签分发、路由表提交、屏幕状态切换产生竞态。38.2.6 标签发现:onRemoteEndpointDiscoveredNFC 控制器识别标签后,底层通过 DeviceHostListener 回调向上通知。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java @Override public void onRemoteEndpointDiscovered(TagEndpoint tag) { Log.d(TAG, "onRemoteEndpointDiscovered"); sendMessage(MSG_NDEF_TAG, tag); }MSG_NDEF_TAG 消息处理逻辑:读取标签支持的技术列表与 UID尝试读取标签的 NDEF 数据组装可序列化 Tag 对象,保存标签信息将 Tag 与 NDEF 消息交给 NfcDispatcher播放标签识别提示音启动存在检测,监控标签是否移开38.2.7 DeviceHost 与 DeviceHostListenerDeviceHost 是对原生 NFC 协议栈的抽象接口。NativeNfcManager 实现该接口;NfcService 实现其 Listener 回调。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/DeviceHost.java public interface DeviceHost { public interface DeviceHostListener { public void onRemoteEndpointDiscovered(TagEndpoint tag); public void onHostCardEmulationActivated(int technology); public void onHostCardEmulationData(int technology, byte[] data); public void onHostCardEmulationDeactivated(int technology); public void onRemoteFieldActivated(); public void onRemoteFieldDeactivated(); public void onNfcTransactionEvent(byte[] aid, byte[] data, String seName); public void onEeUpdated(); public void onHwErrorReported(); public void onPollingLoopDetected(ListPollingFrame pollingFrames); public void onVendorSpecificEvent(int gid, int oid, byte[] payload); ... } public interface TagEndpoint { boolean connect(int technology); boolean reconnect(); boolean disconnect(); boolean presenceCheck(); int[] getTechList(); byte[] getUid(); byte[] transceive(byte[] data, boolean raw, int[] returnCode); boolean checkNdef(int[] out); byte[] readNdef(); boolean writeNdef(byte[] data); NdefMessage findAndReadNdef(); boolean formatNdef(byte[] key); boolean isNdefFormatable(); boolean makeReadOnly(); ... } }TagEndpoint 接口定义非常完整,封装对已识别标签的全部操作:原始收发、NDEF 读写、格式化等。38.2.8 NativeNfcManager:JNI 桥接层NativeNfcManager 实现 DeviceHost,通过 JNI 完成 Java 层与 libnfc‑nci 原生库的对接。//源码路径:packages/modules/Nfc/NfcNci/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java public class NativeNfcManager implements DeviceHost { static final String DRIVER_NAME = "android-nci"; private long mNative; // 指向原生结构体的指针 private void loadLibrary() { System.loadLibrary("nfc_nci_jni"); } public native boolean initializeNativeStructure(); private native boolean doInitialize(); private native boolean doDownload(); ... }JNI C++ 实现位于 NfcNci/nci/jni/ 目录,核心文件:NativeNfcManager.cpp:控制器初始化与管理NativeNfcTag.cpp:标签读写、transceive 操作RoutingManager.cpp:AID 与技术路由管理NfcTag.cpp:标签状态跟踪HciEventManager.cpp:来自安全单元 SE 的 HCI 事件38.2.9 读写器模式内部实现当应用开启读写器模式,NfcService 会重新配置 NFC 控制器,关闭卡模拟与点对点,只保留标签轮询。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java ReaderModeParams mReaderModeParams; // enableReaderMode调用时保存参数 static class ReaderModeParams { int flags; IAppCallback callback; int presenceCheckDelay; }ReaderModeDeathRecipient 监控调用方进程。若应用进程死亡,自动关闭读写器模式,防止 NFC 控制器锁死在非标准配置。38.2.10 路由表管理NFCC 控制器内部维护一张路由表,决定收到的 ISO‑DEP、NFC‑F 等帧转发目标:主机应用处理器、eSE 安全单元或者 UICC SIM 卡。NfcService 使用延迟调度器合并多次快速路由变更,避免频繁更新硬件。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java private final ScheduledExecutorService mRtUpdateScheduler = Executors.newScheduledThreadPool(1); // NFCEE更新触发路由更新 mRtUpdateScheduledTask = mRtUpdateScheduler.schedule( () - { if (mIsHceCapable) { mCardEmulationManager.onTriggerRoutingTableUpdate(); } }, 50, TimeUnit.MILLISECONDS);路由由三个维度控制:AID 路由:指定 AID 路由到指定目标协议路由:ISO‑DEP 帧默认转发目标技术路由:NFC‑A/B/F 帧默认转发目标38.2.11 看门狗与故障恢复NfcService 内置看门狗,检测硬件挂死并自动恢复。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java static final int INIT_WATCHDOG_MS = 90000; // 初始化(固件下载)超时90秒 static final int ROUTING_WATCHDOG_MS = 6000; // 路由提交超时6秒收到 onHwErrorReported () 硬件报错回调时,服务完整重启整个协议栈:@Override public void onHwErrorReported() { if (android.nfc.Flags.nfcEventListener() mCardEmulationManager != null) { mCardEmulationManager.onInternalErrorReported( CardEmulation.NFC_INTERNAL_ERROR_NFC_HARDWARE_ERROR); } restartStack(); } private void restartStack() { // ... new EnableDisableTask().execute(TASK_DISABLE); new EnableDisableTask().execute(TASK_ENABLE); }38.2.12 Secure NFC 安全 NFCSecure NFC 限制 NFC 操作仅能在设备解锁状态下生效。开启后 NFCC 仅当设备解锁时响应外部读写器。//源码路径:packages/modules/Nfc/NfcNci/src/com/android/nfc/NfcService.java static final String PREF_SECURE_NFC_ON = "secure_nfc_on"; boolean mIsSecureNfcEnabled;该功能用于防止手机放在口袋中时被非接触盗刷,要求支付操作必须解锁手机。38.3 NFC HAL 硬件抽象层38.3.1 HAL 演进:从 HIDL 到 AIDLNFC HAL 经历三代接口:版本路径传输接口1.0hardware/interfaces/nfc/1.0/HIDL1.1hardware/interfaces/nfc/1.1/HIDL1.2hardware/interfaces/nfc/1.2/HIDLAIDL v1hardware/interfaces/nfc/aidl/ version1AIDLAIDL v2hardware/interfaces/nfc/aidl/ version2AIDLAIDL HAL 是当前标准,@VintfStability保证可跨分区独立更新。所有新设备都应当实现 AIDL 版本 HAL。38.3.2 INfc AIDL 接口主 HAL 接口定义 NCI 主机可以对 NFC 控制器执行的操作集合。//源码路径:hardware/interfaces/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/INfc.aidl @VintfStability interface INfc { void open(in INfcClientCallback clientCallback); void close(in NfcCloseType type); void coreInitialized(); void factoryReset(); NfcConfig getConfig(); void powerCycle(); void preDiscover(); int write(in byte[] data); void setEnableVerboseLogging(in boolean enable); boolean isVerboseLoggingEnabled(); NfcStatus controlGranted(); }方法说明:方法用途open()上电 NFCC,注册接收数据与事件的回调close()下电或进入待机(区分 DISABLE 与 HOST_SWITCHED_OFF)coreInitialized()通知 HAL NCI CORE_INIT 初始化完成write()向 NFCC 发送 NCI 命令 / 数据getConfig()读取硬件静态配置参数powerCycle()硬复位 NFC 控制器preDiscover()发现流程启动前厂商自定义钩子factoryReset()恢复 NFCC 出厂配置controlGranted()向 HAL 授予独占控制权38.3.3 INfcClientCallback 回调接口HAL 通过该回调把数据、事件回传给 NCI 主机协议栈。//源码路径:hardware/interfaces/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/INfcClientCallback.aidl @VintfStability interface INfcClientCallback { void sendData(in byte[] data); void sendEvent(in NfcEvent event, in NfcStatus status); }sendData () 传递来自 NFCC 的 NCI 响应与通知;sendEvent () 传递生命周期事件:OPEN_CPLT、CLOSE_CPLT、ERROR 等。38.3.4 NfcConfig:硬件配置NfcConfig 是可序列化结构体,保存 NCI 协议栈正常工作所需的全部静态硬件配置。//源码路径:hardware/interfaces/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/NfcConfig.aidl @VintfStability parcelable NfcConfig { boolean nfaPollBailOutMode; PresenceCheckAlgorithm presenceCheckAlgorithm; ProtocolDiscoveryConfig nfaProprietaryCfg; byte defaultOffHostRoute; byte defaultOffHostRouteFelica; byte defaultSystemCodeRoute; byte defaultSystemCodePowerState; byte defaultRoute; byte offHostESEPipeId; byte offHostSIMPipeId; int maxIsoDepTransceiveLength; byte[] hostAllowlist; byte[] offHostRouteUicc; byte[] offHostRouteEse; byte defaultIsoDepRoute; byte[] offHostSimPipeIds; boolean t4tNfceeEnable; }关键字段:字段用途defaultRoute默认 AID 路由(主机 = 0x00,或 SE 编号)defaultOffHostRoute默认非主机路由(eSE 编号)defaultOffHostRouteFelicaFeliCa 默认路由(eSE 编号)offHostRouteUiccUICC 安全单元路由 IDoffHostRouteEseeSE 安全单元路由 IDmaxIsoDepTransceiveLengthISO‑DEP 最大帧长度presenceCheckAlgorithm标签在位检测算法t4tNfceeEnable开启 T4 标签 NFCEE 模拟38.3.5 NfcEvent 与 NfcStatus 枚举HAL 使用强类型枚举表示生命周期事件与状态码。//源码路径:hardware/interfaces/nfc/aidl/.../NfcEvent.aidl @Backing(type="int") @VintfStability enum NfcEvent { OPEN_CPLT = 0, CLOSE_CPLT = 1, POST_INIT_CPLT = 2, PRE_DISCOVER_CPLT = 3, HCI_NETWORK_RESET = 4, ERROR = 5, REQUEST_CONTROL = 6, RELEASE_CONTROL = 7, }//源码路径:hardware/interfaces/nfc/aidl/.../NfcStatus.aidl @Backing(type="int") @VintfStability enum NfcStatus { OK = 0, FAILED = 1, ERR_TRANSPORT = 2, ERR_CMD_TIMEOUT = 3, REFUSED = 4, }ERR_CMD_TIMEOUT代表 NFC 控制器停止响应,通常触发 onHwErrorReported (),重启整个协议栈。38.3.6 NfcCloseType 与 PresenceCheckAlgorithmNfcCloseType 控制 NFCC 关闭方式:@Backing(type="int") @VintfStability enum NfcCloseType { DISABLE = 0, // 用户手动关闭NFC HOST_SWITCHED_OFF = 1, // 整机关机 }PresenceCheckAlgorithm 控制 NCI 栈如何检测标签是否仍在射频场内:@Backing(type="byte") @VintfStability enum PresenceCheckAlgorithm { DEFAULT = 0, // 协议栈自动选择 I_BLOCK = 1, // 发送ISO‑DEP I‑Block帧 ISO_DEP_NAK = 2, // 发送ISO‑DEP NAK帧 }38.3.7 ProtocolDiscoveryConfigProtocolDiscoveryConfig 可序列化结构体,配置轮询阶段需要发现哪些 NFC 协议,对应 NCI RF 发现参数,下发给 NFCC 控制器。38.3.8 HAL 打开‑写‑关闭生命周期HAL 严格遵循状态流转:约束:write () 必须在 open 完成(OPEN_CPLT)之后调用。coreInitialized () 通知 HAL 主机 NCI CORE_INIT 序列完成,HAL 可以执行厂商专属初始化动作。38.3.9 HAL 层 NCI 数据流所有 NCI 协议数据经过两条通路:物理传输可以是 SPI、I2C、UART,这些底层细节被 HAL 完全屏蔽。38.3.10 libnfc‑nci:NCI 协议栈libnfc‑nci 库(packages/modules/Nfc/libnfc‑nci/)以 C 语言实现 NCI 协议,负责:NCI 命令组装与响应解析RF 射频发现状态机标签激活与数据交互NFCEE 安全单元管理侦听模式(卡模拟)协议处理库目录结构:libnfc-nci/ src/ nfc/ # NFC核心逻辑 nfa/ # NFA(NFC适配层) gki/ # 通用内核接口(线程) hal/ # HAL适配层 include/ # 头文件 conf/ # 配置文件38.3.11 NFC HAL VTS 测试NFC HAL 的 VTS(厂商测试套件)测试用例存放路径:hardware/interfaces/nfc/aidl/vts/测试覆盖:open ()/close () 完整生命周期write () 返回正确字节计数getConfig () 返回合法硬件配置事件、数据回调正常交付powerCycle () 可正确复位控制器38.4 NDEF:NFC 数据交换格式38.4.1 什么是 NDEFNDEF(NFC Data Exchange Format)是 NFC 论坛定义的轻量级二进制结构化负载编码格式。它与传输介质无关,虽为 NFC 设计,也可在其他信道使用。NDEF 两大核心概念:NdefMessage:容器,包含一条或多条记录NdefRecord:单条带类型的负载(URI、文本、MIME 数据等)Android 中对应类:android.nfc.NdefMessage、android.nfc.NdefRecord。38.4.2 NdefMessage:消息容器//源码路径:packages/modules/Nfc/framework/java/android/nfc/NdefMessage.java public final class NdefMessage implements P
返回列表