7***@qq.com
7***@qq.com
  • 发布:2020-10-11 19:05
  • 更新:2021-11-26 09:59
  • 阅读:2537

nfc读取加密扇区

分类:uni-app
NFC

// 包路径
const package_NdefRecord = 'android.nfc.NdefRecord';
const package_NdefMessage = 'android.nfc.NdefMessage';
const package_TECH_DISCOVERED = 'android.nfc.action.TECH_DISCOVERED';
const package_Intent = 'android.content.Intent';
const package_Activity = 'android.app.Activity';
const package_PendingIntent = 'android.app.PendingIntent';
const package_IntentFilter = 'android.content.IntentFilter';
const package_NfcAdapter = 'android.nfc.NfcAdapter';
const package_Ndef = 'android.nfc.tech.Ndef';
const package_NdefFormatable = 'android.nfc.tech.NdefFormatable';
const package_Parcelable = 'android.os.Parcelable';
const package_String = 'java.lang.String';

let NfcAdapter;
let NdefRecord;
let NdefMessage;
let readyWriteData = false;
let readyRead = false;
let noNFC = false;
let techListsArray = [
["android.nfc.tech.IsoDep"],
["android.nfc.tech.NfcA"],
["android.nfc.tech.NfcB"],
["android.nfc.tech.NfcF"],
["android.nfc.tech.Ndef"],
["android.nfc.tech.NfcV"],
["android.nfc.tech.NdefFormatable"],
["android.nfc.tech.MifareClassic"],
["android.nfc.tech.MifareUltralight"]
];
// 要写入的数据
let text = '{id:123,name:nfc,stie:cssmini.com}';
let readResult = '';

