From e491cdb48129752324c4e3764f99bd9203c56dec Mon Sep 17 00:00:00 2001
From: lgq <1015864684@qq.com>
Date: 星期二, 31 三月 2026 09:48:44 +0800
Subject: [PATCH] 1.新增VF205门禁机代码

---
 vf205_access/dxmodules/dxNfc.js |  409 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 409 insertions(+), 0 deletions(-)

diff --git a/vf205_access/dxmodules/dxNfc.js b/vf205_access/dxmodules/dxNfc.js
new file mode 100644
index 0000000..377c6c4
--- /dev/null
+++ b/vf205_access/dxmodules/dxNfc.js
@@ -0,0 +1,409 @@
+//build:20240715
+//閫氳繃杩欎釜缁勪欢鏉ヨ鍙栧崱锛屽寘鎷琈1鍗★紝psam鍗′箣绫荤殑
+//渚濊禆缁勪欢: dxDriver,dxMap,dxLogger,dxDriver,dxCommon,dxEventBus
+import { nfcClass } from './libvbar-p-dxnfc.so'
+import dxCommon from './dxCommon.js'
+import bus from './dxEventBus.js'
+import dxMap from './dxMap.js'
+const nfcObj = new nfcClass();
+const map = dxMap.get("default")
+const nfc = {}
+
+/**
+ * NFC 鍒濆鍖�
+ * @param {number} useEid 闈炲繀濉紝鏄惁浣跨敤浜戣瘉 0涓嶄娇鐢� 1浣跨敤
+ */
+nfc.init = function (useEid = 0) {
+	let pointer = nfcObj.init(useEid)
+	if (pointer === undefined || pointer === null) {
+		throw new Error("nfc.init: init failed")
+	}
+	dxCommon.handleId("nfc", 'nfcid', pointer)
+}
+
+/**
+ * NFC 鏅�氬崱娉ㄥ唽鍥炶皟
+ */
+nfc.cbRegister = function (callback) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	return nfcObj.cbRegister(pointer, "nfc_cb", 1, callback)
+}
+
+/**
+ * NFC PSAM鍗℃敞鍐屽洖璋�
+ */
+nfc.psamCbRegister = function (callback) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	return nfcObj.nfcPsamCheckVgcardCallback(pointer, callback)
+}
+
+/**
+ * NFC 鍙栨秷鍒濆鍖�
+ */
+nfc.deinit = function () {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	let ret = nfcObj.cbUnregister(pointer, "nfc_cb")
+	if (ret === false) {
+		throw new Error("nfc.cbUnregister: cbUnregister failed")
+	}
+	return nfcObj.deinit(pointer)
+}
+
+/**
+ * NFC 鍗′俊鎭垱寤�
+ * @param {number} cardType 鍗¤姱鐗囩被鍨�(鍘熷巶瀹氫箟)
+ * @param {ArrayBuffer} cardId 鍗″彿
+ * @param {number} type 鍗$被鍨�(鎴戜滑鑷繁瀹氫箟鐨�)
+ * @returns cardInfo(pointer)
+ */
+nfc.cardInfoCreate = function (cardType, cardId, type) {
+	if (!cardType) {
+		throw new Error("cardInfoCreate:cardType should not be null or empty")
+	}
+	if (!cardId) {
+		throw new Error("cardInfoCreate:cardId should not be null or empty")
+	}
+	if (!type) {
+		throw new Error("cardInfoCreate:type should not be null or empty")
+	}
+	return nfcObj.cardInfoCreate(cardType, cardId, type);
+}
+
+/**
+ * NFC 鍗′俊鎭攢姣�
+ * @param {pointer} cardInfo 鍗′俊鎭�
+ * @returns 
+ */
+nfc.cardInfoDestory = function (cardInfo) {
+	if (!cardInfo) {
+		throw new Error("cardInfoDestory:cardInfo should not be null or empty")
+	}
+	return nfcObj.cardInfoDestory(cardInfo);
+}
+
+/**
+ * NFC 鍗′俊鎭鍒�
+ * @param {pointer} cardInfo 鍗′俊鎭�
+ * @returns cardInfo(pointer)
+ */
+nfc.cardInfoCopy = function (cardInfo) {
+	if (cardInfo == null) {
+		throw new Error("cardInfoCopy:cardInfo should not be null or empty")
+	}
+	return nfcObj.cardInfoCopy(cardInfo);
+}
+
+/**
+ * NFC 鍒ゆ柇鏄惁鏈夊崱
+ * @returns bool
+ */
+nfc.isCardIn = function () {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	return nfcObj.isCardIn(pointer);
+}
+
+/**
+ * NFC 璇籑1鍗℃墖鍖�
+ * @param {number} taskFlg 浠诲姟鏍囧織锛�
+ *                    0x00->AUTO 鍛婄煡鎵爜鍣ㄨ鎸囦护鍙崟鐙墽琛岋紝鏃犳寚浠ら棿鐨勪緷璧栧叧绯汇��
+ *                    0x01->START 鍛婄煡鎵爜鍣ㄥ紑濮嬪鍗℃搷浣滄垨瀵瑰崱鎿嶄綔灏氭湭缁撴潫锛屼笖鎸囦护闂村彲鑳藉瓨鍦ㄤ緷璧栧叧绯汇��
+ *                    0x02->FINISH 鍛婄煡鎵爜鍣ㄦ湰鏉℃寚浠ゆ槸鎿嶄綔鍗$殑鏈�鍚庝竴鏉℃寚浠わ紝灏嗗崱鐗囨搷浣滅幆澧冩仮澶嶅埌榛樻�併��
+ * @param {number} secNum 鎵囧尯鍙�
+ * @param {number} logicBlkNum 鍧楀彿锛堝湪鎵囧尯鍐呯殑閫昏緫鍙�0~3)
+ * @param {number} blkNums 鍧楁暟
+ * @param {array} key 瀵嗛挜, 闀垮害6bytes
+ * @param {number} keyType 瀵嗛挜绫诲瀷: A:0x60 B:0x61
+ * @returns Array 璇诲彇缁撴灉 undefined:澶辫触
+ */
+nfc.m1cardReadSector = function (taskFlg, secNum, logicBlkNum, blkNums, key, keyType) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	_validate('m1cardReadSector', taskFlg, secNum, logicBlkNum, blkNums, key, keyType, ' ')
+	return nfcObj.m1cardReadSector(pointer, taskFlg, secNum, logicBlkNum, blkNums, key, keyType);
+}
+
+/**
+ * NFC 璇籑1鍗℃墖鍖�
+ * @param {number} taskFlg 浠诲姟鏍囧織锛�
+ *                    0x00->AUTO 鍛婄煡鎵爜鍣ㄨ鎸囦护鍙崟鐙墽琛岋紝鏃犳寚浠ら棿鐨勪緷璧栧叧绯汇��
+ *                    0x01->START 鍛婄煡鎵爜鍣ㄥ紑濮嬪鍗℃搷浣滄垨瀵瑰崱鎿嶄綔灏氭湭缁撴潫锛屼笖鎸囦护闂村彲鑳藉瓨鍦ㄤ緷璧栧叧绯汇��
+ *                    0x02->FINISH 鍛婄煡鎵爜鍣ㄦ湰鏉℃寚浠ゆ槸鎿嶄綔鍗$殑鏈�鍚庝竴鏉℃寚浠わ紝灏嗗崱鐗囨搷浣滅幆澧冩仮澶嶅埌榛樻�併��
+ * @param {number} secNum 鎵囧尯鍙�
+ * @param {number} logicBlkNum 鍧楀彿锛堝湪鎵囧尯鍐呯殑閫昏緫鍙�0~3)
+ * @param {number} blkNums 鍧楁暟
+ * @param {array} key 瀵嗛挜, 闀垮害6bytes
+ * @param {number} keyType 瀵嗛挜绫诲瀷: A:0x60 B:0x61
+ * @param {array} data 鍐欏叆鏁版嵁
+ * @returns int 鍐欏叆闀垮害 -1:閿欒
+ */
+nfc.m1cardWriteSector = function (taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	_validate('m1cardWriteSector', taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data)
+	return nfcObj.m1cardWriteSector(pointer, taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data);
+}
+
+/**
+ * 
+ * @param {number} taskFlg 浠诲姟鏍囧織锛�
+ *                    0x00->AUTO 鍛婄煡鎵爜鍣ㄨ鎸囦护鍙崟鐙墽琛岋紝鏃犳寚浠ら棿鐨勪緷璧栧叧绯汇��
+ *                    0x01->START 鍛婄煡鎵爜鍣ㄥ紑濮嬪鍗℃搷浣滄垨瀵瑰崱鎿嶄綔灏氭湭缁撴潫锛屼笖鎸囦护闂村彲鑳藉瓨鍦ㄤ緷璧栧叧绯汇��
+ *                    0x02->FINISH 鍛婄煡鎵爜鍣ㄦ湰鏉℃寚浠ゆ槸鎿嶄綔鍗$殑鏈�鍚庝竴鏉℃寚浠わ紝灏嗗崱鐗囨搷浣滅幆澧冩仮澶嶅埌榛樻�併��
+ * @param {number} blkNums 鍧楀彿
+ * @param {array} key 瀵嗛挜, 闀垮害6bytes
+ * @param {number} keyType 瀵嗛挜绫诲瀷: A:0x60 B:0x61
+ * @returns Array 璇诲彇缁撴灉 undefined:澶辫触
+ */
+nfc.m1cardReadBlk = function (taskFlg, blkNum, key, keyType) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	_validate('m1cardReadBlk', taskFlg, 1, 0, blkNum, key, keyType, ' ')
+	return nfcObj.m1cardReadBlk(pointer, taskFlg, blkNum, key, keyType);
+}
+
+/**
+ * 
+ * @param {number} taskFlg 浠诲姟鏍囧織锛�
+ *                    0x00->AUTO 鍛婄煡鎵爜鍣ㄨ鎸囦护鍙崟鐙墽琛岋紝鏃犳寚浠ら棿鐨勪緷璧栧叧绯汇��
+ *                    0x01->START 鍛婄煡鎵爜鍣ㄥ紑濮嬪鍗℃搷浣滄垨瀵瑰崱鎿嶄綔灏氭湭缁撴潫锛屼笖鎸囦护闂村彲鑳藉瓨鍦ㄤ緷璧栧叧绯汇��
+ *                    0x02->FINISH 鍛婄煡鎵爜鍣ㄦ湰鏉℃寚浠ゆ槸鎿嶄綔鍗$殑鏈�鍚庝竴鏉℃寚浠わ紝灏嗗崱鐗囨搷浣滅幆澧冩仮澶嶅埌榛樻�併��
+ * @param {number} blkNums 鍧楀彿
+ * @param {array} key 瀵嗛挜, 闀垮害6bytes
+ * @param {number} keyType 瀵嗛挜绫诲瀷: A:0x60 B:0x61
+ * @param {array} data 鍐欏叆鏁版嵁
+ * @returns int 鍐欏叆闀垮害 -1:閿欒
+ */
+nfc.m1cardWriteBlk = function (taskFlg, blkNum, key, keyType, data) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	_validate('m1cardWriteBlk', taskFlg, 1, 0, blkNum, key, keyType, data)
+	return nfcObj.m1cardWriteBlk(pointer, taskFlg, blkNum, key, keyType, data);
+}
+/**
+ * ATS妫�娴�
+ */
+nfc.nfc_iso14443_type_a_get_ats = function () {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	return nfcObj.nfc_iso14443_type_a_get_ats(pointer)
+}
+
+/**
+ * 
+ * @param {number} taskFlg 浠诲姟鏍囧織锛�
+ *                    0x00->AUTO 鍛婄煡鎵爜鍣ㄨ鎸囦护鍙崟鐙墽琛岋紝鏃犳寚浠ら棿鐨勪緷璧栧叧绯汇��
+ *                    0x01->START 鍛婄煡鎵爜鍣ㄥ紑濮嬪鍗℃搷浣滄垨瀵瑰崱鎿嶄綔灏氭湭缁撴潫锛屼笖鎸囦护闂村彲鑳藉瓨鍦ㄤ緷璧栧叧绯汇��
+ *                    0x02->FINISH 鍛婄煡鎵爜鍣ㄦ湰鏉℃寚浠ゆ槸鎿嶄綔鍗$殑鏈�鍚庝竴鏉℃寚浠わ紝灏嗗崱鐗囨搷浣滅幆澧冩仮澶嶅埌榛樻�併��
+ * @param {ArrayBuffer} buffer 	瑕佸彂閫佺殑鏁版嵁
+ * @param {number} bufferLen 	瑕佸彂閫佺殑鏁版嵁闀垮害
+ * @returns buffer
+ */
+nfc.iso14443Apdu = function (taskFlg, buffer, bufferLen) {
+	let pointer = dxCommon.handleId("nfc", "nfcid")
+	return nfcObj.iso14443Apdu(pointer, taskFlg, buffer, bufferLen);
+}
+
+/**
+ * PSAM鍗℃柇鐢�
+ */
+nfc.nfcPsamPowerDown = function () {
+	let pointer = dxCommon.handleId("nfc", "nfcid")
+	return nfcObj.nfcPsamPowerDown(pointer);
+}
+
+/**
+ * NFC 鏀瑰彉鐘舵��
+ */
+nfc.nfcPsamChangeBaud = function () {
+	let pointer = dxCommon.handleId("nfc", "nfcid")
+	return nfcObj.nfcPsamChangeBaud(pointer);
+}
+
+/**
+ * PSAM鍗¢噸缃�
+ */
+nfc.nfcPsamCardReset = function (force) {
+	let pointer = dxCommon.handleId("nfc", "nfcid")
+	return nfcObj.nfcPsamCardReset(pointer, force);
+}
+
+/**
+ * 鍙戦�丳SAM APDU鎸囦护
+ */
+nfc.nfcPsamCardApdu = function (buffer) {
+	let pointer = dxCommon.handleId("nfc", "nfcid")
+	return nfcObj.nfcPsamCardApdu(pointer, buffer);
+}
+
+/**
+ * EID 鏇存柊浜戣瘉閰嶇疆
+ * @param {object} eidConfig 浜戣瘉閰嶇疆		
+ * 		@param {string} eidConfig.appid 骞冲彴鍒嗛厤缁欏簲鐢ㄧ殑appid
+ * 		@param {number} eidConfig.read_len; // 鍗曟璇诲崱闀垮害锛岄粯璁�0x80
+ * 		@param {number} eidConfig.declevel; // 鏄惁璇诲彇鐓х墖锛�1涓轰笉璇诲彇锛�2涓鸿鍙�
+ * 		@param {number} eidConfig.loglevel; //鏃ュ織绾у埆锛屾敮鎸�0锛�1锛�2
+ * 		@param {number} eidConfig.model; // 鏄惁鐩存帴鏌ュ嚭淇℃伅 0鏄�  1鍚� 锛堝嵆0鏄師璺繑鍥烇紝杩斿洖韬唤淇℃伅锛�1鏄浆鍙戯紝杩斿洖reqid锛�
+ * 		@param {number} eidConfig.type; // 鍗$墖绫诲瀷锛�0 韬唤璇� 1鐢靛瓙璇佺収
+ * 		@param {number} eidConfig.pic_type; // 鐓х墖瑙g爜鏁版嵁绫诲瀷 0 wlt 1 jpg
+ * 		@param {number} eidConfig.envCode; // 鐜璇嗗埆鐮�
+ * 		@param {string} eidConfig.sn[128]; // 璁惧搴忓垪鍙�
+ * 		@param {string} eidConfig.device_model[128]; // 璁惧鍨嬪彿
+ * 		@param {number} eidConfig.info_type; // 淇℃伅杩斿洖绫诲瀷锛�0 韬唤淇℃伅缁撴瀯浣� 锛�1鍘熷鏁版嵁 char   
+ */
+nfc.eidUpdateConfig = function (eidConfig) {
+	if (eidConfig == null) {
+		throw new Error("eidUpdateConfig:eidConfig should not be null or empty")
+	}
+	return nfcObj.eidUpdateConfig(eidConfig);
+}
+
+/**
+ * 璇籒TAG鐗堟湰鍙�
+ * 	@param {number} 		hdl               	nfc鍙ユ焺
+ * 	@returns {ArrayBuffer} buffer
+ */
+nfc.nfcNtagReadVersion = function () {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	return nfcObj.nfcNtagReadVersion(pointer);
+}
+
+/**
+ * 璇籒TAG椤靛唴瀹� 鍥哄畾璇诲彇4椤靛叡16瀛楄妭
+ * 	@param {number} 		hdl               	nfc鍙ユ焺
+ * 	@param {number} 		pageNum           	璧峰椤靛湴鍧�锛�
+ *                             						姣忔璇诲彇鍥涗釜椤�
+ *                             						濡傛灉鍦板潃(Addr)鏄�04h锛屽垯杩斿洖椤�04h銆�05h銆�06h銆�07h鍐呭
+ * 	@returns {ArrayBuffer} buffer
+ */
+nfc.nfcNtagReadPage = function (pageNum) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	if (pageNum == null) {
+		throw new Error("nfcNtagReadPage:pageNum should not be null or empty")
+	}
+	return nfcObj.nfcNtagReadPage(pointer, pageNum);
+}
+
+/**
+ * 璇籒TAG澶氶〉鍐呭 璇诲彇鏁版嵁鐨刡uffer,鏈�灏忎负 椤垫暟*4锛涜璇诲彇鐨勬暟鎹暱搴� 椤垫暟*4
+ * 	@param {number} 		hdl               	nfc鍙ユ焺
+* 	@param {number} 		start_addr          璧峰椤靛湴鍧�
+ * 	@param {number} 		end_addr            缁撴潫椤靛湴鍧�         	
+ * 	@returns {ArrayBuffer} buffer
+ */
+nfc.nfcNtagFastReadPage = function (start_page, end_page) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	if (start_page == null) {
+		throw new Error("nfcNtagFastReadPage:start_page should not be null or empty")
+	}
+	if (end_page == null) {
+		throw new Error("nfcNtagFastReadPage:end_page should not be null or empty")
+	}
+	return nfcObj.nfcNtagFastReadPage(pointer, start_page, end_page);
+}
+
+/**
+ * 鍐橬TAG椤靛唴瀹�
+ * 	@param {number} 		hdl               	nfc鍙ユ焺
+ * 	@param {number} 		pageNum           	鍐欏叆鐨勯〉鍙� 锛氭湁鏁圓ddr鍙傛暟
+ *                              				瀵逛簬NTAG213锛岄〉鍦板潃02h鑷�2Ch
+ *                              				瀵逛簬NTAG215锛岄〉鍦板潃02h鑷�86h
+ *                              				瀵逛簬NTAG216锛岄〉鍦板潃02h鑷矱6h
+ * 	@param {ArrayBuffer} 	pageData         	鍐欏叆椤电殑鍐呭锛氬洓瀛楄妭
+ * 	@returns {boolean} ture/false
+ */
+nfc.nfcNtagWritePage = function (pageNum, pageData) {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	if (pageNum == null) {
+		throw new Error("nfcNtagWritePage:pageNum should not be null or empty")
+	}
+	if (!pageData) {
+		throw new Error("nfcNtagWritePage:pageData should not be null or empty")
+	}
+	return nfcObj.nfcNtagWritePage(pointer, pageNum, pageData);
+}
+
+/**
+ * 鍒ゆ柇nfc娑堟伅闃熷垪鏄惁涓虹┖
+ * @returns bool
+ */
+nfc.msgIsEmpty = function () {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	return nfcObj.msgIsEmpty(pointer)
+}
+
+/**
+ * 浠巒fc娑堟伅闃熷垪涓鍙栨暟鎹�
+ * @returns json娑堟伅瀵硅薄
+ */
+nfc.msgReceive = function () {
+	let pointer = dxCommon.handleId("nfc", 'nfcid')
+	let msg = nfcObj.msgReceive(pointer)
+	return JSON.parse(msg);
+}
+
+function _validate(fun, taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data) {
+	if (![0x00, 0x01, 0x02].includes(taskFlg)) {
+		throw new Error(fun, ":taskFlg error")
+	}
+	if (!(secNum >= 0)) {
+		throw new Error(fun, ":secNum error")
+	}
+	if (logicBlkNum == null || logicBlkNum == undefined || logicBlkNum < 0 || logicBlkNum > 3) {
+		throw new Error(fun, ":logicBlkNum error")
+	}
+	if (blkNums == null || blkNums == undefined || blkNums < 0 || blkNums > 59) {
+		throw new Error(fun, ":blkNums error")
+	}
+	if (key == null || key === undefined || key.length < 0) {
+		throw new Error(fun, ":key error")
+	}
+	if (![0x60, 0x61].includes(keyType)) {
+		throw new Error(fun, ":keyType error")
+	}
+	if (data === null || data === undefined) {
+		throw new Error(fun, ":data error")
+	}
+}
+
+nfc.RECEIVE_MSG = '__nfc__MsgReceive'
+
+/**
+ * 绠�鍖朜FC缁勪欢鐨勪娇鐢紝鏃犻渶杞鍘昏幏鍙栫綉缁滅姸鎬侊紝缃戠粶鐨勭姸鎬佷細閫氳繃eventcenter鍙戦�佸嚭鍘�
+ * run 鍙細鎵ц涓�娆★紝鎵ц涔嬪悗缃戠粶鍩烘湰閰嶇疆涓嶈兘淇敼
+ * 濡傛灉闇�瑕佸疄鏃惰幏鍙栧埛鍗℃暟鎹紝鍙互璁㈤槄 eventCenter鐨勪簨浠讹紝浜嬩欢鐨則opic鏄痭fc.CARD锛屼簨浠剁殑鍐呭鏄被浼�
+ * {id:'鍗d',card_type:鍗¤姱鐗囩被鍨�,id_len:鍗″彿闀垮害,type锛氬崱绫诲瀷,timestamp:'鍒峰崱鏃堕棿鎴�',monotonic_timestamp:'鐩稿寮�鏈虹殑鏃堕棿'}
+ * @param {*} options 
+ * 		@param {boolean} options.m1 闈炲繀濉紝鏅�氬崱鍥炶皟寮�鍏�
+ * 		@param {boolean} options.psam 闈炲繀濉紝psam鍗″洖璋冨紑鍏�
+ */
+nfc.run = function (options) {
+	if (options === undefined || options.length === 0) {
+		throw new Error("dxnfc.run:'options' parameter should not be null or empty")
+	}
+	let init = map.get("__nfc__run_init")
+	if (!init) {//纭繚鍙垵濮嬪寲涓�娆�
+		map.put("__nfc__run_init", options)
+		bus.newWorker("__nfc", '/app/code/dxmodules/nfcWorker.js')
+	}
+}
+
+/**
+ * 濡傛灉nfc鍗曠嫭涓�涓嚎绋嬶紝鍙互鐩存帴浣跨敤run鍑芥暟锛屼細鑷姩鍚姩涓�涓嚎绋嬶紝
+ * 濡傛灉鎯冲姞鍏ュ埌鍏朵粬宸叉湁鐨勭嚎绋嬶紝鍙互浣跨敤浠ヤ笅灏佽鐨勫嚱鏁�
+ */
+nfc.worker = {
+	//鍦╳hile寰幆鍓�
+	beforeLoop: function (options) {
+		nfc.init(options.useEid)
+		// PSAM鍜屾櫘閫氬崱鍥炶皟
+		if (options.m1) {
+			nfc.cbRegister()
+		}
+		if (options.psam) {
+			nfc.psamCbRegister()
+		}
+	},
+	//鍦╳hile寰幆閲�
+	loop: function () {
+		if (!nfc.msgIsEmpty()) {
+			let res = nfc.msgReceive();
+			bus.fire(nfc.RECEIVE_MSG, res)
+		}
+	}
+}
+export default nfc;

--
Gitblit v1.9.3