let Context = plus.android.importClass("android.content.Context");
let NfcManager = plus.android.importClass("android.nfc.NfcManager");
let NfcAdapter = plus.android.importClass("android.nfc.NfcAdapter");
let Settings= plus.android.importClass("android.provider.Settings");
let Intent = plus.android.importClass("android.content.Intent");
let Parcelable = plus.android.importClass("android.os.Parcelable");
let PendingIntent = plus.android.importClass('android.app.PendingIntent');
let IntentFilter = plus.android.importClass('android.content.IntentFilter');
let NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
let NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
let Tag = plus.android.importClass("android.nfc.Tag");
let MifareClassic = plus.android.importClass("android.nfc.tech.MifareClassic");
let invoke = plus.android.invoke;
const Nfc={
//所需要的数据
data:{
sector:1,//0号扇区
keyVal:'737166323031',//扇区密码
status:'read',//当前操作方式:是读卡 还是 写卡
WriteData:'',//当status为write时生效。需要写入的数字。长度不能超过32位。只能为数字
block:1,//当status为write时生效。需要写入0号扇区的几号块
keyType:'A',//验证方式
nfcAdapter:null,
ICUID:'',//卡片ID
main:null,
intent:null,
IntervalId:null,
callback:null,//回调事件
techListsArray:[
["android.nfc.tech.IsoDep"],
["android.nfc.tech.NfcA"],
["android.nfc.tech.NfcB"],
["android.nfc.tech.NfcF"],
["android.nfc.tech.NfcV"],
["android.nfc.tech.Ndef"],
["android.nfc.tech.NdefFormatable"],
["android.nfc.tech.MifareClassic"],
["android.nfc.tech.MifareUltralight"]
]
},
//初始化
Into:function (){
this.data.main=plus.android.runtimeMainActivity();
var nfchManager = this.data.main.getSystemService(Context.NFC_SERVICE);
var nfcAdapter = nfchManager.getDefaultAdapter();
if(!nfcAdapter.isEnabled()){
this.data.intent= new Intent(Settings.ACTION_NFC_SETTINGS);
this.data.main.startActivity(this.data.intent);
}
var intent = new Intent(this.data.main, this.data.main.getClass());
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
var pendingIntent = PendingIntent.getActivity(this.data.main, 0, intent, 0);
var ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
ndef.addDataType("*/*");
var intentFiltersArray = [ndef];
nfcAdapter.enableForegroundDispatch(this.data.main, pendingIntent, intentFiltersArray, this.data.techListsArray);
this.data.nfcAdapter=nfcAdapter;
},
//取消操作
nfcclose:function(){
if(this.data.nfcAdapter)
this.data.nfcAdapter.disableForegroundDispatch(this.data.main);
this.data.nfcAdapter=null;
clearInterval(this.data.IntervalId);
},
//轮询获取当前NFC设备触发的事件
handle_nfc_data:function(){
console.log('等卡靠近。。。')
var intent = this.data.main.getIntent();
if(intent.getAction() == "android.nfc.action.TECH_DISCOVERED"){
clearInterval(this.data.IntervalId);
intent.setAction(null);
if(this.data.status==='read')
{
console.log('开始读取信息')
this._readData(intent);
}
else{
console.log('开始写入数据')
this._WriteData(intent);
}
}
},
//读取设备
_readData:function(intent){
uni.showLoading({
title:"正在读取.请勿移开"
});
var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
var techList = tag.getTechList();
var bisMfc=false;
for(var i=0;i<techList.length;i++){
if(techList[i].indexOf('MifareClassic')>=0){
bisMfc=true;
break;
}
}
if(!bisMfc){
uni.hideLoading();
uni.showModal({
content: "卡片类型错误",
showCancel: false
});
return;
}
var mfc=MifareClassic.get(tag);
if(!mfc){
uni.hideLoading();
uni.showModal({
content: "卡片获取错误",
showCancel: false
});
return;
}
mfc.setTimeout(3000);
if(!mfc.isConnected()){
try{
invoke(mfc,'connect');
}catch(e){
uni.hideLoading();
uni.showModal({
content: "卡片连接错误",
showCancel: false
});
return;
}
}
try{
this.data.ICUID=this.ByteArrayToHexString(tag.getId());
var cmdBytes=this.HexStringToByteArray(this.data.keyVal);
console.log(cmdBytes)
var auth=false;
if(this.data.keyType=="A"){
auth=invoke(mfc,"authenticateSectorWithKeyA",parseInt(this.data.sector),cmdBytes);
}else{
auth=invoke(mfc,"authenticateSectorWithKeyB",parseInt(this.data.sector),cmdBytes);
}
console.log(auth)
if(!auth){
uni.hideLoading();
uni.showModal({
content: "请勿拿开",
showCancel: false
});
return;
}
var bIndex = mfc.sectorToBlock(this.data.sector);
var arr=[]
for (var i = 0; i < 4; i++) {
var data = mfc.readBlock(bIndex+i);
console.log('当前'+i+"号块:读取的内容:"+this.ByteArrayToHexString(data))
arr.push(this.ByteArrayToHexString(data))
}
mfc.close();
uni.hideLoading();
// uni.showModal({
// content: "扇区读取成功",
// showCancel: false
// });
//this.nfcclose();
this.data.callback(arr)
}catch(e){
console.error(e);
}finally{
mfc.close();
}
},
//写入数据
_WriteData:function(intent){
uni.hideLoading();
uni.showLoading({
title: '正在写入中.请勿移开'
});
var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
var techList = tag.getTechList();
var bisMfc=false;
for(var i=0;i<techList.length;i++){
if(techList[i].indexOf('MifareClassic')>=0){
bisMfc=true;
break;
}
}
if(!bisMfc){
uni.hideLoading();
uni.showModal({
content: "卡片类型错误",
showCancel: false
});
return;
}
var mfc=MifareClassic.get(tag);
if(!mfc){
uni.hideLoading();
uni.showModal({
content: "卡片获取错误",
showCancel: false
});
return;
}
mfc.setTimeout(3000);
if(!mfc.isConnected()){
try{
invoke(mfc,'connect');
}catch(e){
uni.hideLoading();
uni.showModal({
content: "卡片连接错误",
showCancel: false
});
return;
}
}
try{
this.data.ICUID=this.ByteArrayToHexString(tag.getId());
console.log(this.data.keyVal)
var cmdBytes=this.HexStringToByteArray(this.data.keyVal);
var auth=false;
if(this.data.keyType=="A"){
auth=invoke(mfc,"authenticateSectorWithKeyA",parseInt(this.data.sector),cmdBytes);
}else{
auth=invoke(mfc,"authenticateSectorWithKeyB",parseInt(this.data.sector),cmdBytes);
}
if(!auth){
uni.hideLoading();
uni.showModal({
content: "请靠近一点",
showCancel: false
});
return;
}
//开始写入指定块
//mfc.writeBlock(this.data.block,this.HexStringToByteArray("11111111100000000000000000000000"));
mfc.writeBlock(this.data.block,this.HexStringToByteArray(this.data.WriteData));
//验证是否写入成功
var data = mfc.readBlock(this.data.block);
console.log(this.ByteArrayToHexString(data))
console.log(this.data.WriteData)
if(this.ByteArrayToHexString(data)===this.data.WriteData)
{
uni.hideLoading();
mfc.close();
uni.showModal({
content: "写入完成",
showCancel: false
});
this.data.callback({status:1,msg:'写入成功'})
}else{
console.log('写入失败')
this.data.callback({status:0,msg:'写入失败'})
}
}catch(e){
console.error(e);
}finally{
mfc.close();
}
},
ByteArrayToHexString:function(inarray) {
var i, j, inn;
var hex = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];
var out = '';
for(j = 0; j<inarray.length; ++j) {
inn = inarray[j] & 0xff;
i = (inn >>> 4) & 0x0f;
out += hex[i];
i = inn & 0x0f;
out += hex[i];
}
return out;
},
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;
},
//对外开放的读取事件
readData:function(){
//输入请靠近设备
uni.showLoading({
title: '将卡靠近设备'
});
this.data.status="read"
var that=this
this.data.IntervalId = setInterval(function(){
that.handle_nfc_data();
},1000);
},
//对外开放的写入事件
//传一个需要写入的数据
writeData:function(value){
//输入请靠近设备
this.data.status="write"
uni.showLoading({
title: '请靠近设备'
});
if(value.length>32)
{
uni.showModal({
content: "写入数据长度不能超过32位",
showCancel: false
});
}
for(var i=value.length;i<32;i++)
{
value+='0';
}
console.log(value);
console.log(value.length)
this.data.WriteData=value
var that=this
this.data.IntervalId = setInterval(function(){
that.handle_nfc_data();
},1000);
}
}
export default Nfc