更新记录
1.0.0(2025-09-01)
** 尽可能更新到最新版本 第一版 支持 isoDep,NfcA ,NfcB,NfcF,NfcV,Ndef,MifareClassic,MifareUltralight,等多种协议 遇到什么问题随时联系作者
平台兼容性
uni-app(4.76)
Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
---|---|---|---|---|---|---|---|---|
× | × | × | × | × | × | × | × | 5.1.0.107 |
微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
---|---|---|---|---|---|---|---|---|---|---|
× | × | × | × | × | × | - | × | × | - | - |
uni-app x(4.76)
Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
---|---|---|---|---|---|
- | - | - | - | - | - |
其他
多语言 | 暗黑模式 | 宽屏模式 |
---|---|---|
√ | √ | √ |
** uniapp Hbuilderx 尽可能更新到最新版本 低版本不确定是否兼容
第一步 引入插件: import * as nfcPlugin from '@/uni_modules/nfc-plugin'
第二步 创建实例 var NFC = new nfcPlugin.HarmonyNFCAdapter()
// 初始化HEC
NFC.initHCE(aidList : string[]) : Promise
// 启动标签发现 成功返回 taginfo 标签信息(获取标签对象时需传入此参数) 失败返回false NFC.onDiscovered() : Promise<tag.TagInfo | boolean>
//关闭标签发现 成功返回1失败 返回0
NFC.offDiscovered() : Promise
IsoDep 协议
const IsoDep = getIsoDep(tagInfo) // 用于支持 ISO-DEP协议 (基于ISO 14443-4标准)的智能卡 成功返回标签对象 失败返回 null
IsoDep.connect(): void // 建立与 ISO-DEP标签的连接
IsoDep.getHiLayerResponse(): number[]
IsoDep.getHistoricalBytes(): number[]
IsoDep.getMaxTransmitSize(): number
IsoDep.isExtendedApduSupported(): Promise
NfcA 协议
const NfcA = getNfcA(tagInfo) // 用于支持 NFC-A协议 (ISO 14443 Type A)的标签 成功返回标签对象 失败返回 null NfcA.connect(): void // 建立与标签的连接 NfcA.NfcATag.getAtqa(): number[] // 获取NFC-A标签的ATQA(Answer To Request A)响应值 ATQA对请求命令的响应数据 NfcA.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NfcA.getSak(): number // 获取NFC-A标签的SAK值 SAK是标签在被选中后返回的值,包含标签的额外属性信息 NfcA.getTimeout(): number // 获取当前NFC-A操作的超时时间(毫秒) NfcA.isConnected(): boolean // 检查是否已与NFC-A标签建立连接 NfcA.resetConnection(): void // 重置与NFC-A标签的连接状态 重新调用connect()方法才能恢复通信 NfcA.setTimeout() //设置NFC-A操作的超时时间 NfcA.transmit(data: number[]): Promise<number[]> (+1 overload) // 向标签发送原始数据并接收响应 number[]>字节数组
NfcB 协议
const NfcB = getNfcB(tagInfo) // 用于支持 NFC-B协议 (ISO 14443 Type B)的标签 成功返回标签对象 失败返回 null NfcB.connect(): void // 建立与标签的连接 NfcB.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NfcB.getRespAppData(): number[] // 获取NFC-B标签的应用数据响应 返回number[] 字节数组 NfcB.getRespProtocol(): number[] // 获取NFC-B标签的协议响应 返回number[] 字节数组 NfcB.getTimeout(): number // 获取当前NFC-B操作的超时时间(毫秒) NfcB.isConnected(): boolean // 检查是否已与标签建立连接 NfcB.resetConnection(): void // 重置与标签的连接状态 NfcB.setTimeout(timeout: number): void // 获取当前NFC操作的超时时间(毫秒) NfcB.transmit(data: number[]): Promise<number[]> (+1 overload) // 向 NFC-B标签发送原始数据并接收响应 number[]>字节数组
NfcF协议
const getNfcF(tagInfo) // 用于支持 NFC-F协议 (JIS X 6319-4)的标签,主要用于日本的FeliCa卡。 成功返回标签对象 失败返回 null NfcF.connect(): void // 建立与标签的连接 NfcF.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NfcF.getPmm(): number[] // 获取NFC-F标签的PMm number[]>包含PMm值的字节数组 NfcF.getSystemCode(): number[] // 获取NFC-F标签的系统代码() NFC-F协议中用于标识特定应用或服务的唯一标识 NfcF.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒) NfcF.isConnected(): boolean // 检查是否已与标签建立连接 NfcF.NfcB.resetConnection(): void // 重置与标签的连接状态 NfcF.setTimeout(timeout: number): void // 设置NFC操作的超时时间(毫秒) NfcF.transmit(data: number[]): Promise<number[]> (+1 overload) // 向标签发送原始数据并接收响应 number[]>字节数组
NfcV协议
const getNfcV(tagInfo) // 用于支持 NFC-V协议 (ISO 15693)的标签,通常是非接触式IC卡。 成功返回标签对象 失败返回 null
NfcV.connect(): void // 建立与标签的连接 NfcV.getDsfId(): number // 获取NFC-V标签的DSF ID 用于标识标签的数据存储格式和组织方式 NfcV.getResponseFlags(): number // 获取NFC-V标签的响应标志位 报含标签对命令的响应状态信息,如是否成功执行命令等 NfcV.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NfcV.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒) NfcV.isConnected(): boolean // 检查是否已与标签建立连接 NfcV.NfcB.resetConnection(): void // 重置与标签的连接状态 NfcV.setTimeout(timeout: number): void // 设置NFC操作的超时时间(毫秒) NfcV.transmit(data: number[]): Promise<number[]> (+1 overload) // 向 NFC-V标签发送原始数据并接收响应 number[]>字节数组
Ndef 协议
const Ndef = getNdef(tagInfo) 获取Ndef 标签对象 成功返回标签对象 失败返回 null
Ndef.connect(): void // 建立与NDEF标签的连接
Ndef.canSetReadOnly(): boolean // 检查NDEF标签是否支持设置为只读状态
Ndef.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节)
Ndef.getNdefMessage(): NdefMessage //获取标签中当前存储的NDEF消息
Ndef.getNdefTagType(): tag.NfcForumType // 获取NDEF标签的类型
Ndef.getNdefTagTypeString(type: tag.NfcForumType): string // 将NDEF标签类型枚举转换为可读的字符串表示
Ndef.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒)
Ndef.setTimeout(timeout: number): void // 设置NFC操作的超时时间
Ndef.isConnected(): boolean // 检查是否已与标签建立连接
Ndef.isNdefWritable(): boolean //检查NDEF标签是否可写入
Ndef.readNdef(): Promise
MifareClassic 协议 const MifareClassic = getMifareClassic(tagInfo) 专用于 M1卡 (MIFARE Classic系列卡,如S50/S70卡)的操作
MifareClassic.connect(): void // 建立与标签的连接
-
验证MIFARE Classic标签的指定扇区
-
@param sectorIndex - 要验证的扇区索引
-
@param key - 验证密钥(字节数组形式)
-
@param isKeyA - 是否使用KeyA进行验证 MifareClassic.authenticateSector(sectorIndex: number, key: number[], isKeyA: boolean): Promise
(+1 overload) -
减少MIFARE Classic标签指定块中的值
-
@param blockIndex - 要操作的块索引
-
@param value - 要减少的值 MifareClassic.decrementBlock(blockIndex: number, value: number): Promise
(+1 overload) -
获取MIFARE Classic标签指定扇区中的块数量
-
@param sectorIndex - 扇区 MifareClassic.getBlockCountInSector(sectorIndex: number): number
-
获取MIFARE Classic标签指定扇区的起始块索引
-
@param sectorIndex - 扇区索引
-
@returns number - 该扇区第一个块的索引 MifareClassic.getBlockIndex(sectorIndex: number): number
MifareClassic.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) MifareClassic.getSectorCount(): number // 获取MIFARE Classic标签的总扇区数量
-
根据块索引获取对应的扇区索引
-
@param blockIndex - 块索引
-
@returns number - 该块所属的扇区索引 MifareClassic.getSectorIndex(blockIndex: number): number
-
获取MIFARE Classic标签的总容量(字节)
-
@returns number - 标签的总容量 MifareClassic.getTagSize(): number //
MifareClassic.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒)
- 获取MIFARE Classic标签的具体类型
- @returns tag.MifareClassicType - 标签类型枚举值(如S50、S70等) MifareClassic.getType(): tag.MifareClassicType
- 增加MIFARE Classic标签指定块中的值
- 通常用于电子钱包功能,增加钱包余额
- @param blockIndex - 要操作的块索引
- @param value - 要增加的值
- @returns Promise
- 操作完成的Promise MifareClassic.incrementBlock(blockIndex: number, value: number): Promise (+1 overload)
MifareClassic.isConnected(): boolean // 检查是否已与标签建立连接
-
检查当前MIFARE Classic标签是否为模拟标签
-
@returns boolean - 如果是模拟标签返回true,否则返回false MifareClassic.isEmulatedTag(): boolean
-
读取MIFARE Classic标签指定块的数据
-
@param blockIndex - 要读取的块索引
-
@returns Promise<number[]> - 包含块数据的字节数组Promise MifareClassic.readSingleBlock(blockIndex: number): Promise<number[]> (+1 overload)
-
MifareClassic.resetConnection(): void // 重置与MIFARE Classic标签的连接状态
从MIFARE Classic标签的指定块恢复之前减少或增加的值
- 通常与decrementBlock/incrementBlock配合使用,用于电子钱包回滚操作
- @param blockIndex - 要恢复的块索引
- @returns Promise
- 恢复操作完成的Promise MifareClassic.restoreFromBlock(blockIndex: number): Promise (+1 overload)
MifareClassic.setTimeout(timeout: number): void // 设置NFC操作的超时时间
-
将之前通过incrementBlock或decrementBlock修改的值传输到MIFARE Classic标签的指定块
- 通常与incrementBlock/decrementBlock配合使用,用于电子钱包确认操作
- @param blockIndex - 要传输到的块索引
- @returns Promise
- 传输操作完成的Promise MifareClassic.transferToBlock(blockIndex: number): Promise (+1 overload)
-
向MIFARE Classic标签的指定块写入数据
- 写入前需要先对块所在扇区进行验证
- @param blockIndex - 要写入的块索引
- @param data - 要写入的字节数组数据(通常为16字节)
- @returns Promise
- 写入操作完成的Promise MifareClassic.writeSingleBlock(blockIndex: number, data: number[]): Promise (+1 overload)
MifareClassic.transmit(data: number[]): Promise<number[]> (+1 overload) //向标签发送数据并接收响应 自定义命令交互
MIFARE Ultralight 协议
const MifareUltralight = getMifareUltralight(tagInfo) // 用于 MIFARE Ultralight卡(一种轻量级的MIFARE卡),非M1卡。 MifareUltralight.connect(): void // 建立与标签的连接 MifareUltralight.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) MifareUltralight.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒)
- 获取MIFARE Ultralight标签的具体类型
- 用于识别当前操作的MIFARE Ultralight标签是哪种具体型号,如标准Ultralight、Ultralight C或其他衍生类型 MifareUltralight.getType(): tag.MifareUltralightType
MifareUltralight.MifareClassic.isConnected(): boolean // 检查是否已与标签建立连接
- 从MIFARE Ultralight标签读取从指定页开始的多个连续页数据
- 适用于需要批量读取标签数据的场景,可以一次性获取多页内容以提高读取效率
- @param pageIndex - 起始页索引,表示从第几页开始 MifareUltralight.readMultiplePages(pageIndex: number): Promise<number[]> (+1 overload)
MifareUltralight.resetConnection(): void // 重置与标签的连接 setTimeout(timeout: number): void // 设置与MIFARE Ultralight标签交互的超时时间 MifareUltralight.setTimeout(timeout: number): void // 设置NFC操作的超时时间 MifareUltralight.transmit(data: number[]): Promise<number[]> (+1 overload) //向标签发送指令并接收响应 自定义命令交互 number[]> 字节数组
- 向MIFARE Ultralight标签的指定页写入数据(必须先建立连接)
- 用于修改标签的特定页内容,适用于需要更新标签数据的场景
- @param pageIndex - 目标页索引,表示要写入数据的页面编号
- @param data - 要写入的数据字节数组,通常需要包含4字节数据(对应一页容量)
MifareUltralight.writeSinglePage(pageIndex: number, data: number[]): Promise
(+1 overload)
NdefFormatable 协议
const NdefFormatable = getNdefFormatable(tagInfo) // 用于可格式化为NDEF(NFC数据交换格式)的标签,与卡类型无直接对应关系
NdefFormatable.connect(): void // 建立与标签的连接
- 将支持格式化的NFC标签格式化为NDEF格式,并写入初始NDEF消息
- 用于将非NDEF格式的标签转换为标准NDEF格式标签,使其能够存储和传输NDEF数据
- @param message - 要写入的NDEF消息对象,包含标签格式化后存储的初始数据
NdefFormatable.format(message: NdefMessage): Promise
(+1 overload)
- 将支持格式化的NFC标签格式化为只读NDEF格式,并写入初始NDEF消息
- 用于创建一次性写入、永久可读的NDEF标签,适用于需要防止数据被篡改的场景
- @param message - 要写入的NDEF消息对象,包含标签格式化后存储的唯一数据
NdefFormatable.formatReadOnly(message: NdefMessage): Promise
(+1 overload
NdefFormatable.Ndef.getMaxTransmitSize(): number //获取标签支持的最大传输数据大小(字节) NdefFormatable.getTimeout(): number // 获取当前NFC操作的超时时间(毫秒) NdefFormatable.setTimeout(timeout: number): void // 设置NFC操作的超时时间 NdefFormatable.isConnected(): boolean // 检查是否已与标签建立连接 NdefFormatable.resetConnection(): void // 重置与标签的连接 NdefFormatable.transmit(data: number[]): Promise<number[]> (+1 overload) //向标签发送指令并接收响应 自定义命令交互 number[]> 字节数组