android通过NFC开启/关闭NTAG213的密码保护功能
穷遍全网没有资料,最后找到了官方的寄存器文档和StackOverflow上找到了解决方案
首先要用 MifareUltralight 来进行操作,在onNewIntent处先校验返回的tag是否包含了MifareUltralight 这个功能
开启和关闭密码保护功能,是在NFC tools pro这个软件上看到的,但是包括nxp官方的androidnfclib里都没有提及怎么使用
首先通过
val mfc = MifareUltralight.get(tag);
获取MifareUltralight操作对象
接下来说一下开启密码保护的流程,首先要认证PWD_AUTH,这个步骤是校验密码,一般来说默认密码是4字节的0XFF,接下来如果正确会返回PACK,这个PACK的作用相当于另外一个校验,认证PWD_AUTH
之后会把芯片中的PACK返回来用于确认,PACK相当于开发和NFC卡两者知道的一个校验,官方文档如下解释
这两步都通过后就可以改写PWD和PACK了
通过
mfc.transceive
命令去写存储器:
// set PACK:
mfc.transceive(
byteArrayOf(
0xA2.toByte(),
0x2C, /*PAGE 44*/
pack[0], pack[1], 0, 0 // Write PACK into first 2 Bytes and 0 in RFUI bytes
)
) // set PWD: 设置密码为用户设置的密码
mfc.transceive(
byteArrayOf(
0xA2.toByte(),
0x2B, /*PAGE 43*/
pwd[0],
pwd[1],
pwd[2],
pwd[3] // Write PACK into first 2 Bytes and 0 in RFUI bytes
)
)
然后设置 ,这个存储器起到错误密码验证尝试次数的限制,同时第42页的第一个字节的第7位PROT用于定义是只开启写保护还是读写保护都开启,这里我只是开启了写保护,密码尝试次数也是禁用了
// set AUTHLIM: 设置错误次数限制
val responseAuthLim = mfc.readPages(42)
if (responseAuthLim != null && responseAuthLim.size >= 16) {
val prot =
false // false = PWD_AUTH for write only, true = PWD_AUTH for read and write
val authLim = 0; //0-7 mfc.transceive(
byteArrayOf(
0xA2.toByte(),
42,
(responseAuthLim[0] and 0x078 or (if (prot) 0x080.toByte() else 0x000) or ((authLim and 0x007).toByte())).toByte()
,
responseAuthLim[1],
responseAuthLim[2],
responseAuthLim[3] //将1-3位按原数据写会
)
)
}
最后再设置AUTH0,这个AUTH0才是实际上控制是否启用密码保护功能的存储器,设置为FF(高与配置最后一页)就实际上是禁用了密码保护,建议根据实际需求开启页保护,我这里实际上只开启了00页
//设置Auth0 auth0实际控制是否启用密码保护
val responseAuth0 = mfc.readPages(41) if (responseAuth0 != null && responseAuth0.size >= 16) {
val prot =
false; // false = PWD_AUTH for write only, true = PWD_AUTH for read and write
val auth0 = 0; mfc.transceive(
byteArrayOf(
0xA2.toByte(),
41,
responseAuthLim[0],
responseAuthLim[1],
responseAuthLim[2], //将0-2位按原数据写会
(auth0 and 0x0ff).toByte()
)
)
}
顺序执行完成后即可以开启密码保护,无法写入,需要删除密码后才能写入
删除密码就是把PWD PACK,AUTHLIM置为默认值,把AUTH0置为0xFF
完整代码参考:https://github.com/yanjiepeng/TazanTagWritter/blob/master/README.md
android通过NFC开启/关闭NTAG213的密码保护功能的更多相关文章
- Android -- Service的开启关闭与生命周期
Service是Android 系统中的四大组件之一,是在一段不定的时间运行在后台,不和用户交互应用组件. service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity ...
- NFC(3)Android上的NFC,开启NFC,3种NDEF数据
Android对NFC技术的支持 Android2.3.1(API Level = 9)开始支持NFC技术,但Android2.x和Android3.x对NFC的支持非常有限.而从Android4.0 ...
- Android之NFC
来源:http://blog.csdn.net/bear_huangzhen/article/details/46333421 NFC简介: Near Field Communication 近场通信 ...
- Android下NFC的简单使用
现在很多手机已经配备了NFC(Near Field Communication 近场通信)的功能,我就为此专门研究过,可以到本文末尾下载源代码. Android官方资料:http://develope ...
- Linux系统默认服务建议开启关闭说明列表
服务名称 功能简介 建议 acpid 电源管理接口.如果是笔记本用户建议开启,可以监听内核层的相关电源事件. 开启 anacron 系统的定时任务程序.cron的一个子系统,如果定时任务错过了执行时间 ...
- NFC(7)向NFC硬件写入数据的两个示例(nfc硬件启动android应用,nfc硬件打开uri)
向NFC标签写入数据基本步骤 1,获取Tag对象 Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 2,判断NFC标签的数据类型(通 ...
- 关于android的nfc问题
最近在研究android的nfc问题 首先再网上有很多关于android nfc 读写的问题,但是大多数都是关于Mifare Classic类型卡的读写,我百试不得骑解,于是自己写了一些程序供大家参考 ...
- Android系统对话框——自定义关闭
Android系统对话框--自定义关闭 Dialog是我们在项目中经常用到的,5.x以后的Dialog也很好看,很安卓风,Android也给我们提供了新的包,低版本可以显示一样的效果.我们在使用的导入 ...
- Linux防火墙开启关闭查询
1.centos7防火墙 命令含义: –zone #作用域 –add-port=80/tcp #添加端口,格式为:端口/通讯协议 –permanent #永久生效,没有此参数重启后失效 服务与端口的启 ...
随机推荐
- Sqlite教程(2) Data Access Object
因为这个项目的业务层很薄,因此想在架构上尽量保持着「轻」,不会把创建DbHelper的interface. 而是直接用DAO创建DbHelper对象. DAO和DbHelper也是同样使用懒汉模式. ...
- token和refresh token
https://www.cnblogs.com/minirice/p/9232355.html 在spring boot中结合OAuth2使用JWT时,刷新token时refresh token一直变 ...
- K - Wand(组合数+错排公式)
N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, ...
- LeetCode No.109,110,111
No.109 SortedListToBST 有序链表转换二叉搜索树 题目 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的 ...
- Windows下 webstorm安装tomcat配置svn并使用
先附上所需要的软件的下载地址:https://pan.baidu.com/s/1c2ripd2 1.下载并安装jdk以及配置jdk的环境变量 1)下载jdk,选择安装目录安装,我选择的是默认路径,安装 ...
- leetcode 1.回文数-(easy)
2019.7.11leetcode刷题 难度 easy 题目名称 回文数 题目摘要 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 思路 一些一定不为回文数的 ...
- linux在线书籍
<Linux就该这么学-刘遄>https://www.linuxprobe.com/
- open()操作文件
open()函数用来读取.写文件 参数解释: r:只读 w:只写,此时进行读,会报错 a:只追加 r+:可读可写 w+:可读可写 a+:可读可写 rb\rb+\wb\wb+\ab\ab+ 针对二进制文 ...
- keepalive笔记之二:keepalive+nginx(自定义脚本实现,上述例子也可以实现)
keepalive的配置文件 ! Configuration File for keepalived global_defs { notification_email { acassen@firewa ...
- 关于HTTP请求GET和POST的区别
1.GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.actio ...