微信小程序读取NFC-MifareClassic1K卡-M1卡详解

这篇具有很好参考价值的文章主要介绍了微信小程序读取NFC-MifareClassic1K卡-M1卡详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近好多朋友私信我想问小程序M1卡的读写问题,现在我给大家伙详细的剖析一下流程。

首先了解一下M1卡的基础知识

M1卡的内存图谱

微信小程序支持的nfc卡片有哪些,微信小程序,小程序,安全,算法,json,javascript,前端

我们把M1的内存区比作一个硬盘,它的16个扇区就相当于把硬盘分区分了A、B、C...等16个磁盘,每个磁盘上又创了四个文件(块0,块1,块2,块3),每个块都是用16个字节的16进制存放数据

块3:存放了当前扇区的密钥A(占用0-5字节)密钥B(占用10-15字节)、和各个块的访问控制权限(占用6-9字节)

块0~块2:存放用户自定义的数据

认证:

认证是M1进行读取和写入之前必须处理的操作,如果你要操作的块读写只需要密钥A的认证,那就只要做一次密钥A的认证就可以进行读写了,这完全取决于上面说的访问控制权限,关于访问控制本文就不细讲了,想了解的可以去百度学习一下。

指令:

微信小程序支持的nfc卡片有哪些,微信小程序,小程序,安全,算法,json,javascript,前端微信小程序支持的nfc卡片有哪些,微信小程序,小程序,安全,算法,json,javascript,前端

小程序实现M1的认证读取:

//请阅读如下代码注释文章来源地址https://www.toymoban.com/news/detail-844467.html


let adapter;//定义一个NFC适配器
let mifare;

adapter = wx.getNFCAdapter();
    adapter.startDiscovery({
      success:function(){
        console.log('开启NFC适配器成功。');  
      },
      fail:function(res){
        console.log('开启NFC适配器失败!');
        
        if(res.errCode==13000){
          //当前设备不支持NFC
        }else if(res.errCode==13001){
          //系统NFC开关未打开
        }else{
          //未知错误
        }
      }
    });

    //注册发现芯片后处理事件
    adapter.onDiscovered(discoverHandlerAuthAndReadM1);

    
//认证并读取M1卡指定分区处理事件
var discoverHandlerAuthAndReadM1=function(res){
  if(res.techs.indexOf('MIFARE Classic') != -1){
    GetTagMemery_14443A_MifareClassic(M1Pwd1,M1Pwd2,M1ReadNum);
  }else{
    //芯片协议不匹配
  }
}

//读取14443A MifareClassic内存数据
function GetTagMemery_14443A_MifareClassic(pwd1,pwd2,index){
    //读取扇区...
    mifare = adapter.getMifareClassic();
    mifare.connect({
      success: function (ress) {
        console.log('MifareClassic已连接',ress);
        //认证
        var cmd = new Int8Array(12);
        //认证指令: 60(KEYA) + 扇区编号 + UID + 12位HEX密钥
        if(pwd1!=""){
          cmd[0] = parseInt("0x60");
        }else{
          cmd[0] = parseInt("0x61");
        }
        
        cmd[1] = parseInt(parseInt(index)*4, 10);
        for (var j = 0; j < uid_arr.length; j++) {
          cmd[j + 2] = uid_arr[j];
        }
  
         if(pwd1!=""){
          cmd[6] = chipTool.hex2int(pwd1.substring(0, 2));
          cmd[7] = chipTool.hex2int(pwd1.substring(2, 4));
          cmd[8] = chipTool.hex2int(pwd1.substring(4, 6));
          cmd[9] = chipTool.hex2int(pwd1.substring(6, 8));
          cmd[10] = chipTool.hex2int(pwd1.substring(8, 10));
          cmd[11] = chipTool.hex2int(pwd1.substring(10, 12));
        }else{
          cmd[6] = chipTool.hex2int(pwd2.substring(0, 2));
          cmd[7] = chipTool.hex2int(pwd2.substring(2, 4));
          cmd[8] = chipTool.hex2int(pwd2.substring(4, 6));
          cmd[9] = chipTool.hex2int(pwd2.substring(6, 8));
          cmd[10] = chipTool.hex2int(pwd2.substring(8, 10));
          cmd[11] = chipTool.hex2int(pwd2.substring(10, 12));
        }
        var cmdBuffer = cmd.buffer;
        //console.log("认证指令为:", cmdBuffer);
        //console.log('使用密钥:'+pwd);
        mifare.transceive({//发送密钥
          data: cmdBuffer,
          success: function (res) {
            console.log('认证成功, 接收数据如下:', res);
            
          },
          fail: function (err) {
            //密钥认证失败
            mifare.close();
            adapter.offDiscovered(discoverHandlerAuthAndReadM1);
            adapter.stopDiscovery();
            console.log('认证失败', err);
          }
        });
        
      },
      fail: function (err) {
        //mifare连接失败
        mifare.close();
        adapter.offDiscovered(discoverHandlerAuthAndReadM1);
        adapter.stopDiscovery();
        //console.log('mifare连接失败');
      },
      complate: function (cp) {
       
      }
    })
    
    mifare.isConnected({
      success: function (isConnected) {//连接成功
        //读取该分区数据
        var areaNum=index;
        var max=parseInt(areaNum)*4+3;
        for (let i = 0; i < 4; i++) {
          if(pwd1!=""){
            getMifareClassicBlockData(parseInt(areaNum)*4+i,max,pwd1);
          }else{
            getMifareClassicBlockData(parseInt(areaNum)*4+i,max,pwd2);
          }
        }
      }
    });
  }

