LSCabinetTool.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. const common = require('../../../common.js'); //确认信息
  2. function confirmCommand(data, serialNum, key) {
  3. //标志体
  4. var toBody = confirmBody(serialNum, key); //标志头
  5. var toHead = [0x7a, toBody.length + 2].concat(data); //标志尾
  6. var toFoot = getMarkFoot(toBody, data);
  7. var body = toHead.concat(toBody).concat(toFoot);
  8. return body;
  9. }
  10. function togetherCommand(data, device) {
  11. console.log('设备信息');
  12. console.log(device); //标志体
  13. var toBody = []; //下发换电
  14. if (data[0] === 0x01 && data[1] === 0x01) {
  15. toBody = loadToMsgBody(device);
  16. }
  17. if (data[0] === 0x02 && data[1] === 0x01) {
  18. toBody = loadToMsgBody2(device);
  19. }
  20. if (data[0] === 0x03 && data[1] === 0x01) {
  21. toBody = loadToMsgBody3(device);
  22. } //标志头
  23. var toHead = [0x7a, toBody.length + 2].concat(data); //标志尾
  24. var toFoot = getMarkFoot(toBody, data);
  25. var body = toHead.concat(toBody).concat(toFoot);
  26. console.log('下发的机柜指令--');
  27. console.log(body);
  28. return body;
  29. } //标志尾
  30. function getMarkFoot(toBody, hexList) {
  31. var total = 0;
  32. for (var i = 0; toBody.length > i; i++) {
  33. total += toBody[i];
  34. }
  35. for (var i = 0; hexList.length > i; i++) {
  36. total += hexList[i];
  37. }
  38. total = toBody.length + 2 + total;
  39. var toFoot = [total & 0x00ff, 0x78];
  40. return toFoot;
  41. } //标志体-确认
  42. function confirmBody(serialNum, key) {
  43. var serialLen = 0;
  44. var serialNo = 0;
  45. if (serialNum !== '0') {
  46. //序列号长度
  47. var serialLen = serialNum.length; //序列号
  48. var serialNo = common.getASCIICode(serialNum);
  49. }
  50. var keyList = keyHex(key); //密钥长度 密钥索引 密钥值
  51. var toBody;
  52. if (serialNum !== '0') {
  53. toBody = contactList([[serialLen], serialNo]).concat(keyList);
  54. } else {
  55. toBody = [serialLen].concat(keyList);
  56. } //拼接
  57. return toBody;
  58. } //换电标志体
  59. function loadToMsgBody(device) {
  60. //空仓门编号
  61. var empityBoxNo = parseInt(device.empityBoxNo, 16); //满仓门编号
  62. var fullBoxNo = parseInt(device.fullBoxNo, 16);
  63. var boxNo = [empityBoxNo].concat([fullBoxNo]); //电池编号长度
  64. var batteryNoLen = device.battertNum.length; //电池编号
  65. var batteryNo = common.getASCIICode(device.battertNum); //订单号长度
  66. var orderNoLen = device.orderNo.length; //订单号
  67. var orderNo = common.getASCIICode(device.orderNo); //序列号长度
  68. var serialLen = device.serialNum.length; //序列号
  69. var serialNo = common.getASCIICode(device.serialNum); //得到密钥
  70. var keyList = keyHex(device.key);
  71. var toBody = contactList([boxNo, [batteryNoLen], batteryNo, [orderNoLen], orderNo, [serialLen], serialNo]).concat(keyList);
  72. return toBody;
  73. } //租电标志体
  74. function loadToMsgBody2(device) {
  75. //空仓门编号
  76. var boxNo = parseInt(device.boxNo, 16); //序列号长度
  77. var serialLen = device.serialNum.length; //序列号
  78. var serialNo = common.getASCIICode(device.serialNum); //订单号长度
  79. var orderNoLen = device.orderNo.length; //订单号
  80. var orderNo = common.getASCIICode(device.orderNo); //得到密钥
  81. var keyList = keyHex(device.key);
  82. var toBody = contactList([[boxNo], [serialLen], serialNo, [orderNoLen], orderNo]).concat(keyList);
  83. return toBody;
  84. } //还电标志体
  85. function loadToMsgBody3(device) {
  86. //还电仓门编号
  87. var boxNo = parseInt(device.boxNo, 16); //电池编号长度
  88. var batteryNoLen = device.battertNum.length; //电池编号
  89. var batteryNo = common.getASCIICode(device.battertNum); //序列号长度
  90. var serialLen = device.serialNum.length; //序列号
  91. var serialNo = common.getASCIICode(device.serialNum); //订单号长度
  92. var orderNoLen = device.orderNo.length; //订单号
  93. var orderNo = common.getASCIICode(device.orderNo); //得到密钥
  94. var keyList = keyHex(device.key);
  95. console.log(keyList);
  96. var toBody = contactList([[boxNo], [batteryNoLen], batteryNo, [serialLen], serialNo, [orderNoLen], orderNo]).concat(keyList);
  97. return toBody;
  98. } //生成密钥
  99. function keyHex(key) {
  100. //密钥索引
  101. var keyIndexHex = '00000002'; //由于随机太长导致机柜出现bug暂用00000002
  102. var keyIndex = hexToList(keyIndexHex); //密钥值
  103. var binaryKeyIndex = binaryArray(parseInt(keyIndexHex, 16));
  104. var keyValue = getEncryptionKey(binaryKeyIndex, key);
  105. var keyValueASCII = common.getASCIICode(keyValue); //秘钥验证数据长度
  106. var keyVerifyLen = 4 + keyValue.length; //密钥索引4字节+秘钥值长度
  107. return contactList([[keyVerifyLen], keyIndex, keyValueASCII]);
  108. } //获取32位2进制数据
  109. function binaryArray(b) {
  110. var array = [];
  111. for (var i = 31; i >= 0; i--) {
  112. array[i] = b & 1;
  113. b = b >> 1;
  114. }
  115. return array;
  116. } //随机8位16进制
  117. function randomHexNumber() {
  118. var result = '';
  119. for (var i = 0; i < 8; i++) {
  120. result += Math.floor(Math.random() * 16).toString(16); //获取0-15并通过toString转16进制
  121. }
  122. var str = result.toUpperCase();
  123. return str;
  124. }
  125. function hexToList(str) {
  126. var val = [];
  127. for (var i = 0; i < str.length / 2; i++) {
  128. val.push(parseInt(str.substring(0 + i * 2, 2 + i * 2), 16));
  129. }
  130. return val;
  131. }
  132. function getEncryptionKey(keyList, key) {
  133. var keyStr = '';
  134. for (var i = 0; keyList.length > i; i++) {
  135. if (keyList[i] === 1) {
  136. keyStr += key.charAt(keyList.length - i - 1);
  137. }
  138. }
  139. var keyStr = keyStr.split('').reverse().join('');
  140. return keyStr;
  141. }
  142. function contactList(list) {
  143. var contactList = [];
  144. for (var i = 0; list.length > i; i++) {
  145. contactList = contactList.concat(list[i]);
  146. }
  147. return contactList;
  148. }
  149. function mergeUint8Array(arr1, arr2) {
  150. let len1 = arr1 ? arr1.length : 0;
  151. let len2 = arr2.length;
  152. let arr = new Uint8Array(len1 + len2);
  153. for (let i = 0; i < len1; i++) {
  154. arr[i] = arr1[i];
  155. }
  156. for (let i = 0; i < len2; i++) {
  157. arr[len1 + i] = arr2[i];
  158. }
  159. return arr;
  160. }
  161. module.exports = {
  162. confirmCommand: confirmCommand,
  163. togetherCommand: togetherCommand,
  164. mergeUint8Array: mergeUint8Array
  165. };