device.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. // #ifdef APP
  2. import ecUI from '@/utils/ecUI.js'
  3. import ecBLE from '@/utils/ecBLE/ecBLE.js'
  4. // #endif
  5. // #ifdef MP
  6. const ecUI = require('@/utils/ecUI.js')
  7. const ecBLE = require('@/utils/ecBLE/ecBLE.js')
  8. // #endif
  9. const deviceTool = {
  10. //
  11. startCharge(port){
  12. let arr = [85,104,3,1,80,195,127];
  13. if(port == 2){
  14. arr = [85,104,3,2,80,195,128];
  15. }
  16. sendData(arr)
  17. },
  18. stopCharge(port){
  19. let arr = [85,105,1,1,107];
  20. if(port == 2){
  21. arr = [85,105,1,2,108];
  22. }
  23. sendData(arr)
  24. },
  25. sendPortDetailCmd(){
  26. let arr = [85,103,1,0,104];
  27. sendData(arr)
  28. },
  29. sendMainboardCmd(){
  30. let arr = [85,96,1,0];
  31. addLast(arr);
  32. sendData(arr)
  33. },
  34. restart(){
  35. let arr = [85,117,1,0,118];
  36. sendData(arr)
  37. },
  38. reset(){
  39. let arr = [85,98,1,0,99];
  40. sendData(arr)
  41. },
  42. plan(port,time){
  43. let moneyArr = decToCmd(500);
  44. let one = 0,two = 0;
  45. if(moneyArr.length == 1){
  46. one = 0;
  47. two = moneyArr[0];
  48. }else{
  49. one = moneyArr[0];
  50. two = moneyArr[1];
  51. }
  52. let first = 0,second = 0;
  53. let timeArr = decToCmd(time);
  54. if(timeArr.length == 1){
  55. first = 0;
  56. second = timeArr[0];
  57. }else{
  58. first = timeArr[0];
  59. second = timeArr[1];
  60. }
  61. let arr = [85,104,5,port,two,one,second,first];
  62. addLast(arr);
  63. sendData(arr)
  64. },
  65. cancelPlan(port){
  66. let cmdKey;
  67. if(port == 1){
  68. cmdKey = [85,115,2,1,0,118];
  69. }else if(port == 2){
  70. cmdKey = [85,115,2,2,0,119];
  71. }
  72. sendData(cmdKey);
  73. },
  74. setCurrent(current){
  75. let currentArr = decToCmd(current);
  76. let one = 0,two = 0;
  77. if(currentArr.length == 1){
  78. one = 0;
  79. two = currentArr[0];
  80. }else{
  81. one = currentArr[0];
  82. two = currentArr[1];
  83. }
  84. let arr = [85,97,19,1,8,244,1,231,3,0,208,32,7,9,5,22,8,5,one,two,1,1];
  85. addLast(arr)
  86. sendData(arr)
  87. },
  88. getPwd(){
  89. let arr = [85,172,0,172];
  90. sendData(arr)
  91. },
  92. setPwd(pwd){
  93. let arr = [85,204,6];
  94. for (let i = 0; i < pwd.length; i++) {
  95. arr.push(parseInt(pwd[i],10));
  96. }
  97. addLast(arr)
  98. sendData(arr)
  99. },
  100. getUUID(){
  101. let arr = [85,253,0,253];
  102. sendData(arr)
  103. },
  104. sendPwd(pwd){
  105. let arr = stringToHex(pwd,'a1')
  106. arr = changeArrToTen(arr);
  107. addLast(arr)
  108. sendData(arr)
  109. },
  110. sendWifi(wifi){
  111. let arr = stringToHex(wifi,'a0')
  112. arr = changeArrToTen(arr);
  113. addLast(arr)
  114. sendData(arr)
  115. },
  116. sendEnd(ok){
  117. let arr = stringToHex(ok,'a2')
  118. arr = changeArrToTen(arr);
  119. addLast(arr)
  120. sendData(arr)
  121. }
  122. }
  123. function changeArrToTen(arr){
  124. const hexArr = arr.map(str => {
  125. let num = parseInt(str,16);
  126. return num;
  127. });
  128. return hexArr;
  129. }
  130. function addLast16(arr){
  131. let total = 0;
  132. for(let i =3;i<arr.length;i++){
  133. const data =arr[i];
  134. total += parseInt(data,16);
  135. }
  136. total = total.toString(2);
  137. if(total.length>8){
  138. let valueStrLen = total.length;
  139. total = total.substring(valueStrLen-8,valueStrLen);
  140. }
  141. total = parseInt(total,2)
  142. arr.push(total);
  143. }
  144. function stringToHex(str,key) {
  145. let len = str.length;
  146. let len16 = len.toString(16).padStart(2, '0');
  147. let arr = ['55',key,len16];
  148. for (let i = 0; i < str.length; i++) {
  149. const char = str.charCodeAt(i);
  150. const hexChar = char.toString(16).padStart(2, '0');
  151. arr.push(hexChar);
  152. }
  153. return arr;
  154. }
  155. function buildWifiPwd(wifi,key){
  156. let arr = [85,key,wifi.length+1];
  157. for (let i = 0; i < wifi.length; i++) {
  158. let c = wifi.charCodeAt(i);
  159. arr.push(c);
  160. }
  161. return arr;
  162. }
  163. function addLast(arr){
  164. let total = 0;
  165. for(let i =1;i<arr.length;i++){
  166. const data =arr[i];
  167. total += data;
  168. }
  169. total = total.toString(2);
  170. if(total.length>8){
  171. let valueStrLen = total.length;
  172. total = total.substring(valueStrLen-8,valueStrLen);
  173. }
  174. total = parseInt(total,2)
  175. arr.push(total);
  176. }
  177. function sendData(arr){
  178. arr = changeArr(arr);
  179. let str = arr.join(" ");
  180. sendBlueData(str);
  181. }
  182. function changeArr(arr){
  183. const hexArr = arr.map(num => {
  184. let str = num.toString(16); // 将每个数字转换为16进制字符串
  185. if(str.length == 1){
  186. return "0"+str.toUpperCase();
  187. }else{
  188. return str.toUpperCase();
  189. }
  190. });
  191. return hexArr;
  192. }
  193. const dataParser = {
  194. /**
  195. * "data":[170,96,33,1,8,244,1,231,3,1,208,32,7,9,5,22,8,0,0,0,5,128,12,0,0,0,0,12,15,18,8,7,8,7,8,7,120]
  196. * "real_data":{"card_avail":1,"peak_price":8,"cost":500,"time_limit":999,"fee_type":1,"max_power":8400,"peak_service_price":7,"volume":9,"bottom_price":5,"botton_end":22,"bottom_start":8,"qr_id_low":0,"qr_id_middle":0,"qr_id_high":0,"bottom_service_price":5,"max_current":3200,"cp_check_off":0,"fee_show_off":0,"time1_end":12,"time2_end":15,"time3_end":18,"time1_price":8,"time1_price_service":7,"time2_price":8,"time2_sercie_price":7,"time3_price":8,"time3_service_price":7},"type":96}
  197. */
  198. mainboard:'CARD_AVAIL\n' +
  199. 'PEAK_PRICE\n' +
  200. 'COST 2\n' +
  201. 'TIME_LIMIT 2\n' +
  202. 'FEE_TYPE\n' +
  203. 'MAX_POWER 2\n' +
  204. 'PEAK_SERVICE_PRICE\n' +
  205. 'VOLUME\n' +
  206. 'BOTTOM_PRICE\n' +
  207. 'BOTTON_END\n' +
  208. 'BOTTOM_START\n' +
  209. 'QR_ID_LOW\n' +
  210. 'QR_ID_MIDDLE\n' +
  211. 'QR_ID_HIGH\n' +
  212. 'BOTTOM_SERVICE_PRICE\n' +
  213. 'MAX_CURRENT 2\n' +
  214. 'XXX\n' +
  215. 'XXX\n' +
  216. 'CP_CHECK_OFF\n' +
  217. 'FEE_SHOW_OFF\n' +
  218. 'TIME1_END\n' +
  219. 'TIME2_END\n' +
  220. 'TIME3_END\n' +
  221. 'TIME1_PRICE\n' +
  222. 'TIME1_PRICE_SERVICE\n' +
  223. 'TIME2_PRICE\n' +
  224. 'TIME2_SERCIE_PRICE\n' +
  225. 'TIME3_PRICE\n' +
  226. 'TIME3_SERVICE_PRICE',
  227. portdetail:{
  228. single:'PORT_FIRST_STATUS\n' +
  229. 'POWER 2\n' +
  230. 'ELEC 2\n' +
  231. 'MONEY 2\n' +
  232. 'TIME 2',
  233. morlsingle:'PORT_FIRST_STATUS\n' +
  234. 'POWER 2\n' +
  235. 'ELEC 2\n' +
  236. 'MONEY 2\n' +
  237. 'TIME 2\n' +
  238. 'WIRE_TEMPER\n' +
  239. 'DEV_TEMPER\n' +
  240. 'VOLTAGE',
  241. morlsingle2:'PORT_FIRST_STATUS\n' +
  242. 'POWER 2\n' +
  243. 'ELEC 2\n' +
  244. 'MONEY 2\n' +
  245. 'TIME 2\n' +
  246. 'DEV_TEMPER\n' +
  247. 'VOLTAGE' ,
  248. double:'PORT_FIRST_STATUS\n' +
  249. 'POWER 2\n' +
  250. 'ELEC 2\n' +
  251. 'MONEY 2\n' +
  252. 'TIME 2\n' +
  253. 'PORT_SECOND_STATUS\n' +
  254. 'POWER_1 2\n' +
  255. 'ELEC_1 2\n' +
  256. 'MONEY_1 2\n' +
  257. 'TIME_1 2',
  258. morldouble:'PORT_FIRST_STATUS\n' +
  259. 'POWER 2\n' +
  260. 'ELEC 2\n' +
  261. 'MONEY 2\n' +
  262. 'TIME 2\n' +
  263. 'PORT_SECOND_STATUS\n' +
  264. 'POWER_1 2\n' +
  265. 'ELEC_1 2\n' +
  266. 'MONEY_1 2\n' +
  267. 'TIME_1 2\n' +
  268. 'DEV_TEMPER\n' +
  269. 'VOLTAGE\n'
  270. }
  271. }
  272. function parseData(arr){
  273. if(!arr){
  274. return
  275. }
  276. let type = arr[1];
  277. let str = "";
  278. if(type == 96){//主板
  279. str = dataParser.mainboard;
  280. }
  281. if(type == 103){
  282. let len = arr[2];
  283. if(len == 18){
  284. str = dataParser.portdetail.double;
  285. }
  286. if(len == 9){
  287. str = dataParser.portdetail.single;
  288. }
  289. if(len == 11){
  290. str = dataParser.portdetail.morlsingle2;
  291. }
  292. if(len == 13){
  293. str = dataParser.portdetail.morlsingle;
  294. }
  295. if(len == 20){
  296. str = dataParser.portdetail.morldouble;
  297. }
  298. }
  299. let data = {};
  300. if(type == 253){
  301. data.type = type;
  302. data.real_data = parseUUID(arr);
  303. return data;
  304. }
  305. if(type == 172){
  306. data.type = type;
  307. data.real_data = parsePwd(arr);
  308. return data;
  309. }
  310. let obj = parseProp(arr,str);
  311. data.type = type;
  312. data.real_data = obj;
  313. return data;
  314. }
  315. function parseUUID(arr){
  316. let str = "";
  317. for (let i = 2; i < arr.length; i++) {
  318. let key = arr[i]+"";
  319. if(key.length == 1){
  320. key = "00"+key;
  321. }
  322. if(key.length == 2){
  323. key = "0"+key;
  324. }
  325. str = str+""+key;
  326. }
  327. return str;
  328. }
  329. function parseProp(arr,str){
  330. let obj = {};
  331. let keys = str.split("\n")
  332. let index = 3;
  333. for (let i = 0; i < keys.length; i++) {
  334. let key = keys[i];
  335. let keyProps = key.split(" ");
  336. let num = 1;
  337. if(keyProps.length == 2){
  338. num = parseInt(keyProps[1],10);
  339. }
  340. let integers = [index,index+num-1];
  341. let datas = [];
  342. for (let j = integers[0]; j <= integers[integers.length-1]; j++) {
  343. datas.push(arr[j]);
  344. }
  345. let aLong = cmdToDec(datas);
  346. let propKey = keyProps[0].toLowerCase();
  347. obj[propKey] = aLong;
  348. index+=num;
  349. }
  350. return obj;
  351. }
  352. /**
  353. * 将命令字符串转成十进制
  354. * @param cmds
  355. * @return
  356. */
  357. function cmdToDec(cmds) {
  358. if (!cmds) {
  359. return -1;
  360. }
  361. let len = cmds.length;
  362. if (len === 1) {
  363. return cmds[0];
  364. } else if (len === 2) {
  365. let first = cmds[0];
  366. let second = cmds[1];
  367. let firstStr = addZero(first.toString(2));
  368. let secondStr = addZero(second.toString(2));
  369. let allStr = secondStr + firstStr;
  370. let i = parseInt(allStr, 2);
  371. return i;
  372. } else if (len === 4) {
  373. let first = cmds[0];
  374. let second = cmds[1];
  375. let third = cmds[2];
  376. let forth = cmds[3];
  377. let firstStr = addZero(first.toString(2));
  378. let secondStr = addZero(second.toString(2));
  379. let thirdStr = addZero(third.toString(2));
  380. let forthStr = addZero(forth.toString(2));
  381. let allStr = forthStr + thirdStr + secondStr + firstStr;
  382. let i = parseInt(allStr, 2);
  383. return i;
  384. }
  385. return 0;
  386. }
  387. function sendBlueData(tempSendData){
  388. let data = tempSendData
  389. .replace(/\s*/g, '')
  390. .replace(/\n/g, '')
  391. .replace(/\r/g, '')
  392. throttle(function() {
  393. console.log("写入数据:"+data+","+new Date().toLocaleTimeString());
  394. ecBLE.writeBLECharacteristicValue(data, true)
  395. }, 100)();
  396. }
  397. /**
  398. * 二进制补0
  399. * @param value
  400. * @return
  401. */
  402. function addZero(value) {
  403. let len = value.length;
  404. if (len < 8) {
  405. for (let i = 0; i < 8 - len; i++) {
  406. value = "0" + value;
  407. }
  408. }
  409. return value;
  410. }
  411. /**
  412. * 将十进制值转成cmd格式
  413. * @param value
  414. * @return
  415. */
  416. function decToCmd(value) {
  417. let cmds = null;
  418. if (value <= 255) { //两位
  419. cmds = [value];
  420. } else if (value <= 65535) {
  421. cmds = new Array(2);
  422. let valueStr = value.toString(2);
  423. let len = valueStr.length;
  424. let lastEight = valueStr.substring(len - 8, len);
  425. let firstEight = valueStr.substring(0, len - 8);
  426. cmds[0] = parseInt(lastEight, 2);
  427. cmds[1] = parseInt(firstEight, 2);
  428. } else {
  429. cmds = new Array(4);
  430. let valueStr = value.toString(2);
  431. let len = valueStr.length;
  432. let lastEight = valueStr.substring(len - 8, len);
  433. let firstEight = valueStr.substring(len - 16, len - 8);
  434. let secondEight = valueStr.substring(len - 24, len - 16);
  435. let thirdEight = valueStr.substring(0, len - 24);
  436. cmds[0] = parseInt(lastEight, 2);
  437. cmds[1] = parseInt(firstEight, 2);
  438. cmds[2] = parseInt(secondEight, 2);
  439. cmds[3] = parseInt(thirdEight, 2);
  440. }
  441. return cmds;
  442. }
  443. //parseData([170,103,18,1,0,0,54,5,0,0,0,0,2,241,25,67,3,75,0,77,0,159])
  444. export function sendPortDetailCmd(){
  445. deviceTool.sendPortDetailCmd()
  446. return new Promise(resolve => {
  447. resolve()
  448. });
  449. }
  450. export function getMainboardConfig(){
  451. deviceTool.getMainboardConfig()
  452. return new Promise(resolve => {
  453. resolve()
  454. });
  455. }
  456. export function parseDataObj(data){
  457. data = data.trim();
  458. data = data.split(" ");
  459. console.log(data)
  460. let arr = [];
  461. for (let i = 0; i < data.length; i++) {
  462. arr.push(parseInt(data[i],16)) ;
  463. }
  464. return parseData(arr)
  465. }
  466. export function parsePwd(data){
  467. let pwd = "";
  468. for (let i = 3; i < 9; i++) {
  469. pwd = pwd+""+parseInt(data[i],16) ;
  470. }
  471. return pwd;
  472. }
  473. export function startCharge(obj){
  474. deviceTool.startCharge(obj.port);
  475. return new Promise(resolve => {
  476. resolve()
  477. });
  478. }
  479. export function planCharge(port,min){
  480. deviceTool.plan(port,min);
  481. return new Promise(resolve => {
  482. resolve()
  483. });
  484. }
  485. export function cancelPlan(port,min){
  486. deviceTool.cancelPlan(port);
  487. return new Promise(resolve => {
  488. resolve()
  489. });
  490. }
  491. export function stopCharge(obj){
  492. deviceTool.stopCharge(obj.port);
  493. return new Promise(resolve => {
  494. resolve()
  495. });
  496. }
  497. export function sendMainboardCmd(){
  498. deviceTool.sendMainboardCmd();
  499. return new Promise(resolve => {
  500. resolve()
  501. });
  502. }
  503. export function setCurrent(current){
  504. deviceTool.setCurrent(current);
  505. return new Promise(resolve => {
  506. resolve()
  507. });
  508. }
  509. export function reset(){
  510. deviceTool.reset();
  511. return new Promise(resolve => {
  512. resolve()
  513. });
  514. }
  515. export function restart(){
  516. deviceTool.restart();
  517. return new Promise(resolve => {
  518. resolve()
  519. });
  520. }
  521. export function setPwd(pwd){
  522. deviceTool.setPwd(pwd);
  523. return new Promise(resolve => {
  524. resolve()
  525. });
  526. }
  527. export function getPwd(){
  528. deviceTool.getPwd();
  529. return new Promise(resolve => {
  530. resolve()
  531. });
  532. }
  533. export function getUUID(){
  534. deviceTool.getUUID();
  535. return new Promise(resolve => {
  536. resolve()
  537. });
  538. }
  539. export function sendWifi(wifi){
  540. deviceTool.sendWifi(wifi);
  541. return new Promise(resolve => {
  542. resolve()
  543. });
  544. }
  545. export function sendEnd(end){
  546. deviceTool.sendEnd(end);
  547. return new Promise(resolve => {
  548. resolve()
  549. });
  550. }
  551. export function sendPwd(wifi){
  552. deviceTool.sendPwd(wifi);
  553. return new Promise(resolve => {
  554. resolve()
  555. });
  556. }
  557. //--------------------------------
  558. let queue = Promise.resolve();
  559. function throttle(func, delay) {
  560. return function(...args) {
  561. queue = queue.then(() => {
  562. func.apply(this, args);
  563. return new Promise(resolve => {
  564. setTimeout(resolve, delay)
  565. doResetTime(delay);
  566. });
  567. });
  568. };
  569. }
  570. // 使用方法:
  571. const myFunction = throttle(function() {
  572. console.log('这是一个调用请求'+new Date());
  573. }, 1000);
  574. let resetTimer = null;
  575. function doResetTime(delay){
  576. if(resetTimer == null){
  577. resetTimer = setTimeout(function (){
  578. console.log("reset timer"+new Date());
  579. queue = Promise.resolve();
  580. },delay);
  581. }else{
  582. clearTimeout(resetTimer);
  583. resetTimer = null;
  584. doResetTime(delay);
  585. }
  586. }
  587. //--------------
  588. function test(){
  589. let data = 'AA,67,0D,02,00,00,00,00,00,00,06,00,00,14,E7,00,77';
  590. data = data.trim();
  591. data = data.split(",");
  592. let arr = [];
  593. for (let i = 0; i < data.length; i++) {
  594. arr.push(parseInt(data[i],16)) ;
  595. }
  596. arr =[170,103,13,1,0,0,0,0,0,0,0,0,0,23,233,0,117];
  597. console.log(arr)
  598. console.log( parseData(arr))
  599. }
  600. function testQueue(){
  601. for (let i = 0; i < 10; i++) {
  602. sendBlueData(i+"");
  603. }
  604. }
  605. function testWifi(){
  606. deviceTool.sendWifi("MERCURY_D8BC8A$$")
  607. }
  608. // testWifi()