使用android (android studio)和苹果ios手机读写NFC卡内容(MifareUltralight)方法 亲身完美体验过程

news/2024/11/23 9:58:05/

最近工作需要购买了一些nfc卡进行读写操作,目标是使用手机实现一些业务流程

淘宝购买1-2块钱一张卡,卖家提供的信息:卡的芯片是215

网上找的内容都是一段一段的,我现在把用到的资料都整合起来,以便看一篇就可以知道怎么操作。

安卓支持NFC手机,都比较容易的使用,比较舒服

苹果手机有点特别,限制比较多,没有安卓那么开放,NFC卡使用说明如下:

苹果手机读取,需要iphone7+  ios12以上,才有nfc功能,读取时不能直接读取卡序列号,需要用安卓手机安装NFC TagWriter by NXP_v4.8.2_apkpure.com.apk (Google play可以下载)进行写卡后,苹果才可以读取写入的内容

 

一、该卡属于MifareUltralight格式规范,规范如下:

https://blog.csdn.net/wxh0000mm/article/details/79708807?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

这里有两个地方特别独家补充一下的,网上的网文都没有说明清楚,看得到有点晕

1、是卡的序列号使用16进制读取

2、page2中lock使用二进制来标记(再转16进制)设置

 

存储结构:

页号

Byte0

Byte1

Byte2

Byte3

说明

0

SN0

SN1

SN2

BCC0

只读,存放卡的序列号:Page0前3字节+整个Page1

这里是16进制读取(注意读取方式,其它网文都没有标明)

1

SN3

SN4

SN5

SN6

2

BCC1

保留

LOCK0

LOCK1

只读,通过设置LOCK0和LOCK1可以讲16个page设为只读

二进制方式设置(注意读取方式,其它网文都没有标明)

3

OTP0

OTP1

OTP2

OTP3

可读写,一次性交易计数器,不可逆

4

Data0

Data1

Data2

Data3

可读写,数据存放区域

5

Data0

Data1

Data2

Data3

6

Data0

Data1

Data2

Data3

7

Data0

Data1

Data2

Data3

8

Data0

Data1

Data2

Data3

9

Data0

Data1

Data2

Data3

10

Data0

Data1

Data2

Data3

11

Data0

Data1

Data2

Data3

12

Data0

Data1

Data2

Data3

13

Data0

Data1

Data2

Data3

14

Data0

Data1

Data2

Data3

15

Data0

Data1

Data2

Data3

 

 Page2的第3和第4个字节用于将存储区锁定为只读,如下图示,L4-L15的某一位设置为1,则对应序号的Page内容锁定为只读,每一个Page都可以单独设置。Lotp用于锁定Page3为只读。Lotp-L15可以锁定别人,这些位本身又被三个BL位锁定,BL15-10用于锁定L15-L10,BL9-4用于锁定L9-L4,BLotp用于锁定Lotp。所有的这16个锁定位也具有OTP特性,通俗的讲就是这些“锁”没有“钥匙”,一旦锁死就改不回来,所以锁定时一定要小心。

 

如lock1对应8位二进制11110000,1代表锁定只读,然后把二进制转换成16进制写入卡

二进制方式设置(注意读取方式,其它网文都没有标明)

二、读写方法网上有比较多,写法如下:

https://www.cnblogs.com/sjjg/p/4783743.html

亲测有效,我的测试源代码下载地址:https://download.csdn.net/download/qq_16005627/12366636

通过以上读写方法扩展

1、 读取卡序列号方法

public String readTagc(Tag tag) throws Exception {//读数据 第1步,从nfc标签中得到MifareUltralightMifareUltralight ultralight = MifareUltralight.get(tag);try {//读数据 第2步,接连ultralight.connect();//读数据 第3步,从ultralight数据中的下标为4的位开始读数据.byte[] data = ultralight.readPages(0);byte[] serialNumber = new byte[7];serialNumber[0] = data[0];serialNumber[1] = data[1];serialNumber[2] = data[2];serialNumber[3] = data[4];serialNumber[4] = data[5];serialNumber[5] = data[6];serialNumber[6] = data[7];String CardCode = bytes2HexString(serialNumber);       return CardCode ;} catch (Exception e) {e.printStackTrace();} finally {try {ultralight.close();} catch (Exception e) {e.printStackTrace();throw e;}}return null;
}

 

//16进制转字符串

