当前位置: 首页 > news >正文

微信小程序NFC卡读写,MifareClassic1K卡,M1卡片读写教程

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

如果需要DEMO可直达下载链接:https://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); }, }); }, }); }
http://www.cnnetsun.cn/news/4123869.html

相关文章:

  • 软件测试面试Python核心考点:数据处理、OOP、异常处理与测试库实战
  • 战双帕弥什每日任务自动化神器MAA_Punish:一步到位,告别重复日常
  • AI视频平台权限配置常见问题和排查清单
  • AI视频平台权限配置参数配置说明与排查指南
  • 终极Prettymaps样式系统指南:打造精美地图的完整教程
  • 3分钟快速打造专属二次元表情包,Sekai Stickers免费开源工具让你告别表情荒
  • 猫抓插件完整指南:三步下载任意网页视频,M3U8流媒体合并也不难
  • Python 控制流语句:掌控程序执行的魔杖
  • 自主认知的必要条件:方法论自指与本体自指实在论的边界区分
  • VimBox入门必学:12个Mac快捷键,让Sublime用户无缝迁移到MacVim
  • pytorch-pwc 快速上手:5 分钟跑通第一对图像的光流估计教程
  • org-roam-server 三重视界完全指南:数据库网络、缓冲区网络与文件浏览器
  • Programming for Kids:教孩子Python的完整教程,从变量循环到Flask网站开发
  • LeaderWorkerSet 生态全景:vLLM、SGLang、TensorRT-LLM 与 NVIDIA NIM 集成实战
  • 2026小程序制作平台有哪些?主流实用搭建平台全面整理!
  • Tauri Tutorial Markdown 编辑器开发:Monaco Editor + markdown-it 打造 MdHub
  • MediaBrowser 常见问题避坑指南:开发者最常踩的 8 个坑及解决方案
  • storageless完整API速查:Configuration与SessionInterface核心方法详解
  • 雨雾、夜间复杂工况下机旅客实时三维定位与轨迹生成,筑牢机场边检管控第一环
  • JDK-21虚拟线程使用
  • Cortex-M3-STM32F1 开发:(四十六)ADC 实例 4 :单通道 ADC 过采样实例,使用 DMA,两种编程方式
  • 收藏夹里500个“稍后再看“吃灰?这款免费AI视频总结工具帮你3分钟榨干B站课程
  • gruf 健康检查集成:接入官方 gRPC 健康检查协议,让 Ruby 微服务秒过探针
  • S-mall-ssm 订单状态机设计:5种状态如何驱动电商订单的完整生命周期?
  • 你的macOS菜单栏为什么总是乱成一团?这个叫Ice的菜单栏管理工具给出了答案
  • 老Mac免费吃上macOS Sequoia:OpenCore Legacy Patcher从零到上手完整指南
  • 磁盘空间告急怎么办?免费开源Czkawka的14个清理工具,帮你找出重复文件、相似图片和空文件夹
  • 深入源码:THCalendarDatePicker 日历网格布局算法是如何工作的?
  • 老款Mac焕新三步走:用OpenCore Legacy Patcher免费升级最新macOS完整指南
  • DesktopAssistant打包发布实战:生成Windows安装程序与deb包的完整步骤