//获取MifareClassic指定区块
function getMifareClassicBlockData(blockNum,maxBlock,pwd){
    var cmd = new Int8Array(2);
    cmd[0] = parseInt("0x30");
    cmd[1] = parseInt(blockNum, 10);
    var cmdBuffer = cmd.buffer;
    let block_info_tmp = '';
    //console.log("读取指令为:", cmdBuffer);
    mifare.transceive({
      data: cmdBuffer,
      success: function (res) {
        //console.log('读取数据:', res);
        var block_tmp = new Uint8Array(res.data);
        for (var j = 0; j < block_tmp.length; j++) {
          var tmp = block_tmp[j].toString(16);
          if (tmp.length < 2) {
            tmp = '0' + tmp;
          }
          if(j==block_tmp.length-1){
            block_info_tmp += tmp;
          }else{
            block_info_tmp += tmp + ":";
          }
        }
        console.log('第'+blockNum+'块读取数据返回HEX',block_info_tmp);
      },
      fail: function (err) {
        console.log('读取区块'+blockNum+'失败', err);
      },
      complete:function(){
        if(blockNum==maxBlock){
          //console.log('M1分区读取结果:',blockInfosM1);
          mifare.close();
          adapter.offDiscovered(discoverHandlerAuthAndReadM1);
          adapter.stopDiscovery();
          console.log('关闭mifare连接');
        }
      }
    })
  }

到了这里,关于微信小程序读取NFC-MifareClassic1K卡-M1卡详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序 NFC 功能

    一、在微信小程序中,使用nfcIsoDep.transceive发送指令的基本步骤如下: 使用wx.getNFCAdapter获取NFC适配器实例。 调用NFCAdapter.startDiscovery开始监听贴卡。 注册贴卡监听回调,调用NFCAdapter.onDiscovered。 在回调函数中,根据返回的res.techs字段匹配到卡片支持的NFC标准。 使用NFCAdapter

    2024年04月28日
    浏览(157)
  • 微信小程序nfc指令异常记录

    小程序nfc相关代码:  connect 成功但是指令报错,报错信息: transceive:fail:system internal error:tag was lost 解决方式,替换NfcA

    2024年02月12日
    浏览(63)
  • 微信小程序-读取数据

    在开发微信小程序的时候,我们经常都会用到一些配置数据,或者当做“单向数据库(只读)”使用。 我们新建一个新的项目工程,JS版本就可以。 免于麻烦,我们新建一个page(showdata)来显示数据。 为了方便管理,我们在项目工程新建一个目录(data),用于存数据。另外

    2024年02月15日
    浏览(43)
  • 微信小程序读取本地json

    首先在项目录下新建【server】文件夹,新建data.js文件,并定义好json数据格式。如下: pages/index/index.ts导入data.js并请求json pages/index/index.wxml页面展示数据  

    2024年02月14日
    浏览(43)
  • 微信小程序怎么读取居民身份证?

    微信小程序怎么读取身份证?         熟悉开发工具:首先,你需要了解微信小程序开发工具有哪些相关的知识。微信小程序开发工具提供了图形化开发环境,使得开发者能够更容易地进行小程序的开发工作。这是基础的一步。编写小程序代码:微信小程序采用类似HTML、C

    2024年01月19日
    浏览(41)
  • 微信小程序如何读取本地云存储txt数据,避免乱码

    找到你的txt文件,重命名为json文件 上传到云存储中,获取File ID 编写js代码 相关技术文档: https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readFile.html

    2024年02月12日
    浏览(52)
  • uniapp读取(获取)缓存中的对象值(微信小程序)

    大家好!我是夏小花,今天是 2024年4月24日|农历三月十六 ,在我们日常开发中,做小程序可能会往缓存中存值或者是存对象,今天这篇博客文章主要是讲如何在微信小程序如何读取缓存中的值和如何向缓存中存值。 满满干货哦!!! 下面这段代码是基于uniapp进行向缓中存值

    2024年04月25日
    浏览(58)
  • 微信小程序文件相关操作(新建文件夹、下载、解压、读取等)

    wx.downloadFile()  //下载 wx.getFileSystemManager()  //获取小程序的文件管理器 FileSystemManager.unzip() //解压 FileSystemManager.readdir()  //读取文件夹 FileSystemManager.readFile()  //读取文件 FileSystemManager.access() //判断文件/目录是否存在 FileSystemManager.mkdir()  //创建文件夹 index.js 在 onload 中获取 F

    2024年02月15日
    浏览(50)
  • 微信小程序 事件传参,参数同步显示 button提交内容,读取input内容

    我们先来回顾一下之前学的内容 我们可以在button组件中加入bindtap参数进行事件绑定 然后我们也能在input组件中加入bindinput参数进行事件绑定  结合以上内容我们接着学习,这么让事件绑定前端数据与后端同步 其实很简单,先来学习 先来一个基础的代码 我们给button一个事件

    2024年02月09日
    浏览(98)
  • Android NFC 读取卡片信息

    因为朋友需要个读取NFC卡片数据的功能,所以最近看了一下Android 系统下NFC 读取卡片信息的操作. NFC(近距离无线通信 ) 是一组近距离无线技术,通常只有在距离不超过 4 厘米时才能启动连接.借助 NFC,您可以在 NFC 标签与 Android 设备之间或者两台 Android 设备之间共享小型负载。

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包