package com.example.mynfcdemon;

import android.app.Activity;
import android.nfc.NfcAdapter;
import android.os.Bundle;

public class MainActivity extends Activity {

//private NfcAdapter nfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//nfcAdapter = NfcAdapter.getDefaultAdapter(this);
//运行APK 把标签靠近识别区即可。
}

}

-------------------------------

package com.example.mynfcdemon;

import java.io.IOException;

import android.nfc.tech.NfcV;

public class NfcVUtil {
private NfcV mNfcV;
//UID数组行式
private byte[] ID;
private String UID;
private String DSFID;
private String AFI;
//block的个数
private int blockNumber;
//一个block长度
private int oneBlockSize;
//信息
private byte[] infoRmation;

/*@function :初始化
@param :mNfcV NfcV对象
@return :返回内容byte[]
@author: :Demon 503536038@qq.com
*/

public NfcVUtil(NfcV mNfcV) throws IOException{
this.mNfcV = mNfcV;
ID = this.mNfcV.getTag().getId();
byte[] uid = new byte[ID.length];
int j = 0;
for(int i = ID.length - 1; i>=0; i-- ){
uid[j] = ID[i];
j++;
}
this.UID = printHexString(uid);

getInfoRmation();

System.out.println("UID:" + getUID()
+"AFI:" + getAFI()
+"DSFID:" + getDSFID()
+"BlockNumber:" + getBlockNumber()
+"BlockSize:" + getOneBlockSize());
}

public String getUID() {
return UID;
}

/*@function :取得标签信息
@return :返回内容byte[]
@author: :Demon 503536038@qq.com
*/
private byte[] getInfoRmation() throws IOException{
byte[] cmd = new byte[10];
cmd[0] = (byte) 0x22; //flag
cmd[1] = (byte) 0x2B; //command
System.arraycopy(ID, 0, cmd, 2, ID.length); // UID
infoRmation = mNfcV.transceive(cmd);
blockNumber = infoRmation[12];
oneBlockSize = infoRmation[13];
AFI = printHexString(new byte[]{infoRmation[11]});
DSFID = printHexString(new byte[]{infoRmation[10]});
return infoRmation;
}

public String getDSFID() {
return DSFID;
}

public String getAFI() {
return AFI;
}
public int getBlockNumber(){
return blockNumber + 1;
}

public int getOneBlockSize() {
return oneBlockSize + 1;
}

/*@function :读取一个位置在position的block
@param :position 要读取的block位置
@return :返回内容字符串
@author: :Demon 503536038@qq.com
*/
public String readOneBlock(int position) throws IOException{
byte cmd[] = new byte[11];
cmd[0] = (byte) 0x22;
cmd[1] = (byte) 0x20;
System.arraycopy(ID, 0, cmd, 2, ID.length); //UID
cmd[10] = (byte) position;
byte res[] = mNfcV.transceive(cmd);

for(int i=0; i < res.length; i++){

System.out.println("/" + res[i]);
}
String r = new String(res);
System.out.println("/" + r);

if(res[0] == 0x00){
byte block[] = new byte[res.length - 1];
System.arraycopy(res, 1, block, 0, res.length - 1);

//return printHexString(block);

String blockstr = new String(block);
return blockstr;
}
return null;
}

/*@function :读取从begin开始end个block
@instructions :begin + count 不能超过blockNumber
@param :begin block开始位置
@param :count 读取block数量
@return :返回内容字符串
@author: :Demon 503536038@qq.com
*/
public String readBlocks(int begin, int count) throws IOException{
if((begin + count)>blockNumber){
count = blockNumber - begin;
}
StringBuffer data = new StringBuffer();

for(int i = begin; i<=count + begin; i++){
data.append(readOneBlock(i));
}
return data.toString();

}

/* 将byte[]转换成16进制字符串
@param data 要转换成字符串的字节数组
@return 16进制字符串
*/
private String printHexString(byte[] data) {
StringBuffer s = new StringBuffer();;
for (int i = 0; i < data.length; i++) {
String hex = Integer.toHexString(data[i] & 0xFF);

if (hex.length() == 1) {
hex = '0' + hex;
}
s.append(hex);
}
return s.toString();
}

/* 将数据写入到block,
@param position 要写内容的block位置
@param data 要写的内容,必须长度为blockOneSize
@return false为写入失败,true为写入成功
@throws IOException */
public boolean writeBlock(int position, byte[] data) throws IOException{
byte cmd[] = new byte[15];
cmd[0] = (byte) 0x22;
cmd[1] = (byte) 0x21;
System.arraycopy(ID, 0, cmd, 2, ID.length);// UID
//block
cmd[10] = (byte) position;
//value
System.arraycopy(data, 0, cmd, 11, data.length);
byte[]rsp = mNfcV.transceive(cmd);
if(rsp[0] == 0x00){
return true;
}

return false;
}

public boolean writeStrToTag(String str){

return false;

}

}