private static String bytes2HexString(final byte[] bytes) {if (bytes == null) return "";int len = bytes.length;if (len <= 0) return "";char[] ret = new char[len << 1];for (int i = 0, j = 0; i < len; i++) {ret[j++] = HEX_DIGITS[bytes[i] >> 4 & 0x0f];ret[j++] = HEX_DIGITS[bytes[i] & 0x0f];}return new String(ret);
}private static final char[] HEX_DIGITS ={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

 

二、设置page2中lock

ultralight.writePage(2, hexString2Bytes("DF48f000"));//第2页 LOCK设置     11110000二进制转16进制

//16进制转字节

public static byte[] hexString2Bytes(String src) int l = src.length() / 2;byte[] ret = new byte[l];for (int i = 0; i < l; i++) {ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();}return ret;
}

觉得好的同学,记得点个赞!

 


http://www.ppmy.cn/news/653672.html

相关文章

stm32 arduino 读取sd卡并在lcd(jlx12864)上播放badapple

目录 前言引脚连接代码示例 问题排查1. sd卡无法读取2. lcd无显示 前言 要问什么是测试单片机控制单色屏幕的最佳办法&#xff0c;我想badapple应该当之无愧&#xff0c;经典程度如helloworld。 这次&#xff0c;我用stm32f103c8t6arduino框架读取sd卡&#xff0c;并控制jlx12…

苹果7pnfc功能门禁卡_苹果下个月终于要开放NFC权限了!iphone一秒变身门禁卡

原标题:苹果下个月终于要开放NFC权限了!iphone一秒变身门禁卡 当我们开始习惯用iPhone的NFC功能进行移动支付,苹果公司要进一步开放NFC芯片功能,它将能用来充当钥匙,可以打开房门车门。 iPhone 6 之后的机型都配备了 NFC 芯片,这和蓝牙一样都是短距离通讯技术,可以在设备…

html 仿浏览器选项卡,【美化TabControl教程】仿苹果Safari浏览器选项卡

【实例简介】 【美化TabControl教程】仿苹果Safari浏览器选项卡 【实例截图】 一步一步玩控件:自定义TabControl——从山寨Apple Safari开始 教程: 分析,分析 山寨的灵魂在于分析,首先把刚才拍的高清果照扯过来分解了。 1337277056_9776.jpg (65.87 KB, 下载次数: 30) 【美…

switch错误码2016-0247 无法识别SD卡解决方案(猴子也能看懂的简单命令行操作,无需格式化!)

Swtich更换microSD卡有时会遇到无法识别的问题&#xff0c;一个例子是错误代码2016-0247。 该错误码的产生原因是SD卡放入switch前使用了MacOS等非Windows系统操作&#xff0c;导致文件归档方式出现差别。 此时无需格式化SD卡&#xff0c;因为本质不是文件系统格式的问题。 &am…

苹果电脑更改sd卡只读_sd卡反复变成只读解决办法

首先推荐两个网页&#xff1a; 我们的相同之处就是用的fat文件系统&#xff0c;我的应用和第二个同志的一样&#xff0c;解决办法:移植一个修复工具dosfsck,其详细用法请参看&#xff1a;http://linux.about.com/library/cmd/blcmdl8_dosfsck.htm FAT (dosfsck) 依次序检查以下…

mac os android sd卡,关于 Mac 上的 SD 和 SDXC 卡插槽

什么是 SD? SD 是指那些符合非易失性存储卡 SD 标准的设备。请访问 SD 协会网站,以了解详细信息。 SD 卡插槽对可插入的存储卡的大小有没有限制? 有。存储卡的 SD 卡规格为 32 毫米 x 24 毫米 x 2.1 毫米。您还可以使用更薄的卡,例如多媒体卡(MultiMediaCard,MMC)。请勿使…

苹果手机读取html文件,教你如何解决“iTunes不能读取iPhone内容”的问题

问 当我试图将我的iPhone连上iTunes的时候&#xff0c;我遇到了一个错误提示信息&#xff0c;它显示“iTunes不能读取iPhone的内容&#xff0c;请前往iPhone“偏好设置”的“摘要”选项卡&#xff0c;然后点击“恢复”以将此iPhone恢复为出厂设置”。除了一个“确定”按钮&…

android6 存储卡异常,手机SD卡无法读取时,如何在手机上修复损坏的SD卡?

吴川 华南区技术负责人 概要 手机发生SD卡无法读取的情况时,无法读取的问题是由什么原因而引起的呢?我们又应该如何修复手机受损的SD卡呢? 手机SD卡无法读取的常见原因及解决方法 SD卡接触不良 有时,SD卡无法读取识别,可能是由于SD卡接触不良所导致的。当SD卡的触点或卡槽…