Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

kcDataInteract.js 10KB

pirms 1 gada
pirms 4 dienas
pirms 1 gada
pirms 4 dienas
pirms 1 gada
pirms 4 dienas
pirms 1 gada
pirms 4 dienas
pirms 1 gada
pirms 4 dienas
pirms 1 gada
pirms 4 dienas
pirms 1 gada
pirms 4 dienas
pirms 1 gada
pirms 4 dienas
pirms 1 gada
pirms 4 dienas
pirms 1 gada
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. "use strict";
  2. var _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {
  3. return typeof e
  4. }
  5. : function (e) {
  6. return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e
  7. }
  8. , _kcService = require("./kcService.js")
  9. , _kcService2 = _interopRequireDefault(_kcService)
  10. , _kcUtils = require("./kcUtils.js")
  11. , _kcUtils2 = _interopRequireDefault(_kcUtils)
  12. , _kcDataDecode = require("./kcDataDecode.js")
  13. , _kcDataDecode2 = _interopRequireDefault(_kcDataDecode);
  14. function _interopRequireDefault(e) {
  15. return e && e.__esModule ? e : {
  16. default: e
  17. }
  18. }
  19. var TAG_FUNCTION = "function"
  20. , sendCallback = void 0
  21. , TimerID = null;
  22. function _StartSendData(o, e) {
  23. var s = {}
  24. , u = 0
  25. , c = 0;
  26. null != TimerID && (clearTimeout(TimerID),
  27. TimerID = null),
  28. _kcDataDecode2.default.init(),
  29. TimerID = setTimeout(pro_timeout, 10000),
  30. console.log(TimerID, "开启时钟"),
  31. sendCallback = e,
  32. _kcService2.default._SetDataListenerCallBack(!0, datacallback),
  33. function t() {
  34. var e = "";
  35. 40 * c >= o[u].length && (u++,
  36. c = 0);
  37. u < o.length && (e = o[u].length >= 40 * (c + 1) ? o[u].substring(40 * c, 40 * (c + 1)) : o[u].substring(40 * c, o[u].length));
  38. if ("" == e)
  39. console.log("数据发送完毕!");
  40. else {
  41. for (var a = _kcUtils2.default.hexStr2byteArray(e), l = new ArrayBuffer(a.byteLength), r = new DataView(l), i = 0; i < a.byteLength; i++)
  42. r.setUint8(i, a[i]);
  43. console.log("发送数据:", e),
  44. _kcService2.default._writeBLECharacteristicValue(l, function (e) {
  45. 0 == e.serviceCode ? (c++,
  46. t()) : (console.error(TimerID, "数据发送失败,取消时钟"),
  47. null != TimerID && (clearTimeout(TimerID),
  48. TimerID = null),
  49. _kcService2.default._SetDataListenerCallBack(!1),
  50. s.serviceCode = -2,
  51. s.serviceInfo = "数据发送失败",
  52. (void 0 === sendCallback ? "undefined" : _typeof(sendCallback)) == TAG_FUNCTION && sendCallback(s))
  53. })
  54. }
  55. }()
  56. }
  57. function datacallback(e) {
  58. _kcService2.default._SetDataListenerCallBack(!0, datacallback),
  59. _ReceiveData(e)
  60. }
  61. function pro_timeout() {
  62. var e = {};
  63. console.error(TimerID, "数据接收超时,取消时钟"),
  64. null != TimerID && (clearTimeout(TimerID),
  65. TimerID = null),
  66. _kcService2.default._SetDataListenerCallBack(!1),
  67. e.serviceCode = -3,
  68. e.serviceInfo = "数据接收超时",
  69. (void 0 === sendCallback ? "undefined" : _typeof(sendCallback)) == TAG_FUNCTION && sendCallback(e)
  70. }
  71. function _ReceiveData(receivedData) {
  72. // 获取协议类型并解码数据
  73. const protocolType = _kcUtils2.default.getProtocolType();
  74. let decodedData = {};
  75. // 根据协议类型解码数据
  76. if (protocolType === 0) {
  77. decodedData = _kcDataDecode2.default.decode_GB(receivedData); // 国标协议解码
  78. } else if (protocolType === 1) {
  79. decodedData = _kcDataDecode2.default.decode_WX(receivedData); // 微信协议解码
  80. }
  81. // 处理解码结果
  82. if (decodedData.serviceCode === 0) {
  83. try {
  84. // 解析业务数据并处理
  85. const parsedData = PackageDecode(decodedData.serviceData.strData);
  86. // 统一清理资源
  87. cleanupResources();
  88. // 构造标准响应格式
  89. const response = {
  90. serviceCode: parsedData.serviceCode,
  91. serviceInfo: parsedData.serviceInfo,
  92. serviceData: parsedData.serviceData
  93. };
  94. // 触发回调
  95. triggerCallback(response);
  96. } catch (error) {
  97. handleParseError(error);
  98. }
  99. }
  100. }
  101. // 辅助函数:资源清理
  102. function cleanupResources() {
  103. if (TimerID) {
  104. clearTimeout(TimerID);
  105. TimerID = null;
  106. }
  107. _kcService2.default._SetDataListenerCallBack(false);
  108. }
  109. // 辅助函数:触发回调
  110. function triggerCallback(response) {
  111. if (typeof sendCallback === "function") {
  112. sendCallback(response);
  113. }
  114. }
  115. // 辅助函数:处理解析异常
  116. function handleParseError(error) {
  117. console.error("PackageDecode 异常:", error);
  118. const errorResponse = {
  119. serviceCode: -99,
  120. serviceInfo: "业务数据解析异常",
  121. serviceData: {}
  122. };
  123. cleanupResources();
  124. triggerCallback(errorResponse);
  125. }
  126. function PackageDecode(hexData) {
  127. let responseData = {
  128. serviceCode: 0,
  129. serviceInfo: "数据接收成功",
  130. serviceData: {}
  131. };
  132. try {
  133. const byteArray = _kcUtils2.default.hexStr2byteArray(hexData);
  134. const operationType = byteArray[0];
  135. console.log("kcPackageDecode:", hexData);
  136. console.log("操作类型", operationType);
  137. // 根据操作类型分发处理
  138. switch (operationType) {
  139. case 0xB3:
  140. case 0xBC:
  141. handleB3BCCommand(byteArray, responseData);
  142. break;
  143. case 0xB5:
  144. // 处理 181 类型 优化后的双字节小端解析方案
  145. handleB5Command(byteArray, responseData);
  146. break;
  147. case 0xBE:
  148. // 处理 190 类型
  149. responseData.serviceData.dataBuff = hexData.slice(-2);
  150. break;
  151. case 0xF7:
  152. handleF7Command(byteArray, responseData);
  153. break;
  154. case 0x92:
  155. case 0xB0:
  156. case 0xB4:
  157. handleCommonCommands(byteArray, responseData);
  158. break;
  159. case 0x90:
  160. case 0x91:
  161. case 0x94:
  162. // 处理 145, 148, 144 类型
  163. let dataLength = (255 & byteArray[3]) << 8;
  164. dataLength += byteArray[2];
  165. responseData.serviceData.dataBuff = extractData(byteArray, 4, dataLength);
  166. console.log("有效数据长度:", dataLength, response.serviceData.dataBuff);
  167. break;
  168. default:
  169. throw new Error(`未知操作类型: 0x${operationType.toString(16)}`);
  170. }
  171. return responseData;
  172. } catch (error) {
  173. console.error("PackageDecode 核心异常:", error);
  174. return {
  175. serviceCode: -99,
  176. serviceInfo: "业务数据解析异常",
  177. serviceData: {}
  178. };
  179. }
  180. }
  181. function handleCommonCommands(byteArray, response) {
  182. const resultCode = byteArray[1];
  183. if (resultCode !== 0) {
  184. console.error(`结果码异常: 0x${resultCode.toString(16)}`);
  185. throw new Error(`结果码异常: 0x${resultCode.toString(16)}`);
  186. }
  187. parseVariableLengthData(byteArray, response);
  188. }
  189. // 子处理器:通用指令(0xB3/0xBC)
  190. function handleB3BCCommand(byteArray, response) {
  191. const resultCode = byteArray[1];
  192. if (resultCode !== 0) {
  193. response.serviceCode = -5; // 按照黔通的要求,这个返回值有特殊含义。
  194. console.warn(`结果码错误: 0x${resultCode.toString(16)}`);
  195. if (byteArray.length <= 5) {
  196. response.serviceCode = -6; // 按照黔通的要求,这个返回值有特殊含义。
  197. console.error("kc指令响应报文长度异常");
  198. throw new Error(`指令响应报文长度异常: ${byteArray.length}`);
  199. }
  200. }
  201. parseVariableLengthData(byteArray, response);
  202. }
  203. // 子处理器:双字节长度指令(0xB5)
  204. function handleB5Command(byteArray, response) {
  205. try {
  206. const lengthOffset = 2;
  207. const hasEnoughBytes = byteArray.length >= lengthOffset + 2;
  208. if (!hasEnoughBytes) {
  209. throw new Error("数据长度不足,无法读取双字节指令长度");
  210. }
  211. // 小端法解析(低字节在前)
  212. const lowByte = byteArray[lengthOffset] & 0xFF; // 低字节
  213. const highByte = byteArray[lengthOffset + 1] & 0xFF; // 高字节
  214. let instructionLength = (highByte << 8) | lowByte;
  215. // 长度有效性验证
  216. if (instructionLength > byteArray.length - lengthOffset - 2) {
  217. console.warn("双字节指令长度超出数据范围,回退单字节模式");
  218. throw new RangeError("指令长度溢出");
  219. }
  220. // 正常处理流程
  221. const dataSlice = byteArray.slice(lengthOffset + 2, lengthOffset + 2 + instructionLength);
  222. console.log("kc有效数据长度(双字节):", instructionLength);
  223. response.serviceData.dataBuff = _kcUtils2.default.byteArray2hexStr(dataSlice);
  224. } catch (error) {
  225. if (error instanceof RangeError) {
  226. // 回退到单字节模式
  227. const singleByteLength = byteArray[2] & 0xFF;
  228. const fallbackData = byteArray.slice(3, 3 + singleByteLength);
  229. console.log("kc有效数据长度(单字节):", singleByteLength);
  230. response.serviceData.dataBuff = _kcUtils2.default.byteArray2hexStr(fallbackData);
  231. } else {
  232. // 重新抛出非RangeError异常
  233. throw error;
  234. }
  235. }
  236. }
  237. // 子处理器:F7类型指令
  238. function handleF7Command(byteArray, response) {
  239. const status = byteArray[1];
  240. if (status !== 0) {
  241. throw new Error(`F7指令状态错误: ${status}`);
  242. }
  243. const length = byteArray[2];
  244. const dataSlice = byteArray.slice(3, 3 + length);
  245. response.serviceData.dataBuff = _kcUtils2.default.byteArray2hexStr(dataSlice);
  246. }
  247. // 通用可变长度数据解析
  248. function parseVariableLengthData(byteArray, response) {
  249. const dataType = _kcUtils2.default.getDATA_TYPE();
  250. if (dataType === 0) {
  251. // GB协议解析逻辑
  252. parseGBProtocol(byteArray, response);
  253. } else if (dataType === 1) {
  254. // WX协议解析逻辑
  255. parseWXProtocol(byteArray, response);
  256. } else {
  257. throw new Error(`未知DATA_TYPE: ${dataType}`);
  258. }
  259. }
  260. // 统一数据提取逻辑
  261. function extractData(byteArray, start, length) {
  262. const end = start + length;
  263. return _kcUtils2.default.byteArray2hexStr(byteArray.slice(start, end));
  264. }
  265. // 子处理器:GB协议解析
  266. function parseGBProtocol(byteArray, response) {
  267. // 初始偏移量为 7
  268. let dataStart = 7;
  269. let dataLength = 0;
  270. // 根据字节数组特定位置的值,计算有效数据长度 l
  271. if (129 == byteArray[5]) {
  272. if (129 == byteArray[6]) {
  273. dataLength = 255 & byteArray[7];
  274. dataStart += 1;
  275. } else if (130 == byteArray[6]) {
  276. dataLength = byteArray[7] << 8;
  277. dataLength += 255 & byteArray[8];
  278. dataStart += 2;
  279. } else {
  280. dataLength = 255 & byteArray[6];
  281. }
  282. }
  283. // 从字节数组中提取有效数据
  284. const dataEnd = dataStart + dataLength;
  285. response.serviceData.dataBuff = _kcUtils2.default.byteArray2hexStr(byteArray.slice(dataStart, dataEnd));
  286. }
  287. // 子处理器:WX协议解析
  288. function parseWXProtocol(byteArray, response) {
  289. const apduData = byteArray.slice(5);
  290. const tpduData = _kcUtils2.default.APDU2TPDU(
  291. _kcUtils2.default.byteArray2hexStr(apduData)
  292. );
  293. response.serviceData.dataBuff = tpduData;
  294. }
  295. module.exports = {
  296. _StartSendData: _StartSendData,
  297. _ReceiveData: _ReceiveData
  298. };