• NFC应用实例


    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()+' '
    +"AFI:" + mNfcVutil.getAFI()+' '
    +"DSFID:" + mNfcVutil.getDSFID()+' '
    +"BlockNumber:" + mNfcVutil.getBlockNumber()+' '
    +"BlockSize:" + mNfcVutil.getOneBlockSize());
    //NfcVClassCard mifareClassCard=null;
    texttagdata.setText("block0:"+mNfcVutil.readOneBlock(0)
    +"block1:"+mNfcVutil.readOneBlock(1)+' '
    +"block2:"+mNfcVutil.readOneBlock(2)
    +"block3:"+mNfcVutil.readOneBlock(3)+' '
    +"block4:"+mNfcVutil.readOneBlock(4)
    +"block5:"+mNfcVutil.readOneBlock(5)+' '
    +"block6:"+mNfcVutil.readOneBlock(6)
    +"block7:"+mNfcVutil.readOneBlock(7)+' '
    +"block8:"+mNfcVutil.readOneBlock(8)
    +"block9:"+mNfcVutil.readOneBlock(9)+' '
    +"block10:"+mNfcVutil.readOneBlock(10)
    +"block11:"+mNfcVutil.readOneBlock(11)+' '
    +"block12:"+mNfcVutil.readOneBlock(12)
    +"block13:"+mNfcVutil.readOneBlock(13)+' '
    +"block14:"+mNfcVutil.readOneBlock(14)
    +"block15:"+mNfcVutil.readOneBlock(15)+' '
    +"block16:"+mNfcVutil.readOneBlock(16)
    +"block17:"+mNfcVutil.readOneBlock(17)+' '
    +"block18:"+mNfcVutil.readOneBlock(18)
    +"block19:"+mNfcVutil.readOneBlock(19)+' '
    +"block20:"+mNfcVutil.readOneBlock(20)
    +"block21:"+mNfcVutil.readOneBlock(21)+' '
    +"block22:"+mNfcVutil.readOneBlock(22)
    +"block23:"+mNfcVutil.readOneBlock(23)+' '
    +"block24:"+mNfcVutil.readOneBlock(24)
    +"block25:"+mNfcVutil.readOneBlock(25)+' '
    +"block26:"+mNfcVutil.readOneBlock(26)
    +"block27:"+mNfcVutil.readOneBlock(27)+' '
    +"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();
    }

    }

  • 相关阅读:
    面试中AOP这样说,面试官只有一个字:服!
    Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!
    Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!
    C#一些基础知识回顾
    关闭WiN10自动更新和后台程序。
    python脚本显示运行进程
    选择pyqt5理由
    anaconda3下64位python和32位python共存
    爬取百度搜索信息
    python尝试windows在用端口
  • 原文地址:https://www.cnblogs.com/qiaoxu/p/3989903.html
Copyright © 2020-2023  润新知