| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647 |
- const app = getApp();
- import {tools} from "../des3/nfcTool"
- Component({
- options: {
- addGlobalClass: true,
- multipleSlots: true,
- },
- properties: {
- scanType: {
- type: Number,
- value: 1,
- },
- scanTxt: {
- value: '',
- },
- },
- data: {
- reading:false,
- key:"",
- nfc:"",
- debug:1,
- keyA:[0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7],
- keyB:[0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF],
- },
- pageLifetimes:{
- async show() {
- //type值,1查看有源状态,2激活有源标签,3锁闭有源标签,4读取有源标签温度,6读取防伪标签,7读取uid
- this.initNfc(this.scanType)
- },
- hide() {
- var nfc = this.nfc
- if(nfc){
- nfc.offDiscovered(this.discoverHandler)
- }
- },
- },
- async ready(){
- console.log(this.data.scanType)
- },
- methods: {
- offNfc(){
- return new Promise((resolve, reject)=>{
- if(this.nfc){
- this.nfc.offDiscovered({
- complete:(r)=>{
- this.nfc.stopDiscovery({
- complete:(res)=>{
- console.log(res)
- resolve()
- }
- })
- }
- })
- }else{
- resolve()
- }
- })
- },
- async initNfc(type){//初始化NFC
- var that = this
- if(this.data.debug)console.log(this.nfcObj)
- if(this.nfc){
- await this.offNfc()
- }
- this.type = type
- this.type = this.data.scanType
- const nfc = wx.getNFCAdapter()
- this.nfc = nfc
- return new Promise(async (resolve, reject)=>{
- this.nfc.onDiscovered(res=>{//监听NFC接近
- this.type = this.data.scanType
- var techs = res.techs
- this.techTime = new Date().getTime()
- this.nfcObj = this.nfc.getIsoDep();
- //连接NFC
- this.nfcObj.connect({
- success:async (resc)=>{
- this.setData({reading:true})
- var temp = {}
- //ACCESS验证
- await this.COS_Access()
- //读取有源标签温度
- if(this.type==4)temp =await this.read_yy()
- //检查有源标签状态
- if(this.type==1)temp =await this.check_yy_status()
- //激活有源标签
- if(this.type==2)temp =await this.active_yy()
- //锁闭有源标签
- if(this.type==3)temp =await this.close_yy()
- //读取防伪标签
- if(this.type==6)temp =await this.read_fw()
- //读取uid
- if(this.type==7)temp =await this.read_uid()
- //读取自定义信息
- if(this.type==8)temp =await this.read_data()
- //写入自定义信息
- if(this.type==9)temp =await this.write_data(this.data.scanTxt)
- //读采温周期
- if(this.type==10)temp =await this.read_interval()
- //读采温周期
- if(this.type==11)temp =await this.write_interval(this.data.scanTxt)
- //x106读取自定义信息和温度数据
- if(this.type==101)temp =await this.x106_end()
- //x106读取自定义信息和温度数据
- if(this.type==102)temp =await this.x106_start(this.data.scanTxt)
- this.setData({reading:false})
- this.triggerEvent('setNfcRes', temp)
- resolve(temp)
- },
- fail:err=>{
- if(this.data.debug)console.log("connect",err)
- reject(err)
- }
- })
- })
- this.nfc.startDiscovery({
- fail(err) {
- //app.globalData?.nonfc = true
- reject(err)
- }
- })
- })
- },
- async COS_Access(){
- await this.authNfc()
- var trnd = await this.setApdu([0xA2, 0xB0, 0x00, 0x10, 0x10])
- await this.calcKey(trnd)
- },
- sleep(ms){
- return new Promise(resolve => setTimeout(resolve, ms))
- },
- authNfc(){
- return new Promise(async (resolve, reject)=>{
- var authRes = await this.setApdu([0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xAC, 0x01])
- if(authRes.join("") == "99192"){//[99,192]
- if(this.data.debug)console.log("解锁标签")
- await this.sleep(20)
- authRes = await this.setApdu([0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xAC, 0x01])
- }
- if(authRes.join("") == "1440"){//[144,0]
- resolve()
- }else{
- if(this.data.debug)console.log("解锁失败")
- reject()
- }
- })
- },
- async calcKey(data){
- var trnd_bytes = data.slice(0,8)
- var mid_bytes = data.slice(8,17)
- var des3_key_list = []
- for(var i=0;i<8;i++){
- des3_key_list[i] = trnd_bytes[i] ^ this.data.keyA[i]
- des3_key_list[i+8] = mid_bytes[i] ^ this.data.keyB[i]
- }
- var des3_key_bytes = tools.numArrToHex(des3_key_list)//numArrToBit(des3_key_list)//
- this.des3Key = des3_key_bytes
- // this.des3Key = "11223344556677889900AABBCCDDEEFF"
- //3des的KEY
- var random_key_bytes = tools.numArrToHex(trnd_bytes)//numArrToBit(trnd_bytes)//
- var trnd_encrpyt_bytes = tools.encode3des(random_key_bytes,des3_key_bytes)
- var command_bytes = [0xA2, 0xD6, 0x00, 0x10, 0x10]
- var rad = [1,2,3,4,5,6,7,8]//8位随机字节,直接写死试试
- //拼三段指令
- command_bytes= [...command_bytes,...tools.hexToNumArr(trnd_encrpyt_bytes),...rad]
- if(this.data.debug)console.log(command_bytes)
-
- rad = tools.numArrToHex(rad)//numArrToBit(rad)//
- trnd_encrpyt_bytes = tools.encode3des(rad,des3_key_bytes)
- if(this.data.debug)console.log(tools.hexToNumArr(trnd_encrpyt_bytes))
- var authRes = await this.setApdu(command_bytes)
- return new Promise(async (resolve, reject)=>{
- if(authRes.join("") == "99192"){//[99,192]
- if(this.data.debug)console.log("解锁标签")
- authRes = await this.setApdu(command_bytes)
- }
- if(authRes.join("") == "1440"){//[144,0]
- var trnd = await this.setApdu([0xA2, 0xB0, 0x00, 0x10, 0x10])
- if(this.data.debug)console.log(trnd)
- if(trnd.slice(0,8).join("") == tools.hexToNumArr(trnd_encrpyt_bytes).join("")){
- if(this.data.debug)console.log("验证通过1")
- resolve()
- }else{
- if(this.data.debug)console.log("验证不通过")
- reject()
- }
- }else{
- if(this.data.debug)console.log("设备异常")
- reject()
- }
- })
- },
- async read_yy(){
- var data_bytes = await this.COS_Analysis(data_bytes)
- if(this.data.debug)console.log(data_bytes)
- return {data_bytes,timeUsed:new Date().getTime() - this.techTime}
- },
- async COS_Analysis(){
- await this.setApdu([0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xDA, 0x01])
- var data_bytes = await this.ISO14443_4A_ReadBinary(0xA2, 0, 80, 56)
- var data_bias = 24
- var uid = data_bytes.substring(data_bias + 0, data_bias + 52)
- var CID_bytes = data_bytes.substring(data_bias + 0, data_bias + 4)
- var TID_bytes = data_bytes.substring(data_bias + 4, data_bias + 16)
- var GTIN_bytes = data_bytes.substring(data_bias + 16, data_bias + 36)
- var VID_bytes = data_bytes.substring(data_bias + 36, data_bias + 52)
- var MID_bytes = data_bytes.substring(data_bias + 52, data_bias + 68)
- var MAC_bytes = data_bytes.substring(data_bias + 68, data_bias + 84)
- var TRNG_bytes = data_bytes.substring(data_bias + 84, data_bias + 100)
- var PAGE_bytes = data_bytes.substring(data_bias + 100, data_bias + 102)
- var RNUM_bytes = data_bytes.substring(data_bias + 102, data_bias + 110)
- //解析校准值
- var data_Nums = tools.hexToNumArr(data_bytes)
- var Cal_Data = [[],[],[]]
- Cal_Data[0][0] = ((data_Nums[data_bias/2 + 56] >> 4) + data_Nums[data_bias/2 + 55]) / 10
- Cal_Data[0][1] = data_Nums[data_bias/2 + 57] + (data_Nums[data_bias/2 + 56] & 0x0F) * 256
- Cal_Data[1][0] = ((data_Nums[data_bias/2 + 59] >> 4) + data_Nums[data_bias/2 + 58]) / 10
- Cal_Data[1][1] = data_Nums[data_bias/2 + 60] + (data_Nums[data_bias/2 + 59] & 0x0F) * 256
- Cal_Data[2][0] = tools.hex2int((data_Nums[data_bias/2 + 62] >> 4) + tools.numArrToHex([data_Nums[data_bias/2 + 61]])) / 10
- Cal_Data[2][1] = data_Nums[data_bias/2 + 63] + (data_Nums[data_bias/2 + 62] & 0x0F) * 256
- //计算温度长度
- var record_number_int = tools.hex2int(RNUM_bytes)
- var record_data_size_int = Math.ceil(record_number_int * 11 / 8)
- var record_data_size_mod_int = record_data_size_int % 8
- if(record_data_size_mod_int){
- record_data_size_int = record_data_size_int + (8 - record_data_size_mod_int)
- }
- //读取数据
- const NDEF_MAX_INT = 4032
- var start_address_int = 78
- if ((start_address_int + record_data_size_int) > NDEF_MAX_INT){
- record_data_size_int = record_data_size_int - 8
- record_number_int = Math.floor(record_data_size_int * 8 / 11)
- }
- data_bytes = await this.ISO14443_4A_ReadBinary(0xA2, start_address_int, record_data_size_int, 56)
- data_bytes = tools.hexToNumArr(data_bytes)
- // 解析adc
- var tempture_data = []
- var repeat_cnt = Math.floor(record_number_int / 8)
- var count_residue = record_number_int % 8
- if (count_residue > 0)
- repeat_cnt += 1
- var decode_count = 0
- var temp = {}
- for(var i=0;i<repeat_cnt;i++){
- for(var j=0;j<8;j++){
- if(decode_count >= record_number_int)break;
- else decode_count += 1
- var adc_data_int = null
- if(j==0){
- adc_data_int = data_bytes[i * 11] * 256 + data_bytes[i * 11 + 1]
- adc_data_int = (adc_data_int & 0x0000FFE0) >> 5
- }else if(j==1){
- adc_data_int = data_bytes[i * 11 + 1] * 256 + data_bytes[i * 11 + 2]
- adc_data_int = (adc_data_int & 0x00001FFC) >> 2
- }else if(j==2){
- adc_data_int = data_bytes[i * 11 + 2] * 65536 + data_bytes[i * 11 + 3] * 256 + data_bytes[
- i * 11 + 4]
- adc_data_int = (adc_data_int & 0x0003FF80) >> 7
- }else if(j==3){
- adc_data_int = data_bytes[i * 11 + 4] * 256 + data_bytes[i * 11 + 5]
- adc_data_int = (adc_data_int & 0x00007FF0) >> 4
- }else if(j==4){
- adc_data_int = data_bytes[i * 11 + 5] * 256 + data_bytes[i * 11 + 6]
- adc_data_int = (adc_data_int & 0x00000FFE) >> 1
- }else if(j==5){
- adc_data_int = data_bytes[i * 11 + 6] * 65536 + data_bytes[i * 11 + 7] * 256 + data_bytes[
- i * 11 + 8]
- adc_data_int = (adc_data_int & 0x0001FFC0) >> 6
- }else if(j==6){
- adc_data_int = data_bytes[i * 11 + 8] * 256 + data_bytes[i * 11 + 9]
- adc_data_int = (adc_data_int & 0x000003FF8) >> 3
- }else if(j==7){
- adc_data_int = data_bytes[i * 11 + 9] * 256 + data_bytes[i * 11 + 10]
- adc_data_int = (adc_data_int & 0x000007FF) >> 0
- }
- adc_data_int = Math.floor(adc_data_int)
- temp = {}
- // 温度小于第二个校准点,使用第一个点和第二个点计算KB值
- var tempture1,adc1,tempture2,adc2
- if (adc_data_int < Cal_Data[1][1]){
- tempture1 = Cal_Data[0][0]
- adc1 = Cal_Data[0][1]
- tempture2 = Cal_Data[1][0]
- adc2 = Cal_Data[1][1]
- }else{
- tempture1 = Cal_Data[1][0]
- adc1 = Cal_Data[1][1]
- tempture2 = Cal_Data[2][0]
- adc2 = Cal_Data[2][1]
- }
- if ((adc1 - adc2) != 0){
- var k = (tempture1 - tempture2) / (adc1 - adc2)
- var b = tempture1 - (k * adc1)
- var tempture_float = k * adc_data_int + b
- temp['temp'] = Math.round(tempture_float*10)/10
- temp['adc'] = adc_data_int
- }else{
- temp['adc'] = adc_data_int
- }
- tempture_data.push(temp)
- }
- }
- return {
- "CID": CID_bytes,
- "TID": TID_bytes,
- "GTIN": GTIN_bytes,
- "VID": VID_bytes,
- "MID": MID_bytes,
- "MAC": MAC_bytes,
- "TRNG": TRNG_bytes,
- "PAGE": PAGE_bytes,
- "RUNM": RNUM_bytes,
- "CAL1": {
- "TEMP": Cal_Data[0][0],
- "ADC": Cal_Data[0][1]
- },
- "CAL2": {
- "TEMP": Cal_Data[1][0],
- "ADC": Cal_Data[1][1]
- },
- "CAL3": {
- "TEMP": Cal_Data[2][0],
- "ADC": Cal_Data[2][1]
- },
- 'tempture_data':tempture_data,
- "uid":uid,
- }
- },
- async read_uid(){
- await this.setApdu([0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xDA, 0x01])
- var data_bytes = await this.ISO14443_4A_ReadBinary(0xA2, 0, 80, 56)
- var data_bias = 24
- var uid = data_bytes.substr(data_bias,data_bias+52)
- return {uid,timeUsed:new Date().getTime() - this.techTime}
- },
- async read_fw(){
- var data_bytes = await this.ISO14443_4A_ReadBinary(0xA4, 8, 8, 8)
- if(data_bytes?.length == 16){
- //记录值
- var record_adc_int_list = [tools.hex2int(data_bytes.substr(0,4)),tools.hex2int(data_bytes.substr(4,4))]
- //当前值
- var current_adc_int_list = [tools.hex2int(data_bytes.substr(8,4)),tools.hex2int(data_bytes.substr(12,4))]
- if(this.data.debug)console.log('阻值为:',[record_adc_int_list,current_adc_int_list])
- if(current_adc_int_list[0] && current_adc_int_list[1]){
- if(record_adc_int_list[0] && record_adc_int_list[1]){
- var abs0 = Math.abs(current_adc_int_list[0]-record_adc_int_list[0]) < record_adc_int_list[0]*0.01
- var abs1 = Math.abs(current_adc_int_list[1]-record_adc_int_list[1]) < record_adc_int_list[0]*0.01
- if(abs0 && abs1){
- if(this.data.debug)console.log('标签验证通过')
- await this.setApdu([0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xDA, 0x01])
- var data_bytes = await this.ISO14443_4A_ReadBinary(0xA2, 0, 80, 56)
- var data_bias = 24
- var uid = data_bytes.substr(data_bias,data_bias+110)
- return {res:'ok',uid,timeUsed:new Date().getTime() - this.techTime}
- }else{
- if(this.data.debug)console.log('标签验证不通过')
- return {res:'no',uid:null,timeUsed:new Date().getTime() - this.techTime}
- }
- }else{
- if(this.data.debug)console.log('标签初始化')
- return {res:'init',uid:null,timeUsed:new Date().getTime() - this.techTime}
- }
- }else{
- if(this.data.debug)console.log('标签未放置到位,请重试')
- return {res:'retry',uid:null,timeUsed:new Date().getTime() - this.techTime}
- }
- }else{
- if(this.data.debug)console.log('读取结果异常,请重试')
- return {res:'retry',uid:null,timeUsed:new Date().getTime() - this.techTime}
- }
- },
- async write_data(write_bytes){
- if(!write_bytes){
- wx.showToast({
- title: '数据写入不能为空',
- })
- return {sta:0,msg:"写入不能为空",timeUsed:new Date().getTime() - this.techTime}
- }
- write_bytes = tools.str2NumArr(write_bytes)
- var len = write_bytes.length
- for(var i=0;i<(8-len%8);i++){
- write_bytes.push(255)
- }
- if(this.data.debug)console.log(write_bytes)
- var data_bytes = await this.COS_Write_Config(49316, write_bytes.length,write_bytes, 56)
- if(data_bytes.join('') == '1440'){
- return {sta:1,msg:"写入成功",timeUsed:new Date().getTime() - this.techTime}
- }else{
- return {sta:0,msg:"写入失败,请重试",timeUsed:new Date().getTime() - this.techTime}
- }
- },
- async read_data(){
- const maxData = 128
- var data_bytes = await this.COS_Read_Config(49316,maxData,56)
- var data_bytes = tools.hexToNumArr(data_bytes)
- var index = data_bytes.indexOf(255)
- index = index==-1?maxData:index
- data_bytes = data_bytes.slice(0,index)
- return {data:tools.numArrToBit(data_bytes),timeUsed:new Date().getTime() - this.techTime}
- },
- async read_interval(){
- var data_bytes = await this.COS_Read_Config(49213,16,16)
- console.log(data_bytes)
- data_bytes = data_bytes.substr(0,4)
- data_bytes = tools.hex2int(data_bytes)
- return {data:data_bytes,timeUsed:new Date().getTime() - this.techTime}
- },
- async write_interval(idel_num){
- var data_bytes = await this.COS_Read_Config(49213,16,16)
- idel_num = ("0000" + (parseInt(idel_num)).toString(16)).substr(-4)
- var write_bytes = idel_num+data_bytes.substr(4)
- write_bytes = tools.hexToNumArr(write_bytes)
- if(this.data.debug)console.log(write_bytes)
- var data_bytes = await this.COS_Write_Config(49213, 16,write_bytes, 16)
- if(data_bytes.join('') == '1440'){
- return {sta:1,msg:"写入成功",timeUsed:new Date().getTime() - this.techTime}
- }else{
- return {sta:0,msg:"写入失败,请重试",timeUsed:new Date().getTime() - this.techTime}
- }
- },
- async check_yy_status(){//检查有源标签状态
- var data_bytes = await this.COS_Read_Config(49162,8,8)
- var stateVal = tools.hexToNumArr(data_bytes)[0]
- if(stateVal){
- stateVal = tools.num2bin(stateVal) || []
- //0b11111000 py取下标为6
- if(stateVal[4] == '1'){
- // wx.showToast({title: '芯片已激活',})
- return {sta:1,msg:"设备已激活",timeUsed:new Date().getTime() - this.techTime}
- }
- if(stateVal[4] == '0'){
- // wx.showToast({title: '芯片未激活',})
- return {sta:0,msg:"设备已锁闭",timeUsed:new Date().getTime() - this.techTime}
- }
- return {sta:null,msg:"读取失败",timeUsed:new Date().getTime() - this.techTime}
- }else{
- return {sta:null,msg:"读取失败",timeUsed:new Date().getTime() - this.techTime}
- }
- },
- async active_yy(){
- //("NFC激活")
- var data_bytes = await this.COS_Write_Config(49162, 8,[0xFC, 0x03, 0x00, 0x0F, 0x20, 0x00, 0xF6, 0x00], 8)
- if(data_bytes.join('') == '1440'){
- //NFC操作成功,开始读取并修改page
- var data = await this.COS_Read_Config(49458,16,16)
- if(this.data.debug)console.log(data)
- if(data&&data.length ==32){
- data = tools.hexToNumArr(data)
- data[12] = 1
- data = tools.numArrToHex(data)
- data_bytes = await this.COS_Write_Config(49458, 16, data, 16)
- if(data_bytes.join('') == '1440'){
- // wx.showToast({title: 'NFC激活成功',})
- if(this.data.debug)console.log("设备已激活")
- return {sta:1,msg:"设备已激活",timeUsed:new Date().getTime() - this.techTime}
- }else{
- if(this.data.debug)console.log("激活失败,请重试!")
- // wx.showToast({title: 'NFC激活失败',})
- return {sta:null,msg:"激活失败,请重试!",timeUsed:new Date().getTime() - this.techTime}
- }
- }else{
- wx.showToast({title: '激活失败,请重试!',})
- return {sta:null,msg:"激活失败,请重试!",timeUsed:new Date().getTime() - this.techTime}
- }
- }else{
- wx.showToast({title: '激活失败,请重试!',})
- return {sta:null,msg:"激活失败,请重试!",timeUsed:new Date().getTime() - this.techTime}
- }
- },
- async close_yy(){
- //("NFC锁闭")
- var data_bytes = await this.COS_Write_Config(49162, 8,[0xF0, 0x03, 0x00, 0x0F, 0x20, 0x00, 0xF6, 0x00], 8)
- if(data_bytes.join('') == '1440'){
- //NFC操作成功,开始读取并修改page
- var data = await this.COS_Read_Config(49458,16,16)
- if(this.data.debug)console.log(data)
- if(data&&data.length ==32){
- data = tools.hexToNumArr(data)
- data[12] = 0
- data = tools.numArrToHex(data)
- data_bytes = await this.COS_Write_Config(49458, 16, data, 16)
- if(data_bytes.join('') == '1440'){
- wx.showToast({title: '设备锁闭成功',})
- return {sta:1,msg:"设备锁闭成功",timeUsed:new Date().getTime() - this.techTime}
- }else{
- wx.showToast({title: '设备锁闭失败,请重试!',})
- return {sta:null,msg:"设备锁闭失败,请重试!",timeUsed:new Date().getTime() - this.techTime}
- }
- }else{
- wx.showToast({title: '设备锁闭失败,请重试!',})
- return {sta:null,msg:"设备锁闭失败,请重试!",timeUsed:new Date().getTime() - this.techTime}
- }
- }else{
- wx.showToast({title: '设备锁闭失败,请重试!',})
- return {sta:null,msg:"设备锁闭失败,请重试!",timeUsed:new Date().getTime() - this.techTime}
- }
- },
- async COS_Write_Config(address_int, length_int, write_bytes, package_size){
- //选中CONFIG
- var data_bytes = await this.setApdu([0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xCF, 0x01])
- write_bytes = tools.numArrToHex(write_bytes)
- var data_write_bytes = tools.encode3des(write_bytes,this.des3Key)
- data_write_bytes = tools.hexToNumArr(data_write_bytes)
- data_bytes = await this.ISO14443_4A_UpdateBinary(0xA2, address_int, length_int, data_write_bytes, package_size)
- return new Promise(async (resolve)=>{
- resolve(data_bytes)
- })
- },
- async COS_Read_Config(address_int, length_int, package_size){
- //选中CONFIG
- var data_bytes = await this.setApdu([0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xCF, 0x01])
- data_bytes = await this.ISO14443_4A_ReadBinary(0xA2, address_int, length_int, package_size)
- return new Promise(async (resolve)=>{
- resolve(data_bytes)
- })
- },
- async ISO14443_4A_ReadBinary(cla_bytes, address_start_int, length_int, package_size_int){
- var data_read_bytes = []
- var des3_key_int_list = []
- var package_number_int = Math.floor(length_int / package_size_int)
- var package_bytes_left_int = length_int % package_size_int
- var i = 0
- //读取整包数据
- for(;i<package_number_int;i++){
- var data_address_int = address_start_int + i * package_size_int
- des3_key_int_list[0] = Math.floor(data_address_int / 256)
- des3_key_int_list[1] = data_address_int % 256
- var data_address_bytes = des3_key_int_list
- var rf_command_bytes = [cla_bytes,0xB0]
- rf_command_bytes = [...rf_command_bytes,...data_address_bytes,package_size_int]
- var data = await this.setApdu(rf_command_bytes)
- data.pop()
- data.pop()
- data_read_bytes.push(...data)
- }
- // i--
- // 读取剩余数据
- if(package_bytes_left_int != 0){
- // if(package_number_int!=0){
- // i = i + 1
- // }
- var data_address_int = address_start_int + i * package_size_int
- des3_key_int_list[0] = Math.floor(data_address_int / 256)
- des3_key_int_list[1] = data_address_int % 256
- var data_address_bytes = des3_key_int_list
- var rf_command_bytes = [cla_bytes,0xB0]
- rf_command_bytes = [...rf_command_bytes,...data_address_bytes,package_size_int]
- console.log(rf_command_bytes)
- var data = await this.setApdu(rf_command_bytes)
- data.pop()
- data.pop()
- data_read_bytes.push(...data)
- }
- var dataList = tools.numArrToHex(data_read_bytes)
- var strTemp = ""
- strTemp = tools.decode3des(dataList,this.des3Key)
- // for(var i=0;i<dataList.length;){
- // var temp = dataList.substr(i,16)
- // console.log("截取:"+i,temp)
- // var res = tools.decode3des(temp,this.des3Key)
- // console.log("解密:"+i,res)
- // strTemp = strTemp+res
- // i+=16
- // }
- return new Promise(async (resolve)=>{
- if(strTemp.length != dataList.length){wx.showToast({title: '解密失败',})}
- resolve(strTemp)
- })
- },
- async ISO14443_4A_UpdateBinary(cla_bytes,address_start_int, length_int, data_write_bytes, RF_PACKAGE_SIZE){
- var des3_key_int_list = []
- var package_size_int = RF_PACKAGE_SIZE
- var package_number_int = Math.floor(length_int / package_size_int)
- var package_bytes_left_int = length_int % package_size_int
- var i = 0
- var data_bytes = ''
- // 写整包数据
- for(;i<package_number_int;i++){
- var data_address_int = address_start_int + i * package_size_int
- des3_key_int_list[0] = Math.floor(data_address_int / 256)
- des3_key_int_list[1] = data_address_int % 256
- var data_address_bytes = des3_key_int_list//int_list2bytes(des3_key_int_list)
- var rf_command_bytes = [cla_bytes, 0xD6,...data_address_bytes,package_size_int,...data_write_bytes.slice(i * package_size_int,(i + 1) * package_size_int)]
- data_bytes = await this.setApdu(rf_command_bytes)
- await this.sleep(10)
- }
- // 写剩余数据
- if (package_bytes_left_int != 0){
- // if (package_number_int != 0){
- // i = i + 1
- // }
- var data_address_int = address_start_int + i * package_size_int
- des3_key_int_list[0] = Math.floor(data_address_int / 256)
- des3_key_int_list[1] = data_address_int % 256
- var data_address_bytes = des3_key_int_list//int_list2bytes(des3_key_int_list)
- var rf_command_bytes = [cla_bytes, 0xD6,...data_address_bytes,package_bytes_left_int,...data_write_bytes.slice(i * package_size_int,i * package_size_int+package_bytes_left_int)]
- data_bytes = await this.setApdu(rf_command_bytes)
- }
- return new Promise(async (resolve)=>{
- resolve(data_bytes)
- })
- },
- setApdu(arr){
- var that = this
- return new Promise((resolve, reject)=>{
- const nfcObj = that.nfcObj
- var key = new Uint8Array(arr).buffer
- nfcObj.transceive({
- data: key,
- success: res => {
- var hexData = tools.ab2NumArr(res.data)
- resolve(hexData)
- },
- fail:res=>{
- if(that.data.debug)console.log("transceive",res)
- reject(res)
- }
- })
- })
- },
- async x106_end(){
- //读温度
- var data = await this.read_yy()
- data = data.data_bytes
- //读自定义信息
- var str = await this.read_data()
- data.data = str.data
- //锁闭
- var data = await this.close_yy()
- //数据汇总返回
- return {data,timeUsed:new Date().getTime() - this.techTime}
- },
- async x106_start(config){
- //写入采温周期
- var time = config.split(";")[1]
- this.write_interval(time)
- //写自定义信息
- this.read_data(config)
- //激活
- var data = await this.active_yy()
- //数据汇总返回
- return {data,timeUsed:new Date().getTime() - this.techTime}
- },
- }
- })
|