---------------------------------

package com.example.mynfcdemon;

import java.io.IOException;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.NfcV;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;

public class TagView extends Activity{

// NFC parts
private static NfcAdapter mAdapter;
private static PendingIntent mPendingIntent;
private static IntentFilter[] mFilters;
private static String[][] mTechLists;

private TextView texttagid;
private TextView texttagdata;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tag_vierwr);
texttagdata = (TextView) findViewById(R.id.tagdatatext);
texttagid = (TextView) findViewById(R.id.tagidtext);

mAdapter = NfcAdapter.getDefaultAdapter(this);
// Create a generic PendingIntent that will be deliver to this activity.
// The NFC stack
// will fill in the intent with the details of the discovered tag before
// delivering to
// this activity.
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// Setup an intent filter for all MIME based dispatches
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);

try {
ndef.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
mFilters = new IntentFilter[] { ndef, };

// Setup a tech list for all NfcV tags
mTechLists = new String[][] { new String[] { NfcV.class.getName() } };

try {
rfid_scanresult(getIntent());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

void rfid_scanresult(Intent intent) throws IOException{

String action = intent.getAction();
if(NfcAdapter.ACTION_NDEF_DISCOVERED == action
|| NfcAdapter.ACTION_TECH_DISCOVERED == action
|| NfcAdapter.ACTION_TAG_DISCOVERED == action){
//if(NfcAdapter.ACTION_TECH_DISCOVERED == action){
//byte[] tagid = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] tagid = tag.getId();
//String strid = new String(tagid);
//System.out.println("TAGID:"+strid);
//System.out.println("TAGID:"+bytesToHexString(tagid));
//texttagid.setText("TagID=" + bytesToHexString(tagid));

Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NfcV nfcv = NfcV.get(tagFromIntent);
nfcv.connect();
NfcVUtil mNfcVutil = new NfcVUtil(nfcv);

texttagid.setText("UID:" + mNfcVutil.getUID()+'\n'
+"AFI:" + mNfcVutil.getAFI()+'\n'
+"DSFID:" + mNfcVutil.getDSFID()+'\n'
+"BlockNumber:" + mNfcVutil.getBlockNumber()+'\n'
+"BlockSize:" + mNfcVutil.getOneBlockSize());
//NfcVClassCard mifareClassCard=null;
texttagdata.setText("block0:"+mNfcVutil.readOneBlock(0)
+"block1:"+mNfcVutil.readOneBlock(1)+'\n'
+"block2:"+mNfcVutil.readOneBlock(2)
+"block3:"+mNfcVutil.readOneBlock(3)+'\n'
+"block4:"+mNfcVutil.readOneBlock(4)
+"block5:"+mNfcVutil.readOneBlock(5)+'\n'
+"block6:"+mNfcVutil.readOneBlock(6)
+"block7:"+mNfcVutil.readOneBlock(7)+'\n'
+"block8:"+mNfcVutil.readOneBlock(8)
+"block9:"+mNfcVutil.readOneBlock(9)+'\n'
+"block10:"+mNfcVutil.readOneBlock(10)
+"block11:"+mNfcVutil.readOneBlock(11)+'\n'
+"block12:"+mNfcVutil.readOneBlock(12)
+"block13:"+mNfcVutil.readOneBlock(13)+'\n'
+"block14:"+mNfcVutil.readOneBlock(14)
+"block15:"+mNfcVutil.readOneBlock(15)+'\n'
+"block16:"+mNfcVutil.readOneBlock(16)
+"block17:"+mNfcVutil.readOneBlock(17)+'\n'
+"block18:"+mNfcVutil.readOneBlock(18)
+"block19:"+mNfcVutil.readOneBlock(19)+'\n'
+"block20:"+mNfcVutil.readOneBlock(20)
+"block21:"+mNfcVutil.readOneBlock(21)+'\n'
+"block22:"+mNfcVutil.readOneBlock(22)
+"block23:"+mNfcVutil.readOneBlock(23)+'\n'
+"block24:"+mNfcVutil.readOneBlock(24)
+"block25:"+mNfcVutil.readOneBlock(25)+'\n'
+"block26:"+mNfcVutil.readOneBlock(26)
+"block27:"+mNfcVutil.readOneBlock(27)+'\n'
+"Read:"+ mNfcVutil.readBlocks(0, 28)
);
/*String str;
str = getNdefMessages(intent).toString();

System.out.println("Ndef::"+str);*/
String s = "kaic";
mNfcVutil.writeBlock(0, s.getBytes());

}

}

NdefMessage[] getNdefMessages(Intent intent) {
// Parse the intent
NdefMessage[] msgs = null;
String action = intent.getAction();
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
Parcelable[] rawMsgs =intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
}
else {
// Unknown tag type
byte[] empty = new byte[] {};
NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty,empty);
NdefMessage msg = new NdefMessage(new NdefRecord[] {record});
msgs = new NdefMessage[] {msg};
}
}
else {
// Log.e(TAG, "Unknown intent " + intent);
finish();
}
return msgs;
}

