package com.dayu.qihealonelibrary.tools; 
 | 
  
 | 
import android.app.Activity; 
 | 
import android.content.Intent; 
 | 
import android.nfc.NfcAdapter; 
 | 
import android.nfc.Tag; 
 | 
import android.nfc.tech.MifareClassic; 
 | 
import android.util.Log; 
 | 
  
 | 
import com.dayu.baselibrary.tools.HexUtil; 
 | 
import com.dayu.qihealonelibrary.card.UserCard; 
 | 
  
 | 
import java.io.IOException; 
 | 
  
 | 
/** 
 | 
 * @author zx 
 | 
 * @date 2018/4/25 8:08 
 | 
 * email 1058083107@qq.com 
 | 
 * description 
 | 
 */ 
 | 
public class NFCWriteHelper extends BaseNFCHelper { 
 | 
  
 | 
    private Tag tag; 
 | 
  
 | 
    private static NFCWriteHelper helper; 
 | 
    private static int PASSWORD_LENTH = 12; 
 | 
  
 | 
    public NFCWriteHelper(Intent intent, Activity activity) { 
 | 
        super(activity); 
 | 
        this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 单例初始化 
 | 
     * 
 | 
     * @param intent 
 | 
     * @return 
 | 
     */ 
 | 
    public static NFCWriteHelper getInstence(Intent intent, Activity activity) { 
 | 
        if (helper == null) { 
 | 
            helper = new NFCWriteHelper(intent, activity); 
 | 
        } 
 | 
        return helper; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置NFC卡的读取密码 
 | 
     * 
 | 
     * @param str 
 | 
     * @return 
 | 
     */ 
 | 
    public NFCWriteHelper setReadPassword(String str) { 
 | 
        if (null != str && (str.length() <= PASSWORD_LENTH)) { 
 | 
            for (int i = 0; i < str.length(); i++) { 
 | 
                defauleKey[i] = (byte) str.charAt(i); 
 | 
            } 
 | 
        } 
 | 
        return helper; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 写卡 
 | 
     * 
 | 
     * @param userCard 用户卡内容 
 | 
     * @param 
 | 
     */ 
 | 
    public boolean writeUserData(UserCard userCard) { 
 | 
        if (userCard != null) { 
 | 
            int a = 1; 
 | 
            try { 
 | 
                MifareClassic mfc = MifareClassic.get(tag); 
 | 
                if (null != mfc) { 
 | 
                    try { 
 | 
                        //连接NFC 
 | 
                        mfc.connect(); 
 | 
                        //验证扇区密码 
 | 
                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey); 
 | 
                        if (!isOpen) { 
 | 
                            isOpen = mfc.authenticateSectorWithKeyA(a, companyKey); 
 | 
                        } else { 
 | 
                            //写卡时修改所有密码 
 | 
                            changePasword(a, mfc); 
 | 
                        } 
 | 
                        if (isOpen) { 
 | 
                            for (int b = 0; b < 3; b++) { 
 | 
                                byte[] data; 
 | 
                                if (b == 0) { 
 | 
                                    data = userCard.getZeroBytes(); 
 | 
                                } else if (b == 1) { 
 | 
                                    data = userCard.getOneBytes(); 
 | 
                                } else { 
 | 
                                    data = userCard.getTwoBytes(); 
 | 
                                } 
 | 
                                int bIndex = mfc.sectorToBlock(a); 
 | 
                                //写卡 
 | 
                                mfc.writeBlock(bIndex + b, data); 
 | 
                            } 
 | 
                            return true; 
 | 
                        } 
 | 
                        return false; 
 | 
                    } catch (Exception e) { 
 | 
                        e.printStackTrace(); 
 | 
                        return false; 
 | 
                    } finally { 
 | 
                        try { 
 | 
                            mfc.close(); 
 | 
                        } catch (IOException e) { 
 | 
                            e.printStackTrace(); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } catch (Exception e) { 
 | 
                e.printStackTrace(); 
 | 
                return false; 
 | 
            } 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 写卡 
 | 
     * 
 | 
     * @param str 书写内容,16个字节 
 | 
     * @param a   书写的扇区 (从0开始数) 
 | 
     * @param b   书写的块(从0开始数) 
 | 
     * @param 
 | 
     */ 
 | 
    public boolean writeData(byte[] str, int a, int b) { 
 | 
        Log.i("NFCWreatActivity", "writeData: a=" + a + " b=" + b); 
 | 
        if (str.length <= 16) { 
 | 
            try { 
 | 
                MifareClassic mfc = MifareClassic.get(tag); 
 | 
                if (null != mfc) { 
 | 
                    try { 
 | 
                        //连接NFC 
 | 
                        mfc.connect(); 
 | 
                        //获取扇区数量 
 | 
                        int count = mfc.getSectorCount(); 
 | 
                        //如果传进来的扇区大了或者小了直接退出方法 
 | 
                        if (a > count - 1 || a < 0) { 
 | 
                            return false; 
 | 
                        } 
 | 
                        //获取写的扇区的块的数量 
 | 
                        int bCount = mfc.getBlockCountInSector(a); 
 | 
                        //如果输入的块大了或者小了也是直接退出 
 | 
                        if (b > bCount - 1 || b < 0) { 
 | 
                            return false; 
 | 
                        } 
 | 
                        //验证扇区密码 
 | 
                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey); 
 | 
                        if (!isOpen) { 
 | 
                            isOpen = mfc.authenticateSectorWithKeyA(a, companyKey); 
 | 
                        } else { 
 | 
                            //写卡时修改所有密码 
 | 
                            changePasword(a, mfc); 
 | 
                        } 
 | 
                        if (isOpen) { 
 | 
                            int bIndex = mfc.sectorToBlock(a); 
 | 
                            //写卡 
 | 
                            mfc.writeBlock(bIndex + b, str); 
 | 
                            return true; 
 | 
                        } 
 | 
                        return false; 
 | 
                    } catch (Exception e) { 
 | 
                        e.printStackTrace(); 
 | 
                        return false; 
 | 
                    } finally { 
 | 
                        try { 
 | 
                            mfc.close(); 
 | 
                        } catch (IOException e) { 
 | 
                            e.printStackTrace(); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } catch (Exception e) { 
 | 
                e.printStackTrace(); 
 | 
                return false; 
 | 
            } 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 修改密码 
 | 
     * 
 | 
     * @param a 书写的扇区 
 | 
     *          //     * @param callback 返回监听 
 | 
     */ 
 | 
    public boolean changePasword(int a, MifareClassic mfc) { 
 | 
//        MifareClassic mfc = MifareClassic.get(tag); 
 | 
        byte[] data = new byte[16]; 
 | 
        if (null != mfc) { 
 | 
            try { 
 | 
//                mfc.connect(); 
 | 
//                int count = mfc.getSectorCount(); 
 | 
//                boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey); 
 | 
//                //验证是否是默认密码,当默认密码时修改密码 
 | 
//                if (isOpen) { 
 | 
                //将密码转换为keyA 
 | 
                byte[] dataA = HexUtil.hexToByteArray(companyKeyA); 
 | 
                for (int i = 0; i < dataA.length; i++) { 
 | 
                    data[i] = dataA[i]; 
 | 
                } 
 | 
                //输入控制位 
 | 
                data[6] = (byte) 0xFF; 
 | 
                data[7] = (byte) 0x07; 
 | 
                data[8] = (byte) 0x80; 
 | 
                data[9] = (byte) 0x69; 
 | 
                byte[] dataB = HexUtil.hexToByteArray(companyKeyB); 
 | 
                //将密码转换为KeyB 
 | 
                for (int i = 0; i < dataB.length; i++) { 
 | 
                    data[i + 10] = dataB[i]; 
 | 
                } 
 | 
                int bIndex = mfc.sectorToBlock(a); 
 | 
                int bCount = mfc.getBlockCountInSector(a); 
 | 
                //写到扇区的最后一个块 
 | 
                mfc.writeBlock(bIndex + bCount - 1, data); 
 | 
//                    byte[] dataa = mfc.readBlock(bIndex + bCount - 1); 
 | 
//                    // 修改密码 A 
 | 
//                    mfc.writeBlock(mfc.sectorToBlock(a) + 3, dataA); 
 | 
//                    // 修改密码 B 
 | 
//                    mfc.writeBlock(mfc.sectorToBlock(a) + 7, dataB); 
 | 
//                } 
 | 
                return true; 
 | 
            } catch (Exception e) { 
 | 
                e.printStackTrace(); 
 | 
                return false; 
 | 
//                callback.isSusses(false); 
 | 
            } finally { 
 | 
//                try { 
 | 
//                    mfc.close(); 
 | 
//                } catch (IOException e) { 
 | 
//                    e.printStackTrace(); 
 | 
//                } 
 | 
            } 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 返回监听类 
 | 
     */ 
 | 
    public interface NFCCallback { 
 | 
        /** 
 | 
         * 返回是否成功 
 | 
         * 
 | 
         * @param flag 
 | 
         */ 
 | 
        void isSusses(boolean flag); 
 | 
    } 
 | 
} 
 |