You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Android设备的C#.Net Web应用中用JavaScript读取Mifare NFC卡可行吗?

Android Web应用中通过JavaScript读取Mifare NFC卡的实现方案

可行性说明

可以通过Web NFC API在Android设备的Web应用中实现Mifare卡读取和NFC事件处理,但需满足以下前提:

  • 设备运行Android 10+,使用**Chrome 89+**或其他支持Web NFC的浏览器
  • 应用部署在HTTPS环境下(本地开发可使用localhost例外)
  • 用户需授权网站访问NFC功能

核心实现步骤及代码示例

替换你现有代码中的NFCRead相关逻辑,完整JavaScript实现如下:

<script src="jquery.js"></script> 

<script type="text/javascript">
// 初始化NFC监听
async function initNFCListener() {
    // 检测Web NFC API支持情况
    if (!("nfc" in navigator)) {
        alert("当前设备或浏览器不支持Web NFC功能");
        return;
    }

    try {
        // 请求NFC权限
        await navigator.permissions.request({ name: "nfc" });
        
        // 监听Mifare Classic标签
        navigator.nfc.watch({
            signal: "tag",
            filters: [{ type: "MIFARE_CLASSIC" }]
        }, async (tag) => {
            await readMifareBlock(tag, 1);
        });
        alert("NFC监听已启动,请将Mifare卡靠近设备");
    } catch (error) {
        alert("NFC初始化失败:" + error.message);
    }
}

// 读取指定块的数据
async function readMifareBlock(tag, blockNumber) {
    try {
        // 计算块所属扇区(Mifare Classic每扇区含4个块)
        const sectorNumber = Math.floor(blockNumber / 4);
        // 出厂默认密钥A
        const defaultKeyA = new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
        
        // 连接标签
        await tag.connect();
        
        // 验证扇区密钥A
        const authResult = await tag.transceive(new Uint8Array([
            0x60, // 验证密钥A指令
            sectorNumber,
            ...defaultKeyA
        ]));
        
        if (authResult[0] !== 0x00) {
            throw new Error("密钥验证失败,请确认卡片使用默认密钥");
        }
        
        // 读取指定块数据
        const blockData = await tag.transceive(new Uint8Array([0x30, blockNumber]));
        
        // 将二进制数据转为十六进制字符串展示
        const hexStr = Array.from(blockData)
                          .map(byte => byte.toString(16).padStart(2, '0'))
                          .join(' ');
        alert(`块${blockNumber}读取成功:\n${hexStr}`);
        
        // 断开连接
        await tag.close();
    } catch (error) {
        alert("读取失败:" + error.message);
        if (tag?.close) await tag.close();
    }
}

// 页面加载完成后启动监听
$(document).ready(function() {
    initNFCListener();
});
</script>

关键注意事项

  • 扇区与块对应规则:Mifare Classic每个扇区包含4个块(如扇区0对应块0-3),块3是扇区控制块,禁止随意写入。读取块1需验证扇区0的密钥。
  • 权限授权:首次使用时浏览器会弹出权限请求,用户必须选择允许才能访问NFC功能。
  • 兼容性限制:部分Android设备可能因系统或硬件限制,无法通过Web NFC访问Mifare Classic卡,建议在目标设备上测试。
  • 数据处理:读取到的blockData为Uint8Array类型,可根据业务需求转为字符串、十六进制或其他格式。

内容的提问来源于stack exchange,提问作者Firouz Zahedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:34:57