Android读写NFC

NFC卡种类很多,NFC读写芯片PN547可以支持格式

Android SDK API已经有封装好的接口

http://www.android-doc.com/reference/android/nfc/tech/package-summary.html

14443和15693区别在于传输范围,15693传输距离更远。


14443A标签卡

MifareClass:

标准卡

MifareUltralight:

这类卡相对较小,不加密,成本也低,只有几百字节大小。

15693标签卡

NfcV

8字节UID,最后一字节固定为0xE0,需要发送写的命令串才能读。

命令列表,命令格式:标识 + 命令 + 参数 + 数据 + 校验

示例代码以cmd:0x20为例



开始写程序:

加入NFC权限:

<uses-permission android:name="android.permission.NFC" />

支持NFC类型:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.MifareClassic</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
</resources> />

应用消息过滤器:

<intent-filter >
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

当NFC靠近时,系统组件检测到NFC发送Intent,这时候应用接收到消息后启动。


Java代码:

MifareClassic读代码

分为几个扇区,每个扇区有几个block

		Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
		MifareClassic mifare = MifareClassic.get(tagFromIntent);
		mifare.connect();
		int type = mifare.getType();
		Count = mifare.getBlockCountInSector(0);
		bIndex = mifare.sectorToBlock(0);
		byte[] data = mifare.readBlock(bIndex);//可以读bCount次
		bIndex++;

MifareUltralight代码

分为几个page,每个page大小是4字节。

readPage接口一次读4个页,也就是16字节。

		Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
		MifareUltralight mifare =  MifareUltralight.get(tagFromIntent);		
		mifare.connect();			
		byte data [] = mifare.readPages(16 * i);//偏移

NfcV(15693)代码

发送读命令,等待接收返回,命令格式 flag + cmd + para + crc,crc自动计算,我们不用理会。ID号要作为数据传入。

示例读取第1块区域数据

                Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);		
		NfcV nv = NfcV.get(tagFromIntent);		
		nv.connect();
                byte[] ID = nv.getTag().getId();			
                byte[] cmd = new byte[11];
                cmd[1] = (byte) 0x20; // command
                for (int i = 0; i < ID.length; i++) {
                     cmd[i + 2] = ID[i];
                }
                cmd[10] = 1;//第一块区域数据
                byte[] data = nv.transceive(cmd);





  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值