NFC标签的读写

最近公司要求完成一个利用NFC标签管理仓库库存的一个IOT项目,要求手机从服务器获取的数据后,将数据写入NFC标签中。其实主要的核心还是利用读卡器模式对NFC标签的读写。

具体如下:
1.权限的配置

<uses-permission android:name="android.permission.NFC" />
        
<uses-feature android:name="android.hardware.nfc"
        android:required="true" />

2.当我们在注册activity的时候还需要加上过滤NFC的intent,目的是一旦NFC标签靠近手机,手机发起响应不能让它调起系统自带的NFC应用,而是我们的应用。

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

3.定义NFC标签的规则标准,目的是哪些符合标准的NFC标签可以让自己的应用响应。该标准由xml文件编写,例如创建一个nfc_model.xml的文件。该文件放在rew资源中的xml文件夹中。NFC标签的读写_第1张图片

nfc_model.xml里面的内容有:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
       <tech>android.nfc.tech.MifareClassictech>
    tech-list>
resources>

在注册activity时将nfc_model.xml文件添加进去

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_model" />

4.在活动中重写onNewIntent,对NFC标签无论是读还是写都会调用这个重写的方法,数据格式是ndef

 @Override
    protected void onNewIntent(Intent intent) {//通过intent来作为数据的载体
        if(iswrite){//是写入
            Tag detectedTag =intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{createTextRecord(mTagText)});//写入ndef格式的字符串
            boolean result = writeTag(ndefMessage, detectedTag);
            if (result) {//写入成功

            }
        }else{//是读
            readNfcTag(intent);
        }
    }

/**
 *读
 */
 private void readNfcTag(Intent intent) {
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {//标签靠近手机时,手机响应NFC标签
         Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                    NfcAdapter.EXTRA_NDEF_MESSAGES);//获取序列数组
            NdefMessage msgs[] = null;
            if (rawMsgs != null) {//将数组放进NdefMessage中
                msgs = new NdefMessage[rawMsgs.length];
                for (int i = 0; i < rawMsgs.length; i++) {
                    msgs[i] = (NdefMessage) rawMsgs[i];
                }
            }
            NdefRecord record = msgs[0].getRecords()[0];
            String textRecord = parseTextRecord(record);
            //textRecord 就是读到的nfc标签里的字符串了
        }
  }

/**
     * 将文本信息转成ndef格式的NdefRecord 
     *
     * @param text
     * @return
     */
    protected  NdefRecord createTextRecord(String text) {
        byte[] langBytes = Locale.CHINA.getLanguage().getBytes(Charset.forName("US-ASCII"));
        Charset utfEncoding = Charset.forName("UTF-8");
        //将文本转换为UTF-8格式
        byte[] textBytes = text.getBytes(utfEncoding);
        //设置状态字节编码最高位数为0
        int utfBit = 0;
        //定义状态字节
        char status = (char) (utfBit + langBytes.length);
        byte[] data = new byte[1 + langBytes.length + textBytes.length];
        //设置第一个状态字节,先将状态码转换成字节
        data[0] = (byte) status;
        //设置语言编码,使用数组拷贝方法,从0开始拷贝到data中,拷贝到data的1到langBytes.length的位置
        System.arraycopy(langBytes, 0, data, 1, langBytes.length);
        //设置文本字节,使用数组拷贝方法,从0开始拷贝到data中,拷贝到data的1 + langBytes.length
        //到textBytes.length的位置
        System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
        //通过字节传入NdefRecord对象
        //NdefRecord.RTD_TEXT:传入类型 读写
        NdefRecord ndefRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
                NdefRecord.RTD_TEXT, new byte[0], data);
        return ndefRecord;
    }

5.有了读和写,我们就能进行基本的数据交互。十分的简单。NFC标签属于IOT的范畴,有很多种的用途。更多的逻辑处理是在于读写的操作上。标签里如果需要存在大量的数据的话,需要把写入的文本数据写成json格式的字符串,再通过手机获取信息发送的服务器。

PS:人生的第一篇博客,有不对的地方还望不吝指正,多多交流。

你可能感兴趣的:(NFC标签的读写)