小程序调用NFC与IC卡通信(跑通未整理)

1,707 阅读1分钟

小程序官方文档  

developers.weixin.qq.com/miniprogram…

基本流程

以往NFC-A卡片写入apdu指令为例

  • 调用wx.getNFCAdapter()获取NFC适配器实例
  • 调用NFCAdapter.onDiscovered(function callback)注册贴卡监听回调
  • 调用NFCAdapter.startDiscovery(Object object)开始监听贴卡
  • 贴卡,onDiscovered回调
    • 根据onDiscovered回调res对象的techs字段匹配到卡片支持NFC-A标准
    • 通过NFCAdapter.getNfcA()获取NfcA实例
  • 使用NfcA实例进行读写
    • 调用NfcA.connect()和NFC卡片建立连接
    • 调用NfcA.transceive(Object object)往NFC卡片写入apdu指令并接收卡片返回数据
    • 读写完毕,调用NfcA.close()断开连接
  • 调用NFCAdapter.stopDiscovery(Object object)结束监听贴卡  

apdu指令大全

wenku.baidu.com/view/ceb843…

好像是不久之前才有的新特性 ,官方demo跑不通,网上没源码  ,自己整理了能跑通的   但是获取到的是个arraybuffer   ,不知道怎么解读 ,下面是源码

//文档地址
//https://developers.weixin.qq.com/miniprogram/dev/framework/device/nfc.html
//代码:
//#ifdef  MP-WEIXIN
NFCReadCard: function() {
	let _this = this
	let adapter = wx.getNFCAdapter()
	console.log(adapter)
	adapter.startDiscovery({
		success: (e) => {
			console.log('开始贴卡了', e)
			adapter.onDiscovered(function(res) {
				console.log('读到卡片了', res);
				//console.log(res.techs);
				
				//首先将字符串转为16进制   这里发送APDU指令
				// let str = 'GET CHALLENGE'
				// let val = ""
				// for (let i = 0; i < str.length; i++) {
				//   if (val === '') {
				// 	val = str.charCodeAt(i).toString(16)
				//   } else {
				// 	val += ',' + str.charCodeAt(i).toString(16)
				//   }
				// }
				// //将16进制转化为ArrayBuffer
				// let arrbuf =  new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
				//   return parseInt(h, 16)
				// })).buffer;
				let arrbuf = _this.strToArrayBuffer('GET DATA')   //字符串转ArrayBuffer  发送IC卡adpu指令   详情百度IC卡adpu
				//let arrbuf = res.id
				if (res.techs.includes(adapter.tech.nfcA)) {
					console.log('发现' + adapter.tech.nfcA + '卡');
					let nfcA = adapter.getNfcA();

					//app.nfcA = nfcA;
					nfcA.connect({
						success: function(resA) {
							console.log('设备已连接A', resA)
							nfcA.transceive({
								data: arrbuf,
								success: function(resAA) {
									console.log('发送数据成功A, 接收数据如下:', resAA);
									console.log(_this.arrayBuffertoStr(resAA.data))
									debugger
								},
								fail: function(errAA) {
									console.log('发送数据失败A', errAA);
								}
							})
						},
						fail: function(errA) {
							console.log('设备联接错误A', errA);
						}
					});
				}
			})
		}
	})
},
//#endif