前端 nfc读取扇区参数

背景: 由于各种厂商不同,有些厂商写卡有一下其他不支持的地方。所以由客户端读取扇区。网上参数很不详细,这边的经验希望能帮到大家。

  1. 前端-安卓读取
  2. 前端-sdk(我这边对接的是feishu,应该类似于小程序) 资料好难找,看网上只有部分小程序的,基本上都不符合。下面是我们这边已经实现的。注释里有代码说明
安卓读取扇区

这个对于前端来说就是纯方法的调用 直接上代码

//sassApp 代码基于vue
    connectWebViewJavascriptBridge(callback) {
      if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
      if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
      window.WVJBCallbacks = [callback];
      var WVJBIframe = document.createElement('iframe');
      WVJBIframe.style.display = 'none';
      WVJBIframe.src = 'https://__bridge_loaded__';
      document.documentElement.appendChild(WVJBIframe);
      setTimeout(function () { document.documentElement.removeChild(WVJBIframe) }, 0)
    },
	connectWebViewJavascriptBridgeNfc() {
	 	let that = this
	 	// 方法由按照提供
        that.connectWebViewJavascriptBridge((bridge) => {
      	   bridge.callHandler('triggerNewlandCard', (responseData) => {
           });
           bridge.registerHandler("receiveNFC", function (data, responseCallback) {
			  console.log("安卓读取扇区返回的data", data)
		   }
      }
	}
前端-SDK
let adapter = window.htonejssdk.nfc.getNFCAdapter();
adapter.startDiscovery({
    success(res) {
        adapter.onDiscovered(
            (res => {
                // 获取卡号uids
                const uidList = Array.from(new Uint8Array(res.uid));
                let mifareClassic = adapter.getMifareClassic()
                mifareClassic.connect({
                    success(res2) {
                        console.log('mifareClassic.transceive connect', res2)
                        // 0x60-认证指令   0x03-扇区   uidList-卡ids    0xff x 6-秘钥
                        mifareClassic.transceive({
                            data: new Uint8Array([0x60, 0x03, ...uidList, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]).buffer,
                            success(res3) {
                                // 0x30-读取指令 0x30-扇区(这里需要和认证扇区保持一致,不然会报错)
                                mifareClassic.transceive({
                                    data: new Uint8Array([0x30, 0x03]).buffer,
                                    success(res4) {
                                         let cardInfo = Array.from(new Uint8Array(res4.data));
                                         // 获取到卡的Array信息-转16进制(补0)---- 其他约定处理
                                    },
                                    fail(err4) {
                                        console.log(`mifareClassic.transceive fail 0x30: ${JSON.stringify(err4)}`)
                                    }
                                })
                            },
                            fail(err3) {
                                console.log(`mifareClassic.transceive fail 0x60: ${JSON.stringify(err3)}`)
                            }
                        })
                    },
                    fail(err) {
                        console.log(`mifareClassic.connect fail: ${JSON.stringify(res)}`)
                    }
                })
            )
        )
    }
})

你可能感兴趣的:(前端,安卓)