export default {
listenNFCStatus: function() {
let that = this;
try {
let main = plus.android.runtimeMainActivity();
let Intent = plus.android.importClass('android.content.Intent');
let Activity = plus.android.importClass('android.app.Activity');
let PendingIntent = plus.android.importClass('android.app.PendingIntent');
let IntentFilter = plus.android.importClass('android.content.IntentFilter');
NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
let nfcAdapter = NfcAdapter.getDefaultAdapter(main);

        if (nfcAdapter == null) {  
            uni.showToast({  
                title: '设备不支持NFC!',  
                icon: 'none'  
            })  
            noNFC = true;  
            return;  
        }  

        if (!nfcAdapter.isEnabled()) {  
            uni.showToast({  
                title: '请在系统设置中先启用NFC功能!',  
                icon: 'none'  
            });  
            noNFC = true;  
            return;  
        } else {  
            noNFC = false;  
        }  

        let intent = new Intent(main, main.getClass());  
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
        let pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);  
        let ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");  
        ndef.addDataType("*/*");  
        let intentFiltersArray = [ndef];  

        plus.globalEvent.addEventListener('newintent', function() {  
            console.log('newintent running');  
            // 监听 NFC  
            setTimeout(that.nfcRuning(), 1000);  
        });  
        plus.globalEvent.addEventListener('pause', function(e) {  
            console.log('pause running');  
            if (nfcAdapter) {  
                //关闭前台调度系统  
                //恢复默认状态  
                nfcAdapter.disableForegroundDispatch(main);  
            }  
        });  
        plus.globalEvent.addEventListener('resume', function(e) {  
            console.log('resume running');  
            if (nfcAdapter) {  
                //开启前台调度系统  
                nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);  
            }  
        });  
        nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);  
    } catch (e) {  
        console.error(e);  
    }  
},  
nfcRuning: function() {  
    NdefRecord = plus.android.importClass("android.nfc.NdefRecord");  
    NdefMessage = plus.android.importClass("android.nfc.NdefMessage");  
    let main = plus.android.runtimeMainActivity();  
    let intent = main.getIntent();  
    let that = this;  

    console.log("action type:" + intent.getAction());  

    if (package_TECH_DISCOVERED == intent.getAction()) {  
        console.log("readyWriteData=" + readyWriteData + " readyRead=" + readyRead)  
        if (readyWriteData) {  
            that.write(intent);  
            readyWriteData = false;  
        } else if (readyRead) {  

            that.read(intent);  
            readyRead = false;  
        }  
    }  
},  
write(intent) {  
    try {  
        toast('请勿移开标签 正在写入...');  
        console.log("text=" + text);  

        let textBytes = plus.android.invoke(text, "getBytes");  
        // image/jpeg text/plain    
        let textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,  
            plus.android.invoke("text/plain", "getBytes"),  
            plus.android.invoke("", "getBytes"), textBytes);  
        let message = new NdefMessage([textRecord]);  
        let Ndef = plus.android.importClass('android.nfc.tech.Ndef');  
        let NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');  
        let tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
        let ndef = Ndef.get(tag);  
        if (ndef != null) {  
            // 待写入的数据长度  
            let size = message.toByteArray().length;  
            ndef.connect();  
            if (!ndef.isWritable()) {  
                toast('tag不允许写入!');  
                return;  
            }  
            if (ndef.getMaxSize() < size) {  
                toast('文件大小超出容量!');  
                return;  
            }  
            ndef.writeNdefMessage(message);  
            toast('写入数据成功!');  
            return;  
        } else {  
            let format = NdefFormatable.get(tag);  
            if (format != null) {  
                try {  
                    format.connect();  
                    format.format(message);  
                    toast('格式化tag并且写入message');  
                    return;  
                } catch (e) {  
                    toast('格式化tag失败.');  
                    return;  
                }  
            } else {  
                toast('Tag不支持NDEF');  
                return;  
            }  
        }  
    } catch (e) {  
        toast('写入失败');  
        console.log("error=" + e);  
    }  

},  
read(intent) {  
    this.getData(intent);  
},  
byteArrayToHexString: function(inarray) { // converts byte arrays to string    
    let i, j, inn;  
    let hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];  
    let out = "";  

    for (j = 0; j < inarray.length; ++j) {  
        if(inarray[j]==0) continue;  
        inn = inarray[j] & 0xff;  
        i = (inn >>> 4) & 0x0f;  
        out += hex[i];  
        i = inn & 0x0f;  
        out += hex[i];  
    }  
    return out;  
},  
writeData: function() {  
    if (noNFC) {  
        toast('请检查设备是否支持并开启 NFC 功能!');  
        return;  
    }  
    // 监听事件,触发条件  
    readyWriteData = true;  
    toast('请将NFC标签靠近!');  
},  
readData: function() {  
    if (noNFC) {  
        toast('请检查设备是否支持并开启 NFC 功能!');  
        return;  
    }  
    // 监听事件,触发条件  
    readyRead = true;  
    toast('请将NFC标签靠近!');  

},  
getData: function(intent) {  
    var sector = 1;  
    var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
    let mc = plus.android.importClass('android.nfc.tech.MifareClassic');  
    let mfc = mc.get(tag);  
    console.log('mfc', mfc)  
    mfc.connect();  
    var cmdBytes = [0x6A, 0x69, 0x61, 0x6A, 0x75, 0x6E]  
    console.log('mfc', cmdBytes)  
    var auth = mfc.authenticateSectorWithKeyA(sector, cmdBytes)  

    console.log('auth', auth);  
    if (!auth) return;  
    try {  
        var tmpRet,result;  
        for (var i = 0; i < 3; i++) {  
            tmpRet = mfc.readBlock(sector * 4 + i);  
            result+=this.hexCharCodeToStr(this.byteArrayToHexString(tmpRet))  
        }  

        console.log('result',result);  
    } catch (e) {  
        this.ICERROR = e.message;  
        console.error(e);  
    } finally {  
        mfc.close();  
    }  
},  
//Key处理函数    
HexStringToByteArray: function(instr) {  
    var hexA = new Array();  
    var pos = 0;  
    var len = instr.length / 2;  
    for (var i = 0; i < len; i++) {  
        var s = instr.substr(pos, 2);  
        var v = parseInt(s, 16);  
        if (v >= 128)  
            v = v - 256;  
        hexA.push(v);  
        pos += 2;  
    }  
    return hexA;  
},  
hexCharCodeToStr: function(hexCharCodeStr) {  
    var trimedStr = hexCharCodeStr.trim();  
    var rawStr =  
        trimedStr.substr(0, 2).toLowerCase() === "0x" ?  
        trimedStr.substr(2) :  
        trimedStr;  
    var len = rawStr.length;  
    if (len % 2 !== 0) {  
        alert("Illegal Format ASCII Code!");  
        return "";  
    }  
    var curCharCode;  
    var resultStr = [];  
    for (var i = 0; i < len; i = i + 2) {  
        curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value  
        resultStr.push(String.fromCharCode(curCharCode));  
    }  
    return resultStr.join("");  
}  

}

function toast(content) {
uni.showToast({
title: content,
icon: 'none'
})
}

0 关注 分享

要回复文章请先登录注册

1***@163.com

1***@163.com

加密扇区?在哪里?
2021-11-26 09:59
1***@qq.com

1***@qq.com

请问怎么修改那个写入的信息类型为url,nfc触发时会自动访问url,而不是文本
2020-10-15 14:56