選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

NFCManagerTool.js 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. var config = require("./NFCConfig");
  2. var successCode = config.nfcSuccessCode();
  3. var errorCode = config.nfcErrorCode();
  4. var nfcAdapter = null;
  5. var isoDep = null;
  6. var isFirst = false;
  7. export function startScanNfcDevice(callBack) {
  8. isFirst = false;
  9. initNfcAdapter(function(res) {
  10. if (res.code == successCode) {
  11. console.log('初始化NFC适配器实例成功', res)
  12. //注册贴卡监听回调
  13. nfcAdapter.onDiscovered(function(res) {
  14. console.log('监听回调到卡片了', res);
  15. if (!isFirst) {
  16. if (res.techs.includes(nfcAdapter.tech.isoDep)) { //获取isoDep实例
  17. console.log('发现' + nfcAdapter.tech.isoDep + '卡');
  18. isoDep = nfcAdapter.getIsoDep();
  19. isFirst = true;
  20. callBack.call(this, {
  21. code: successCode,
  22. msg: "搜索卡片成功",
  23. data: isoDep
  24. })
  25. }
  26. }
  27. });
  28. //开始监听贴卡
  29. nfcAdapter.startDiscovery({
  30. success: function(res) {
  31. console.log('监听贴卡成功', res)
  32. },
  33. fail: function(err) {
  34. console.log('监听贴卡失败', err)
  35. var msg = "";
  36. if (err) {
  37. msg = nfcErrMsg(err.errCode)
  38. }
  39. callBack.call(this, {
  40. code: errorCode,
  41. msg: msg,
  42. data: null
  43. })
  44. },
  45. })
  46. } else {
  47. //初始化NFC实例失败
  48. callBack.call(this, res)
  49. }
  50. })
  51. };
  52. export function onDiscovered(callBack) {
  53. //注册贴卡监听回调
  54. nfcAdapter.onDiscovered(discoverHandler);
  55. }
  56. export function offDiscovered(callBack) {
  57. //注册贴卡监听回调
  58. nfcAdapter.offDiscovered(discoverHandler);
  59. }
  60. function discoverHandler(res, callBack) {
  61. if (res.techs.includes(nfcAdapter.tech.isoDep)) { //获取isoDep实例
  62. console.log('发现' + nfcAdapter.tech.isoDep + '卡');
  63. isoDep = nfcAdapter.getIsoDep();
  64. callBack.call(this, {
  65. code: successCode,
  66. msg: "搜索卡片成功",
  67. data: isoDep
  68. })
  69. }
  70. }
  71. export function startDiscovery(callBack) {
  72. //开始监听贴卡
  73. nfcAdapter.startDiscovery({
  74. success: function(res) {
  75. console.log('监听贴卡成功', res)
  76. },
  77. fail: function(err) {
  78. console.log('监听贴卡失败', err)
  79. var msg = "";
  80. if (err) {
  81. msg = nfcErrMsg(err.errCode)
  82. }
  83. callBack.call(this, {
  84. code: errorCode,
  85. msg: msg,
  86. data: null
  87. })
  88. }
  89. })
  90. }
  91. export function stopScanNfcDevice(callBack) {
  92. if (nfcAdapter != null) {
  93. nfcAdapter.stopDiscovery({
  94. success: function(res) {
  95. callBack.call(this, {
  96. code: successCode,
  97. msg: "停止扫描成功",
  98. data: null
  99. })
  100. },
  101. fail: function(err) {
  102. var msg = "";
  103. if (err) {
  104. msg = nfcErrMsg(err.errCode)
  105. }
  106. callBack.call(this, {
  107. code: errorCode,
  108. msg: msg,
  109. data: null
  110. })
  111. }
  112. })
  113. } else {
  114. callBack.call(this, {
  115. code: successCode,
  116. msg: "暂无NFC适配器实例",
  117. data: null
  118. })
  119. }
  120. };
  121. export function connectDevice(callBack) {
  122. if (isoDep != null) {
  123. isoDep.connect({
  124. success: function(res) {
  125. console.log('连接卡片成功', res)
  126. callBack.call(this, {
  127. code: successCode,
  128. msg: "连接卡片成功",
  129. data: null
  130. })
  131. },
  132. fail: function(err) {
  133. var msg = "";
  134. if (err) {
  135. msg = nfcErrMsg(err.errCode)
  136. }
  137. console.log("链接卡片失败:", err.errCode)
  138. callBack.call(this, {
  139. code: errorCode,
  140. msg: msg,
  141. data: null
  142. })
  143. }
  144. })
  145. } else {
  146. callBack.call(this, {
  147. code: errorCode,
  148. msg: "连接卡片不存在",
  149. data: null
  150. })
  151. }
  152. };
  153. export function disConnectDevice(callBack) {
  154. if (isoDep != null) {
  155. isoDep.close({
  156. success: function(res) {
  157. callBack.call(this, {
  158. code: successCode,
  159. msg: "断开卡片成功",
  160. data: null
  161. })
  162. },
  163. fail: function(err) {
  164. var msg = "";
  165. if (err) {
  166. msg = nfcErrMsg(err.errCode)
  167. }
  168. callBack.call(this, {
  169. code: errorCode,
  170. msg: msg,
  171. data: null
  172. })
  173. }
  174. })
  175. } else {
  176. callBack.call(this, {
  177. code: successCode,
  178. msg: "暂无连接卡片",
  179. data: null
  180. })
  181. }
  182. };
  183. export function sendMessageToDevice(cmdArr, callBack) {
  184. if (cmdArr.length <= 0) {
  185. callBack.call(this, {
  186. code: errorCode,
  187. msg: "发送数据不能为空",
  188. data: null
  189. })
  190. return
  191. }
  192. var resultCmdArr = [];
  193. for (var i = 0; i < cmdArr.length; i++) {
  194. var sendbuf = hexStringToArrayBuffer(cmdArr[i]);
  195. isoDep.transceive({
  196. data: sendbuf,
  197. success: function(res) {
  198. var resultCmd = arrayBufferToHexString(res.data);
  199. resultCmdArr.push(resultCmd);
  200. if (resultCmdArr.length == cmdArr.length) {
  201. callBack.call(this, {
  202. code: successCode,
  203. msg: "发送数据成功",
  204. data: resultCmdArr
  205. })
  206. }
  207. },
  208. fail: function(err) {
  209. if (i == 0) {
  210. console.log('发送数据失败', err);
  211. var msg = "";
  212. if (err) {
  213. msg = nfcErrMsg(err.errCode)
  214. }
  215. callBack.call(this, {
  216. code: errorCode,
  217. msg: msg,
  218. data: null
  219. })
  220. return
  221. }
  222. }
  223. });
  224. }
  225. };
  226. export function removeObj() {
  227. isoDep = null;
  228. nfcAdapter = null;
  229. }
  230. function initNfcAdapter(callBack) {
  231. nfcAdapter = wx.getNFCAdapter() //获取NFC适配器实例
  232. console.log("获取NFC适配器实例:", nfcAdapter);
  233. if (nfcAdapter != null) {
  234. callBack.call(this, {
  235. code: successCode,
  236. msg: "初始化NFC适配器实例成功",
  237. data: null
  238. })
  239. } else {
  240. callBack.call(this, {
  241. code: errorCode,
  242. msg: "初始化NFC适配器实例失败",
  243. data: null
  244. })
  245. }
  246. };
  247. //十六进制字符串转字节数组
  248. function hexStringToArrayBuffer(str) {
  249. var hex = str;
  250. return new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function(h) {
  251. return parseInt(h, 16)
  252. })).buffer;
  253. };
  254. //字节数组转十六进制字符串
  255. function arrayBufferToHexString(buffer) {
  256. return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' +
  257. x.toString(16)).slice(-2)).join('');
  258. };
  259. function nfcErrMsg(errCode) {
  260. switch (errCode) {
  261. case 0:
  262. return "正常";
  263. break;
  264. case 13000:
  265. return "设备不支持NFC";
  266. break;
  267. case 13001:
  268. return "系统NFC开关未打开";
  269. break;
  270. case 13010:
  271. return "未知错误";
  272. break;
  273. case 13019:
  274. return "用户未授权";
  275. break;
  276. case 13011:
  277. return "参数无效";
  278. break;
  279. case 13012:
  280. return "将参数解析为NdefMessage失败";
  281. break;
  282. case 13021:
  283. return "已经开始NFC扫描";
  284. break;
  285. case 13018:
  286. return "尝试在未开始NFC扫描时停止NFC扫描";
  287. break;
  288. case 13022:
  289. return "标签已经连接";
  290. break;
  291. case 13023:
  292. return "尝试在未连接标签时断开连接";
  293. break;
  294. case 13013:
  295. return "未扫描到NFC标签";
  296. break;
  297. case 13014:
  298. return "无效的标签技术";
  299. break;
  300. case 13015:
  301. return "从标签上获取对应技术失败";
  302. break;
  303. case 13024:
  304. return "当前标签技术不支持该功能";
  305. break
  306. case 13017:
  307. return "相关读写操作失败";
  308. break
  309. default:
  310. return "连接失败";
  311. break
  312. }
  313. }