void write_NdefFormatableTag(){
/*NdefFormatable tag = NdefFormatable.get(t);
Locale locale = Locale.US;
final byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII);
String text = "Tag, you're it!";
final byte[] textBytes = text.getBytes(Charsets.UTF_8);
final int utfBit = 0;
final char status = (char) (utfBit + langBytes.length);
final byte[] data = Bytes.concat(new byte[] {(byte) status}, langBytes, textBytes);
NdefRecord record = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, newbyte[0], data);
try {
NdefRecord[] records = {text};
NdefMessage message = new NdefMessage(records);
tag.connect();
tag.format(message);
}
catch (Exception e){
//do error handling
}*/

}

public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}

}

最新文章

  1. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》
  2. 支撑Java NIO 与 NodeJS的底层技术
  3. windows 2003自动登录的具体步骤
  4. powerdesigner12.5入门教程
  5. 一模 (5) day1
  6. Ambiguous mapping found. Cannot map &#39;xxxxController&#39; bean method
  7. nodejs保存文件的问题
  8. Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布
  9. 10个devexpress ASPxPivotGrid常见问题
  10. LogFactory缺包异常
  11. 不能ssh连接ubuntu linux 服务器 secureCRT不能ssh连接服务器 不能远程ssh连接虚拟机的ubuntu linux
  12. Redis压缩列表
  13. java发送163邮件
  14. BZOJ3223文艺平衡树——非旋转treap
  15. Jmeter中常用的一些对字符串的处理
  16. 前端工程化系列[06]-Yeoman脚手架核心机制
  17. 【机器学习_5】Anaconda:初学Python、入门机器学习的首选
  18. Ansible拷贝文件遇到的问题
  19. bs4 CSS选择器
  20. java 两个日期之间的天数

热门文章

  1. socket学习笔记——实现收发文件(Windows)
  2. django中时区设置
  3. pb中读取大文本数据
  4. Vmware ESX5i 环境下部署Windows Storage Server 2008 R2
  5. 【EF 4】ORM框架及其流行产品之一EF介绍
  6. 如何判断raid1中哪块硬盘损坏?
  7. 设计模式-外观模式(Facade)
  8. Eclipse 中打不开android sdk managerf
  9. POJ C程序设计进阶 编程题#1:计算矩阵边缘之和
  10. 最近的学习的linux命令笔记