【全网首发】微信小程序NFC读写,MifareClassic1K卡,M1卡片读写

最近来了个离谱的需求,要用微信小程序读写NFC卡数据,微信官方文档可以说是垃圾的一批了,啥都没有,踩了好几天坑把整体思路记录一下。

如果需要DEMO可直达下载链接:icon-default.png?t=N7T8https://download.csdn.net/download/weixin_65984842/87703559

首先调用微信自带的方法


 const adapter = wx.getNFCAdapter(); //调用wx.getNFCAdapter()获取NFC适配器实例

然后在onload中利用onDiscovered监听卡片,正常都会返回一个data,里面有ID还有techs,如果是NDEF卡还会返回一个messages,直接操作messages就可以了比较简单,M1是加密卡需要调用getMifareClassic方法


adapter.onDiscovered(res => {
        console.log("读取到卡片了", res);
        let tagId = res.id; //如果是M1卡,这个ID是需要用于读取的秘钥
        let ssid = _this.buf2hex(tagId) //转换数据格式
        console.log("获取到tagID:", ssid);
        this.setData({ssid});
        this.isCardTypeRead(res,adapter);            
      })

M1卡的读取方法,这里比较费劲,需要知道你卡片的厂商给的秘钥信息,如果你会暴力破解就当我没说


let adapter = that.data.Nfcadapter;
if (adapter.tech.mifareClassic) {
      console.log("发现" + adapter.tech.mifareClassic + "卡");
      let mifareClassic = adapter.getMifareClassic();
      mifareClassic.connect({
        success: (res) => {
          const {ssid,cardPwda } = _this.data
          console.log("设备已连接", res); 
          console.log("开始拼接验密指令。。。");
          let arr = [0x60, 0x00] //查询扇,后边需要拼接上秘钥,
          let newCardPsd = new Uint8Array(cardPsd) //转换命令格式
          let newArr = [...arr,...newCardPsd] //把查询扇区的初始跟查询ID拼接到一起
          console.log('read',newArr)
          
        
          //     0x60, //指令类型
          //     0x00, //扇区读取位置 00就是读取所有,09就是第二扇区第二块
          //     0x11, 0x22, 0x33,  0x44, //秘钥A
          //     0xff, 0xff, 0xff, 0xff, 0xff,0xff //秘钥B,根据卡片厂商给的信息写通常都是固定的或者跟A一样 
        
          var arrayBuffer = new Uint8Array(arr).buffer;
          console.log("解密指令为:", arrayBuffer);
          console.log("解密指令为:", arr);
          mifareClassic.transceive({
            data: arrayBuffer,
            success: function (res) {
              console.log("connect发送数据并解密成功, 接收数据如下:", res);
              console.log('connect发送数据并解密成功, 接收数据如下:', that.buf2hex(res.data));
            },

            fail: function (err) {
              console.log("connect发送数据失败A", err);
            },
          });
        },
      });
      // 向标签发送读取指定块数据的命令,以验证标签是否已经连接成功。
      mifareClassic.isConnected({
        success: function (isConnected) {
          console.log("isConnected成功连接", isConnected);
          var arr02 = [0x30, 0x00]; //第二位0x00以为读取从0开始的所有扇区
          var arrayBuffer02 = new Uint8Array(arr02).buffer;
          console.log(arrayBuffer02);
          mifareClassic.transceive({
            data: arrayBuffer02,
            success: function (res) {
              console.log("读取数据:", res);
              let hexArr = Array.prototype.map.call(
                new Uint8Array(res.id),
                function (bit) {
                  return ("00" + bit.toString(16)).slice(-2);
                }
              );
        
              let strCode= hexArr.join("");
            
              console.log('isConnected转换后的',strCode);
              that.setData({
                nfcMsg: str,
              });
              mifareClassic.close({
                success: (res) => {
                  console.log("清除标签连接成功");
                },

                fail: (error) => {
                  console.error("清除标签连接失败");
                },

                complete: (res) => {
                  console.log(res);
                },
              });
            },

            fail: function (err) {
              console.log("失败", err);
            },
          });
        },
      });
    }
微信小程序支持NFC(Near Field Communication)的读写功能,可以通过对NFC标签的读取和写入实现与设备的交互。在微信小程序中,可以通过wx.startHCE()方法启动HCE服务,使手机模拟一个NFC。可以通过wx.onHCEMessage()方法监听HCE服务接收到的消息,并通过wx.sendHCEMessage()方法发送消息。这样,可以实现小程序与其他NFC设备之间的通信。 要使用NFC读写功能,首先需要在小程序的app.json文件中声明NFC权限。例如,在"permission"字段中添加"nfc"权限。然后,在小程序的页面中,使用wx.startHCE()方法来启动HCE服务。在启动HCE服务之后,可以监听HCE服务接收到的消息,并处理这些消息。可以使用wx.onHCEMessage()方法来监听HCE服务接收到的消息,并在回调函数中处理这些消息。同时,可以使用wx.sendHCEMessage()方法来向HCE服务发送消息。 需要注意的是,NFC读写功能在不同的手机上的支持程度可能会有所差异。在使用NFC读写功能时,建议进行兼容性测试,并提供适当的错误处理机制,以确保用户的良好体验。 总结起来,要在微信小程序中实现NFC读写功能,需要进行以下步骤: 1. 在app.json文件中声明NFC权限。 2. 使用wx.startHCE()方法启动HCE服务。 3. 使用wx.onHCEMessage()方法监听HCE服务接收到的消息,并进行处理。 4. 使用wx.sendHCEMessage()方法向HCE服务发送消息。 希望以上信息对您有所帮助!
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知名BUG制造者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值